我有来自其他设备的n
,e
,d
组件,而不是OpenSSL。我想使用OpenSSL API加密和解密。但加密后解密总是失败。
我将RSA_set0_key
用于私钥(n
,e
,d
)设置,RSA_private_encrypt
正常,但RSA_public_decrypt
失败总是。我想知道它为什么会失败。
为什么RSA_public_decrypt
会失败?
答案 0 :(得分:2)
RSA_set0_key()可以使用N,E,D吗?
是。 OpenSSL手册页中记录了RSA_set0_key
。它的签名是:
int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d);
描述如下:
可以通过调用RSA_set0_key()并将n,e和d的新值作为参数传递给函数来设置n,e和d参数值。第一次在给定的RSA对象上调用此函数时,值n和e必须为非NULL。值d可以是NULL。在后续调用中,这些值中的任何一个都可以是NULL,这意味着相应的RSA字段保持不变。调用此函数会将值的内存管理传输到RSA对象,因此调用此函数后,调用者不应释放传入的值。
再往下, 返回值 :
RSA_set0_key(),RSA_set0_factors和RSA_set0_crt_params()成功时返回1,失败时返回0。
我使用RSA_set0_key进行密钥(N,E,D)设置,RSA_private_encrypt正常,但RSA_public_decrypt始终失败
很难说使用RSA_public_decrypt
时会发生什么。也许您可以添加一些代码,说明返回值是什么,并在函数失败时声明ERR_get_err
的值。
与此同时,您可能需要RSA对象拥有扩展的私钥参数,例如p
,q
,dp
,dq
和{{1 }}。这些是中国剩余定理(CRT)参数,它们设置为RSA_set0_crt_params
。另请参阅OpenSSL用户邮件列表中的Unable to decrypt without Chinese Remainder Theorem factors?。
答案 1 :(得分:0)
我找到了原因。在使用OS2IP反转键(n,d)的顺序后,它可以工作。感谢帮助。