2017-06-14 69 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; 
} 

希望这能帮助别人的未来!