破解N位RSA模数

时间:2009-05-18 11:45:47

标签: java security encryption cryptography rsa

这与我的previous post有关,我唯一的选择就是拥有一个看似相对较弱的RSA算法。让我们假设我想用36位模数(从34359738368到68719476735之间)编码35位数(从0到34359738367)。

参考http://en.wikipedia.org/wiki/RSA我可以看到我的n在34359738368到68719476735之间是随机的(形式为p-1 * q-1)。我随机选择d和e。我编码一个数字并在UI上显示。

出于争论的目的,我们假设用户可以看到多达1,000个这样的输出。他可以使用像Polla或其他任何类似的算法来破解我的d,e或n,从而开始预测新的数字吗?如果是这样有多难? (仅知道说1000套输入/输出)

作为一个例子(将6个输出视为输入/输出格式的样本),

  1. 10001621865,31116156015
  2. 10001621866,33031668326
  3. 10001621867,37351399313
  4. 10001621868,06071714212
  5. 10001621869,01188523761
  6. 10001621870,18341011998
  7. 有人能告诉我我的n,d,e是什么吗? (N介于34359738368至68719476735之间)

    我只是想知道它是多么可以破解,所以如果你能给我任何关于多长时间,多快,多少输出的信息,可以使用哪些算法等等。它会很棒。< / p>

    PS:用户没有像标准RSA算法那样看到“e”。他只能看到输入输出集。

    已添加详细信息 我试图从db向用户呈现顺序用户ID。因为它是顺序的,我不希望用户通过做一些注册来猜测另一个用户的id。为了避免这种情况,我必须将其加扰到&lt; = 12位数。围绕这一点有很多限制,在this question 中有解释。

    用户也不知道n,d和e的值。用户可以看到的最大值是一些输入输出样本(通过重复注册)

    接受Accipitridae发布的答案,因为“雅可比”算法可用于在几秒钟内解决这个问题。不知道n,e或p。

3 个答案:

答案 0 :(得分:4)

RSA容易受到选择密文攻击。也就是说,我们想要破解密文y,我们可以使用其中一个密文 - 明文对来打破密文。

如何打破它:

选择x0和y0,其中x0和y0是已提供的明文 - 密文对。

y1 = y0 * y mod n y1是给予用户满足该标准的1000个密文中的另一个。 x1是y1的解密,也是给出的,这意味着:

x1 = y1 ^ d mod n(这已经给了我们,我们已经知道了x1)

x1 =(y0 * y)^ d mod n x1 = y0 ^ d * y ^ d modnΞx0* x

x1 * x0 ^ -1 = x

x是y的解密。

这当然取决于y0 * y mod n是否产生了我们已经拥有的另一个密文,并且因为我们只有1000个这样的对使用,所以不可能但不是不可行的。你必须非常仔细地选择你的配对。

我还想补充一点,你正在使用的n的大小允许分解启发式算法很快找到n的素数因子分解。此外,RSA易受定时攻击,但很容易被挫败。

添加信息:在不知道n,d或e的情况下,根本没有提供任何信息,这意味着猜测n,d或e的组合与猜测明文一样好本身。为了找到n和e,至少有43个组合的n个猜测以及所有可能的组合。即使拥有1000个密文 - 明文对,也不容易破解n和e。

答案 1 :(得分:1)

攻击者可以猜测n和e mod(p-1)的因子p。可以通过获取消息m,计算m ^ e mod p然后与c mod p进行比较来检查每个猜测,其中c是对应的密文。由于p和e mod(p-1)每个可能是20位,这意味着该方案的安全性不大于40位。

但是40比特只是一个非常粗糙的上限。 攻击者可以做得更好。例如,他可以猜出一个因子p。然后他计算了消息和密文的雅可比符号。如果消息m是二次余数mod p,则密文必须是二次余数mod p,反之亦然。因此,如果对于消息/密文对不满足该关系,则他可以拒绝对p的猜测。或者攻击者可以计算消息和密文之间的离散对数。这为e mod(p-1)提供了更快的候选者。

这应该给出20-30位的安全级别,因此需要几秒钟才能打破。如果您将样本数量扩展到20,我可能会尝试一些基准测试。

更新:由于你没有给我20个样本来进行实验,我必须自己生成它们。使用以下样本

m = 10001621865  c = 31116156015
m = 10001621866  c = 33031668326
m = 10001621867  c = 37351399313
m = 10001621868  c = 6071714212
m = 10001621869  c = 1188523761
m = 10001621870  c = 18341011998
m = 10001621871  c = 7620400191
m = 10001621872  c = 36106912203
m = 10001621873  c = 37615263725
m = 10001621874  c = 7795237418
m = 10001621875  c = 34774459868
m = 10001621876  c = 4555747045
m = 10001621877  c = 33123599635
m = 10001621878  c = 34836418207
m = 10001621879  c = 33962453633
m = 10001621880  c = 6258371439
m = 10001621881  c = 7500991556
m = 10001621882  c = 5071836635
m = 10001621883  c = 911495880
m = 10001621884  c = 39558568485

作为输入,上述算法找到因子201821和206153  在20ms。如上所述,这不需要知道e,尽管您选择的e = 65537很容易猜到并且也可以被利用。

RSA的优势在于它基于分解大整数的难度。在这里你可以消除这个困难,剩下的就是RSA的所有弱点(即数学关系)。构建基于RSA的分组密码是一个可怕的想法。我真的不明白为什么你不想像我之前提出的那样使用Luby-Rackoff结构。

答案 2 :(得分:0)

这是一个可怕的想法,36位RSA?为什么不简单地使用块或流密码?这样你就能以更安全的方式获得1:1的映射。

我建议的替代解决方案是使用SHA哈希作为UID,并将数据库中每个用户的序号存储为单独的列。