C# 为什么两种RSA方法(.NET RSA和wiki RSA)之间存在巨大差异?
我目前正在实施RSA。我用它来加密身份证,身份证大多是这样的。e、 g.id中的A1234、A1265、B1234、B2345第一个字符为A或B,其余为数字 我正在实现链接中描述的RSA 我要做的是首先将A替换为1,B替换为2,然后将其转换为long,然后按照下面的方式进行加密和解密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
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随机数生成器输出伪随机值,但在加密方面不安全。