【问题标题】:Why there huge difference in two RSA methods(.NET RSA and wiki RSA)?为什么两种 RSA 方法(.NET RSA 和 wiki RSA)存在巨大差异?
【发布时间】:2018-02-02 08:01:27
【问题描述】:

我目前正在实施 RSA。我正在使用它来加密 id。而id大多是这样的。例如A1234、A1265、B1234、B2345(在 id 中,第一个字符是 A 或 B,remaing 是数字)。

我正在实现this 链接中描述的 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

我不明白为什么这两者有很大的不同。 是不是我的方法做错了(我的方法有什么漏洞)?

我想要快速的加密解密方法。所以我实施的是正确的,否则我的方法有可能发生冲突。或者我必须使用其他非常快的加密和解密方法。

【问题讨论】:

  • 从您的方法输出中,您要么打错字,要么不工作
  • 请注意,系统库可能正在使用填充。类似于 Wikipedia 上的描述的“教科书”RSA完全不安全
  • 为了进行比较,您需要显示您已计时的 .NET RSA 代码。

标签: c# .net encryption cryptography


【解决方案1】:

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

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

所以是的,它更慢。但话又说回来,它提供了一个有意义的 RSA 实现,而你却没有(当然,除了提供学习体验)。

【讨论】:

  • 我是说 direct long 计算,因为您可以使用 long 来实现 BigInteger。显然,通用 CPU 可以进行任何可能的计算 - 您可以使用 8 位 CPU 进行 RSA 8192 位计算,尽管 非常慢
  • 如此处所述en.wikipedia.org/wiki/RSA_(cryptosystem)#Operation,我取了一个 e(公钥),d(一个私钥)并派生了其他属性,只要我的 id 不超过 n(比如说 9999999999)每次加密时我都会获得唯一的价值(对于不同的 id)。那么有没有可能我实现的东西是错误的?
  • 定义错误。如果正确实施,它可能会坚持 RSA 问题。它可以很容易地解密,因为分解很容易做到。 RSA 问题在计算上很困难,但要产生任何影响,素数 p 和 q 应该是大约 512 位或更高。解决数独问题在计算上也很困难(也许你没有预料到),但我的数独问题求解器可以在 0.2 秒内解决 任何 9x9 数独问题,而这只是 Java 虚拟机的启动时间。数独必须有更大的尺寸才能解决它。
  • 或者换一种说法:密码学可以用来帮助保护系统;应用程序功能并没有告诉我们所提供的安全性。输出看起来是随机的也不能告诉我们任何事情。 Mersenne twister 随机数生成器输出伪随机值,但它在密码学上并不安全。
猜你喜欢
  • 2015-03-27
  • 2015-02-27
  • 2011-02-19
  • 2011-03-10
  • 2019-04-26
  • 2018-03-07
  • 2015-07-20
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多