algorithm - RSA加密安全

标签 algorithm encryption rsa

我对 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/

相关文章:

c# - 在 C# 中使用 RS256(非对称)验证 JWT

python - 如何验证一个洗牌算法是否均匀?

algorithm - 用固定常数执行整数硬件除法的最快方法是什么?

algorithm - 回溯中是否有 do -> recurse -> undo 模式的名称?

c - 在 vi 上输入 diff 命令时文件末尾没有换行符

c# - 如何在 C# 中将字符串转换为位

ssl - 是否可以根据客户端浏览器使用或协商不同的 SSL 证书

algorithm - 具有快速排序插入、排序删除和查找的数据结构

openssl - 从公钥文本生成 PEM 或 CER 文件

c++ - 不同消息的 OpenSSL 签名长度不同