2017-06-14 67 views
0

我試圖實現的功能使用OpenSSL的簽署文件,我需要激活填充。我的簽名功能如下:激活填充和鹽

unsigned char * sign(EVP_PKEY * pkey, const EVP_MD * htype, char * data, int data_len, int * sig_len) 
{ 
    EVP_MD_CTX  md_ctx; 
    unsigned char *sig = malloc(EVP_PKEY_size(pkey)); 


    *sig_len = EVP_PKEY_size(pkey); 

    EVP_SignInit (&md_ctx, htype); 
    EVP_SignUpdate (&md_ctx, data, data_len); 

    if (EVP_SignFinal (&md_ctx, sig, sig_len, pkey) != 1) 
    { 
     free(sig); 
     sig = 0; 
     *sig_len = 0; 

     ERR_print_errors_fp(stderr); 
    } 

    return sig; 
} 

有如何添加填充和鹽任何的例子嗎? 有沒有人有任何想法可以幫助解決這個問題?

+0

另請參閱OpenSSL wiki上的[EVP簽名和驗證](https://wiki.openssl.org/index.php/EVP_Signing_and_Verifying)。 – jww

+0

簽名不需要鹽作爲輸入。 PSS不是確定性的,所以它需要隨機值來操作,那是什麼意思?填充是在RSA的模冪運算之前執行的,它不是您需要編碼的東西。隨機化和填充均由簽名算法在內部執行。對我而言,你完全不清楚你想達到什麼,但也許這是因爲[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

+0

嗨馬爾滕, 感謝您的答案。我不知道[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。我的問題X是我想用填充和鹽來實現RSA簽名。我的解決方案Y是我發佈的代碼,僅實現RSA(whitout填充和鹽)。正如你所說的「填充是由簽名算法內部執行的」,所以我正在尋找可以通過的選項,以便RSA與填充和鹽一起計算。我剛剛找到解決方案並將其發佈。 – user2427860

回答

0

我剛剛發現在OpenSSL論壇解決方案:

unsigned char * signData(EVP_PKEY * pkey, const EVP_MD * htype, char * data, int data_len, int * sig_len, int padding, int salt) 
{ 
    unsigned int signature_l; 
    unsigned char signature[512]; 
    int res; 
    EVP_MD_CTX* verif_ctx = EVP_MD_CTX_create(); 
    EVP_MD_CTX* md_ctx = EVP_MD_CTX_create(); 
    EVP_PKEY_CTX* keygen_ctx = EVP_PKEY_CTX_new(pkey, NULL); 
    /* signing */ 
    if (EVP_DigestSignInit(md_ctx, &keygen_ctx, EVP_sha512(), NULL, pkey)<1) 
     return 0; 
    if (EVP_PKEY_CTX_set_rsa_padding(keygen_ctx, padding)<1) 
     return 0; 
    if (EVP_PKEY_CTX_set_rsa_pss_saltlen(keygen_ctx, salt)<1) 
     return 0; 
    signature_l = EVP_PKEY_size(pkey); 

    if (EVP_DigestSignUpdate(md_ctx, data, data_len)<1) return 0; 
    if (EVP_DigestSignFinal(md_ctx, signature, &signature_l)<1) return 0; 
    /* verifying */  
    if (EVP_DigestVerifyInit(verif_ctx, &keygen_ctx, EVP_sha512(), NULL, pkey)<1) 
     return 0; 
    if (EVP_PKEY_CTX_set_rsa_padding(verif_ctx->pctx, padding)<1) 
     return 0; 
    if (EVP_PKEY_CTX_set_rsa_pss_saltlen(verif_ctx->pctx, salt)<1) 
     return 0; 
    if (EVP_DigestVerifyUpdate(verif_ctx, data, data_len)<1) 
     return 0; 
    res = EVP_DigestVerifyFinal(verif_ctx, signature, signature_l); 
    switch(res) 
    { 
    case 1:printf("sig checks out!\n"); 
     break; 
    case 0:printf("nope nope nope.\n"); break; 
    default: return 0; 
    } 
    return signature; 
} 

希望這能幫助別人的未來!