c - 如何仅使用模数和私钥指数 (d) 进行 RSA 签名?

标签 c openssl cryptography rsa

我正在尝试仅使用 (n) 和 (d) 来执行私钥操作,例如 RSA 签名。 我的系统公开了一个仅 (n) 和 (d) 输入的 API,遗憾的是我无法更改 API 本身。

由于我使用的是最新的 OpenSSL 版本,因此我必须使用 setter:RSA_set0_key,它要求提供 (n) 和 (e),无论使用给定的操作如何进行RSA(在我的例子中是私钥操作)

所以我的问题是:

我可以仅使用 (n) 和 (d) 执行 RSA 签名操作吗? 我不想猜测公共(public)指数,并且在此过程中我无法收到它。

如果答案是否定的。 我可以使用任意素数作为 RSA_set0_key 的 (e) 吗? EVP/rsa_sign 函数是否会验证公共(public)指数与私有(private)指数兼容?

谢谢

最佳答案

严格来说,如果您只知道一个指数(d 或 e)和模数(n),那么在不知道模数因子的情况下,您无法轻松找到反指数(e 或 d)——这就是 RSA 的原因是安全的。

但是,大多数 RSA 实现都使用 e 的固定指数——通常为 65537 (0x10001),因此您实际上只需要知道 n。

现在你的问题有点奇怪,因为 RSA 签名只使用 N 和 D ——你需要 E 来验证签名。 RSA_get0_key 为您提供来自 RSA key 对象的 N、D 和 E。也许您的意思是 RSA_set0_key ,它用于将值放入 RSA key 对象中?这只需要您提供 N,但如果您未设置 E,您将无法验证签名或加密数据。只要你设置了D(和N),你应该就可以生成签名了。

关于c - 如何仅使用模数和私钥指数 (d) 进行 RSA 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44392129/

相关文章:

java - 在 JSch 中使用 2048 位素数

c - *.hxx 中声明的 void 函数,在 *.cxx 中定义但在 *.c 中未定义

ubuntu - CURL 返回 (35) OpenSSL SSL_connect : SSL_ERROR_SYSCALL

c++ - 在 MPI 中使用循环

c - Openssl RSA在C中加密和解密

java - Runtime.getRuntime().exec() 导致 java.io.IOException : Cannot run program . .. 没有这样的文件或目录

java - 为什么 Cryptoki.C_OpenSession 有时会与 HSM 断开连接

java - 如何使用openssl模拟Java Signature签名方式?

c - 合并排序中的不合理错误

c - 如何在 C 中将 128 位整数转换为十进制 ascii 字符串?