好的,所以我想我可能在……某事上发现了一个缺陷。老实说我不知道。这是一个多么奇怪的场景。
我试图破解非常小的非对称 (RSA) 加密,就像我的一个朋友的概念证明项目一样。对于那些不太了解 RSA 的人,我将在这里介绍一些重要的事实。如果您已经了解 RSA,请跳过以下段落:
RSA 是一种非对称加密算法(也称为公钥/私钥密码术)。这意味着有 2 个密钥:公共和私有。任何一个都可以用来加密,但只有另一个密钥才能解密。所以如果我用私钥加密一个小文本文件,只有公钥可以解密它。这在密钥交换中很有用。这是通过使用称为素数分解的数学原理来实现的(将两个素数相乘很容易,但从乘积中分解出原始的 2 个素数却很困难)。所以想象一下你的公钥可以加密,但只有你的私钥可以解密。你的私钥有 2 个质数,你的公钥有这 2 个质数的乘积(模数)。有人能够解密使用公钥加密的数据的唯一方法是将模数分解为 2 个素数并对私钥进行逆向工程。这就是我试图做的,但规模很小。
是的,所以质因数分解!那就是我正在做的。我生成了一个 128 位 RSA 密钥(就非对称加密而言很小,特别是考虑到我的笔记本电脑中的 2GHz 处理器在一秒钟内将其分解)。我提取了模数,并在将其从十六进制转换为十进制时使用了不正确的命令(使用 bc 时忘记选择 ibase),结果为 97964999429910939982995739699617。然后我使用了因子命令。
这就是事情变得时髦的地方。
当我考虑它时,我得到了8 个答案,而不是我期望的 2 个。
97964999429910939982995739699617:3 3 3 17 433 613 937 858164002128703934431
现在想想,我明白为什么我没有得到 2 个答案:这不是 RSA 密钥对的真正模数。但这不是我发现的“错误”(否则你不会读到这个)。
为了仔细检查,我决定将这些数字相乘以再次获得模数。
我使用了命令
回声 $((3*3*3*17*433*613*937*858164002128703934431))
好吧,这肯定会导致再次开始编号,对吗?没有理由不应该是 97964999429910939982995739699617。
好吧,这就是我的思路,直到我得到答案 -8628928582186374751。
我完全不知道为什么这个命令会返回一个如此明显错误的答案。它怎么可能是负面的?这是本机数学函数中的故障吗?factor 命令是正确的,我知道这是肯定的,因为当我尝试使用真实的物理计算器 (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 Fri Mar …