用于 RSA 解密C++的私钥
Private key for RSA decryption C++
我尝试编写一个函数来使用扩展欧几里得算法查找 RSA 的私钥,我找不到错误,但我真的不想从头开始!对于某些值,它是正确的,但对于其他值则不是,我无法弄清楚为什么,我真的很感激你的帮助,如果这个问题太模糊,我很抱歉(我知道这往往会惹恼这里的人们)。任何人都可以找到错误吗?提前非常感谢您:
unsigned long long int modinv(unsigned long long int u, unsigned long long int v)
{
unsigned long long int inv, u1, u3, v1, v3, t1, t3, q;
unsigned long long int iter;
u1 = 1;
u3 = u;
v1 = 0;
v3 = v;
iter = 1;
while (v3 != 0)
{
q = u3 / v3;
t3 = u3 % v3;
t1 = u1 + q * v1;
u1 = v1; v1 = t1; u3 = v3; v3 = t3;
iter = -iter;
}
if (u3 != 1)
return 0;
if (iter < 0)
inv = v - u1;
else
inv = u1;
return inv;
}
不要在此处使用无符号值,因为它会使算法无效。因此,您可以使用long long int
而不是unsigned long long int
。另请注意,使用无符号值时,iter = -iter
将无法按预期工作,因为它会下溢。假设你有iter = 1
那么-iter
不会-1
而是18446744073709551615
(=2^64 - 1)。对iter < 0
的检查也永远是错误的。
对于任何现实生活中的应用程序,您将需要比 64 位类型大得多的数字。有很多方法可以做到这一点,但GMP(GNU多精度库)有mpz_powm(r, base, exp, mod)
,你可以在解密阶段使用。更多信息在这里。
所以基本上,如果你有你的密文c
和你的私钥定义为n
(=p*q)和d
那么你就可以c
解密为明文m
如下:
#include <gmp.h> // requires GMP lib to be installed.
void rsaDecrypt(const mpz_t c, const mpz_t n, const mpz_t d, mpz_t m) {
mpz_init(m);
mpz_powm(m, c, d, n); // m = c^d (mod n)
}
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何在C++中使用X509证书模在令牌中查找私钥
- 私钥解密代码使用公共接口说明符到 BSAFE 库 v6.0?
- 从字符串 Crypto++ 导入 RSA 公钥/私钥
- 将私钥和证书存储在C++/OpenSSL中
- 区块链超级账本私钥错误
- 博坦加载现有的 RSA 私钥
- C 从XML导入CAPI/CNG中的RSA私钥
- 使用密码将 RSA 私钥写入 PEM 文件
- 一代 RSA-2048 密钥(公钥和私钥)
- 如何获取PCCERT_CONTEXT私钥的NCRYPT_KEY_HANDLE?
- 将ECDSA Keypair的公共和私钥分开
- RSA 私钥加密 QT C++
- 在 SSH 上的公钥-私钥身份验证上的 libcurl 实现
- 使用 openssl libcrypto 解密具有 RSA 私钥的数据时RSA_NO_PADDING的使用
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- OpenSSL AES_CFB128_ENCRYPT公共/私钥C
- 如何通过PKCS#11 API从电子令牌获取私钥
- 使用 OpenSSL 生成私钥
- 在 GnuPG 中从 C/C++ 和参数生成公钥/私钥