C# 为什么两种RSA方法(.NET RSA和wiki RSA)之间存在巨大差异?

C# 为什么两种RSA方法(.NET RSA和wiki RSA)之间存在巨大差异?,c#,.net,encryption,cryptography,C#,.net,Encryption,Cryptography,我目前正在实施RSA。我用它来加密身份证,身份证大多是这样的。e、 g.id中的A1234、A1265、B1234、B2345第一个字符为A或B,其余为数字 我正在实现链接中描述的RSA 我要做的是首先将A替换为1,B替换为2,然后将其转换为long,然后按照下面的方式进行加密和解密 private long Encr(string id) { long y = Convert.ToInt64(id.Replace("A", "1").Replace("B", "2")); re

我目前正在实施RSA。我用它来加密身份证,身份证大多是这样的。e、 g.id中的A1234、A1265、B1234、B2345第一个字符为A或B,其余为数字

我正在实现链接中描述的RSA

我要做的是首先将A替换为1,B替换为2,然后将其转换为long,然后按照下面的方式进行加密和解密

private long Encr(string id)
{
    long y = Convert.ToInt64(id.Replace("A", "1").Replace("B", "2"));
    return power2(y, e, mod); // e is public key which is number(long)
}

private string Decr(long y)
{
    var x= power2(y, d, mod).ToString();  // d is private key which is number(long)
    if (x.Substring(0, 1) == "1")
        return "A" + x.Substring(1);
    if (x.Substring(0, 1) == "2")
        return "B" + x.Substring(1);
    return "null";
}

private long power2(long x, long y, long n)
{
    long temp = 1;
    while (y > 0)
    {
        var z = y & 1;
        if (z == 1)
        {
            temp = ((temp % n) * (x % n)) % n;
        }

        x = ((x % n) * (x % n)) % n;

        y = y >> 1;
    }
    return temp;
}
我还使用了.NET提供的RSA。我对我实现的方法和.NET提供的方法的结果感到惊讶。 结果是这样的

id      |     My Method                        |    .NET RSA
--------|--------------------------------------|-------------
A1234   |Encryption:-time=0.0000017 s          |Encryption:- time=0.0001047 s
        |            value=56485               |             value=0aR+BrYbO8eMFaQQz12QMw==
        |Decryption:-time=0.0000117 s          |Decryption:- time=0.0001132 s
        |            value=11234               |             value=A1234
我不知道为什么这两者有很大的区别。我的方法是否有问题?我的方法是否有漏洞


我想要快速的加密解密方法。所以我所实现的是正确的,或者在我的方法中存在冲突的可能性。或者我必须使用其他非常快的加密和解密方法。

您无法使用直接长计算为任何有意义的密钥大小编程RSA。RSA适用于大约1024位或更高的密钥大小。任何低于512的密钥都会被破坏,如果幸运的话,您的RSA只能处理64位的密钥大小

因此.NET实现将使用BigInteger值。它还可能提供针对侧通道攻击的保护。为了安全起见,它还应该执行正确的填充-尽管从输出来看,它目前没有


所以,是的,它比较慢。但同样,它提供了一个有意义的RSA实现,当然,除了提供学习体验之外,您不需要这样做。

从您的方法输出中,您要么输入了一个错误,要么输入不起作用。请注意,系统库可能正在使用填充。像维基百科上描述的教科书RSA是完全不安全的。为了进行比较,你需要显示你计时的.NET RSA代码。我说的是直接长计算,因为你可以使用长来实现BigInteger。显然,通用CPU可以进行任何可能的计算-您可以使用8位CPU进行RSA 8192位计算,尽管速度非常慢。如本文所述,我使用了一个epublic密钥,完成私钥和派生的其他属性,只要我的id没有交叉,比如说9999999999,我每次都会为不同id的加密获取唯一值。那么我实现的有没有可能是错误的?定义错误。如果实现正确,它可能会遇到RSA问题。它可以被简单地解密,因为分解很容易。RSA问题在计算上是困难的,但要使其产生任何影响,素数p和q应该是512位或更高。解数独在计算上也很难,也许你没想到,但我的数独解算器能在0.2秒内解出任何9x9数独,而这只是Java虚拟机的启动时间。数独游戏必须有更大的维度才能很难解决。或者换一种说法:密码学可以用来帮助保护系统;一个应用程序函数不能告诉我们所提供的安全性。输出看起来是随机的也不能告诉我们任何事情。Mersenne twister随机数生成器输出伪随机值,但在加密方面不安全。