【问题标题】:RSA_public_decrypt fails when using RSA_set0_key(key, n,e,d)?使用 RSA_set0_key(key, n,e,d) 时 RSA_public_decrypt 失败?
【发布时间】:2017-07-07 09:26:32
【问题描述】:

我有来自其他设备的ned 组件,而不是 OpenSSL。我想使用 OpenSSL API 进行加密和解密。但是加密后解密总是失败。

我将RSA_set0_key 用于私钥(ned)设置,RSA_private_encrypt 可以,但RSA_public_decrypt 总是失败。我想知道为什么它会失败。

为什么RSA_public_decrypt 会失败?

【问题讨论】:

  • 失败怎么办?你的代码在哪里?错误信息在哪里?
  • 注意 'private_encrypt' 和 'public_decrypt' 实际上是签名而不是加密,并且(如文档所示)不是标准的;这些名称是 1990 年代的误导性历史遗迹。也就是说,它在 1.1.0 中适用于我,而明显的变体设置 n,e,d 直接适用于 1.0.2 1.0.1 1.0.0 和 0.9.8。麦克维?

标签: encryption openssl cryptography rsa private-key


【解决方案1】:

RSA_set0_key() 可以使用 N、E、D 吗?

是的。 RSA_set0_key 记录在 OpenSSL 手册页中。它的签名是:

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 进行 key(N, E, D) 设置,RSA_private_encrypt 是可以的,但 RSA_public_decrypt 总是失败

很难说您使用RSA_public_decrypt 发生了什么。也许你可以添加一些代码,说明返回值是什么,并在函数失败时说明ERR_get_err的值。

与此同时,您可能需要 RSA 对象具有扩展的私钥参数,例如 pqdpdqqInv。这些是中国剩余定理 (CRT) 参数,它们使用RSA_set0_crt_params 设置。另请参阅 OpenSSL 用户邮件列表中的 Unable to decrypt without Chinese Remainder Theorem factors?

【讨论】:

  • OpenSSL 可以仅使用 d 进行 RSA 私钥操作,尽管效率较低。您链接的邮件清楚地解释了问题在于读取非 CRT 密钥(来自 PEM),而不是使用内存中正确的密钥。
【解决方案2】:

我找到了原因。使用 OS2IP 反转键 (n, d) 的顺序后,它就可以工作了。感谢帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2019-09-03
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2015-06-10
    相关资源
    最近更新 更多