我对 RSA 安全性有点困惑。 我一直在谷歌搜索 rsa 算法并找到了很多,但它们的 key 似乎一直都是小数字。
这是迄今为止我发现的最简单的算法:
void RSAEncDec(BYTE* pBuff, int iLen)
{
for (long i = 0; i < iLen; i++)
{
pBuff[i] = (long)pow(pBuff[i], key) % modl;
}
}
使用 key 生成算法:
rsacrypto::rsacrypto()
{
long p1,p2; //Prime numbers
long n = 0; //Modulus
long phi =0; //Totient value.
long e = 0; //Public key exponent.
long d = 0; //Private key exponent.
p1 = genrndprimes(100,900);
Sleep(1000);
p1 = genrndprimes(100,900);
n = p1*p2;
phi = totient(n);
e = genrndnum(2,(phi-1));
while(gcd(e,phi)!=1)
{
e = genrndnum(2,(phi-1));
}
d = (1/e)%phi; //Modular Multiplicative Inverse.
privatekey = e;
publickey = d;
modl = n;
}
我担心“genrndprimes(100,900)”,900 之间的 100 是一个小数字,而我了解到 key 大小需要超过 512 位,超过 900。 我这里有什么问题吗?
非常感谢。
最佳答案
这根本不安全,而且可以很快被暴力破解。从公钥中找到私钥最多需要 900 次除法(假设 genrndprimes
采用实际的最小值和最大值而不是位数)。所以这将花费不到一秒钟的时间。
您需要编写自己的多精度代码或简单地使用现有代码(如 GMP)。然后你可以代表大整数。今天,n 的良好起始值是 2048 位整数。
此外,模乘逆运算并不是真正的除法运算,因为不可能有任何分数。一切都必须用模运算来完成。模乘逆需要例如使用扩展欧几里得算法来找到它。
但要使 RSA 在现实世界中真正可用,您还需要实现填充方案,例如 PKCS#1 v2.0 (OAEP)。
然后,如果您想加密大于 n 的数据,则需要研究混合加密(还必须考虑填充)。在这种情况下,您将生成一个随机 AES key ,使用 AES 加密您的数据,然后使用 RSA 加密生成的 AES key ,因为 AES key 足够小,可以加密。
完成所有这些后,您会发现您的代码存在错误并且容易受到各种边信道攻击。您将使用您最喜欢的搜索引擎来查找一个现有的广为人知且经过测试的库,它可以为您完成所有这些工作,因为永远不要推出自己的加密货币。
关于algorithm - RSA加密安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28643730/