这与我的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个输出视为输入/输出格式的样本),
有人能告诉我我的n,d,e是什么吗? (N介于34359738368至68719476735之间)
我只是想知道它是多么可以破解,所以如果你能给我任何关于多长时间,多快,多少输出的信息,可以使用哪些算法等等。它会很棒。< / p>
PS:用户没有像标准RSA算法那样看到“e”。他只能看到输入输出集。
已添加详细信息 我试图从db向用户呈现顺序用户ID。因为它是顺序的,我不希望用户通过做一些注册来猜测另一个用户的id。为了避免这种情况,我必须将其加扰到&lt; = 12位数。围绕这一点有很多限制,在this question 中有解释。
用户也不知道n,d和e的值。用户可以看到的最大值是一些输入输出样本(通过重复注册)
接受Accipitridae发布的答案,因为“雅可比”算法可用于在几秒钟内解决这个问题。不知道n,e或p。
答案 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,并将数据库中每个用户的序号存储为单独的列。