使用RSA_PKCS1_OAEP_PADDING进行RSA签名

时间:2014-03-12 06:58:53

标签: c openssl rsa digital-signature

以前我使用rsa签名没有填充,但现在我被要求添加PKCS1_OAEP填充,最初我尝试简单地添加此标志&#34; RSA_PKCS1_OAEP_PADDING&#34;,但它在运行时提供错误代码< / p>

error:04066076:rsa routines:RSA_EAY_PRIVATE_ENCRYPT:unknown padding type

此外,我用PKCS1_OAEP填充搜索了rsa签名,但没有得到任何东西,除了说实现RSA_PKCS1_OAEP填充你必须使用这个

int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen,
           unsigned char *f, int fl, unsigned char *p, int pl);

然后使用RSA_NO_padding进行private_encrypt,但仍然有困惑,因为他们没有明确解释如何明确地使用这个padding_add函数。可以任何人提供帮助。真的很感激。

提前致谢

1 个答案:

答案 0 :(得分:4)

根据RFC 3447 OAEP填充方案只能用于加密操作,因此不能与签名一起使用。如果标准的RSASSA-PKCS1-v1_5方案不够好,我相信你应该使用推荐用于新应用的RSASSA-PSS,其特性与OAEP方案类似。有关详细信息,请参阅RFC 3447

您可以使用命令行OpenSSL工具轻松检查我的答案是否正确:

  1. 生成私钥:

    openssl genrsa -out private.key 2048
    
  2. 生成一些输入数据:

    echo "Hello world" > input.data
    
  3. 尝试使用OAEP方案生成签名:

    openssl rsautl -sign -oaep -inkey private.key -in input.data -out output.data
    RSA operation error
    139655304349344:error:04066076:rsa routines:RSA_EAY_PRIVATE_ENCRYPT:unknown padding type:rsa_eay.c:389:
    
  4. 尝试使用OAEP方案加密数据:

    openssl rsautl -encrypt -oaep -inkey private.key -in input.data -out output.data
    
  5. 如果您需要更多信息,还可以查看"rsautl" module source code,但请记住RFC 3347是您的朋友:)