为什么 Factor 命令在 RSA 模数上产生无意义的结果?

为什么 Factor 命令在 RSA 模数上产生无意义的结果?

好吧,所以我想我可能发现了……某件事上的缺陷。老实说我不知道​​。这是一个非常奇怪的场景。

我试图破解非常小的非对称(RSA)加密,就像我的一位朋友的概念验证项目一样。对于那些对 RSA 不太了解的人,我将在这里回顾一下重要的事实。如果您已经了解 RSA,请跳过以下段落:

RSA 是一种非对称加密算法(也称为公钥/私钥密码术)。这意味着有 2 个密钥:公钥和私钥。任何一个都可以用于加密,但只有另一个密钥可以解密。因此,如果我使用私钥加密一个小文本文件,则只有公钥可以解密它。这在密钥交换中很有用。这是通过使用称为质因数分解的数学原理来实现的(事实上,将两个质数相乘很容易,但从乘积中分解出原始的 2 个质数却很困难)。因此,想象一下您的公钥可以加密,但只有您的私钥可以解密。您的私钥包含 2 个素数,您的公钥包含这 2 个素数的乘积(模数)。某人能够解密使用公钥加密的数据的唯一方法是将模数分解回 2 个素数并对私钥进行逆向工程。这就是我试图做的事情,但规模很小。

对了,所以素因数分解!这就是我正在做的事情。我生成了一个 128 位 RSA 密钥(就非对称加密而言很小,特别是考虑到我的笔记本电脑中的 2GHz 处理器在一秒内就将其计算在内)。我提取了模数,并在将其从十六进制转换为十进制时使用了不正确的命令(使用 bc 时忘记选择 ibase),结果是 97964999429910939982995739699617。然后我使用了 Factor 命令。

这就是事情变得有趣的地方。

当我分解它时,我得到了8答案而不仅仅是我期待的 2 个。

97964999429910939982995739699617:3 3 3 17 433 613 937 858164002128703934431

现在想想,我明白了为什么我没有得到 2 个答案:这不是 RSA 密钥对的真正模数。但这不是我发现的“错误”(否则你不会读这篇文章)。

为了再次检查,我决定将这些数字相乘以再次得到模数。

我使用了命令

回声 $((3*3*3*17*433*613*937*858164002128703934431))

好吧,这肯定会再次产生起始数字,对吧?没有理由不应该是 97964999429910939982995739699617。

嗯,这就是我的思路,直到我得到答案-8628928582186374751。

我完全不知道为什么这个命令会返回如此明显错误的答案。它怎么可能是负数呢?这是本地数学函数中的一个故障吗?因子命令是正确的,我知道这一点是肯定的,因为当我尝试使用真实的物理计算器(TI-84)时,它确实返回了我最初分解的值。

我首先在我的笔记本电脑上尝试了这个命令(运行 Kali Linux)。命令“uname -rvo”告诉我“4.3.0-kali1-amd64 #1 SMP Debian 4.3.3-5kali4 (2016-01-13) GNU/Linux ”)。然后我远程连接到我高中的 Gentoo 服务器并运行相同的命令。同样,显然无效的答案。 Uname 说“4.1.15-gentoo-r1 #2 SMP 3 月 11 日星期五 15:12:48 CST 2016 GNU/Linux”

这是什么?

答案1

你只是溢出了 shell 的整数运算:

echo $(( 65536 * 65536 * 65536 * 32768 - 1 ))
9223372036854775807
echo $(( 65536 * 65536 * 65536 * 32768 ))
-9223372036854775808

您可以使用任意精度的工具,bc例如

bc
3*3*3*17*433*613*937*858164002128703934431
97964999429910939982995739699617

或者

echo '3*3*3*17*433*613*937*858164002128703934431' | bc
97964999429910939982995739699617

相关内容