几天前有人在Reddit上发布了一篇文章,除了返回同一页面的链接外,我对它的了解不多。

对于简短的摘要,从本质上讲,可以引入一个RSA密钥生成过程中的后门。例如,生成后门RSA-1024密钥。 (假设$ \ text {getPrime}(x)$将返回一个随机的$ x $位素数)

\ begin {align}
A&= \ text {genPrime}( 384)\\
P ^ \ prime&= \ text {genPrime}(128)\\
Q ^ \ prime&= \ text {genPrime}(128)\\
P& = Ak_1 + P ^ \ prime
\ end {align}

其中$ k_1 $递增直到$ P $为素数,从$ k_1 = P ^ \ prime $开始。

\开始{align}
Q = Ak_2 + Q ^ \ prime
\ end {align}

$ k_2 $的计算方法与$ Q类似^ \ prime $。
然后$ P $和$ Q $用作其余密钥生成算法的素数,而$ A $保留作为后门密钥。可以根据可预测的每用户值(例如MAC地址或用户ID)生成$ A $。

要使用后门,攻击者(在本例中为开发人员)将使用与最初计算(或仅在数据库中查找)相同的方式重新计算$ A $,然后计算$ N ^ \ prime = N \ mod A $,然后将$ N ^ \ prime $分解为$ P ^ \ prime $和$ Q ^ \ prime $。这将需要考虑分解256位数字的复杂性,这在大多数与实施后门相关的组织中都是可以实现的。然后可以使用$ P ^ \ prime $和$ Q ^ \ prime $以与上述相同的方式计算$ P $和$ Q $,从而生成整个私钥。

是否有关于此的更多信息?可能的攻击? (在$ A $泄漏的情况下,除了显而易见的那个),考虑到它将密钥空间从1024位降低到256位,这似乎会降低RSA的安全性,这似乎很直观,但是我不知道如何可以在不知道$ A $的情况下被破坏。

评论

我建议对两个$ k $ s使用两个不同的符号,因为它们不指向相同的值。

@orlp我编辑了帖子以使用$ k_1 $和$ k_2 $,谢谢您的建议。

@fgrieu这里有两个不同的键空间。一个假定一个具有$ A $知识的代理,另一个假定不具有$ A $的知识。大概,如果您知道$ A $,则密钥空间为$ 256 $位。

@poncho这里有一个误会。我的意思是,从纯粹的理论角度来看,每个用户有$ 2 ^ {256} $个可能的密钥(因为$ A $的值是固定的,每个用户)小于正常RSA的$ 2 ^ {1024} $。我不确定这将给后门软件开发人员以外的其他攻击者带来什么好处,但这就是为什么我将其发布在这里。我正在尝试查看是否已对此进行了实际的工作,或者是否只是在上个星期二的某个人头上创建的。

我在这里有关于使用C#代码的RSA后门的文章:kukuruku.co/hub/infosec/backdoor-in-a-public-rsa-key

#1 楼

实际上,如果RSA密钥生成是恶意的,则还有其他更微妙的方法可以使人泄漏密钥。

我见过的最聪明的方法是这样的(假设我们正在生成一个RSA-1024密钥;对于RSA-2048,我们只使用较大的曲线):


攻击者生成EC公钥/私钥对;对RSA-1024使用192位的曲线很好。他对EC私钥保密;他将在下面的程序中安装EC公钥。
要生成密钥,程序将选择一个随机的192位种子$ R $。
它使用该种子查看选择随机变量的过程。 512位素数$ P $。
使用EC公共值(也许使用EC-ElGamal)对种子$ R $进行加密,生成384位值$ E $。
然后选择512位素数$ P $。约束$ Q \ equiv P ^ {-1}(2E + 1)\ pmod {2 ^ {385}} $
素数$ Q $的乘积$ PQ $是RSA模数(其余的RSA密钥对通常是生成的)

然后,攻击者可以轻松地分解此RSA密钥(通过使用EC私钥直接从RSA模数的位模式中提取$ E $)解密产生$ R $,然后使用R恢复$ P $。而且,即使没有EC私钥的人也没有优势,即使他们知道用于生成RSA密钥的确切过程;也都是$ P $和$ Q $的选择是公平的,并且$ Q $的附加约束根本无法帮助攻击者。 br />
这个故事的寓意:如果攻击者可以控制您的RSA密钥生成过程,则您可能没有安全性。

评论


$ \ begingroup $
虽然这当然是一个明智的替代方案,但我认为这不能回答问题。它并没有为上述方案提供更多启示。
$ \ endgroup $
–orlp
16年1月24日在23:06

$ \ begingroup $
@orlp:我知道。我试图提出一个论点,即OP的方案可证明是安全的,因为在很大一部分随机$ P中,Q $值具有一些满足上述条件的384位值$ A $。 las,事实并非如此。我能说的最好的是“它似乎并没有帮助已知的分解方法”;我不能说我对那句话很满意
$ \ endgroup $
–雨披
16年1月24日在23:24

$ \ begingroup $
您描述的后门是可检测到的(压缩ECC点可与随机数据区分开),但是经过细微的修改(例如,从曲线或其扭曲中随机选择一个点),可以使其无法检测到。通过从共享机密中获取种子而不是对其进行加密,可以将固定数据的大小减半。
$ \ endgroup $
– CodesInChaos
16 Jan 25'9:36



$ \ begingroup $
一种非开源软件中几乎无法检测到IMHO的非开源软件中可行的高度复杂的RSA后门,是由于多年前出现的,这是我最近在s13的Epilogue部分末尾阐述的。 .zetaboards.com / Crypto / topic / 7234475/1
$ \ endgroup $
–沉莫功
16年1月25日在15:56

#2 楼

您正在寻找的加密领域称为Kleptography。在kleptography中,我们正在处理一种设置,其中执行加密任务的设备可能是恶意的。现在,此设备尝试将信息泄漏给某些攻击者,从而使该攻击者可以破坏使用的加密方案。如果我没有记错的话,该计划是Young和Yung在原始工作中提出的。我没有对此进行检查,但是本文绝对是获得更多信息的一个很好的起点,并且至少包含有关“ RSA后门”的两个建议。

#3 楼

在一般情况下,RSA模块分解并不难。在特殊情况下,我们可以轻松分解数字。这些特殊情况之一是质数弱,如果两个RSA模块质数中至少有一个质数弱,我们可以很容易地将其分解。有趣的是,这样的$ 1024 $位模块的数量至少为$ 2 ^ {750} $,对于$ 2048 $位为$ 2 ^ {1500} $。您提到的RSA后门是此弱质数的特殊形式。因此,我们可以通过基于晶格的攻击轻松地分解该数字(即使我们不知道$ A $)。

有关弱质数的更多详细信息,您可以参见“使用弱质数因子构造RSA模”。

评论


$ \ begingroup $
您能否扩展一下“我们可以通过基于格的攻击轻松地将此数字分解(即使我们不知道$ A $)”?这正是问题所在,我发现这很重要。
$ \ endgroup $
–fgrieu♦
16 Jan 26'7:45



$ \ begingroup $
@fgrieu,正如我提到的,有关更多详细信息和数值示例,请参见eprint.iacr.org/2015/398.pdf。我实现了此方法,并使用此方法将$ 1024 $和$ 2048 $位RSA模块分解为主要因子。
$ \ endgroup $
– Meysam Ghahramani
16 Jan 26 '20:15



$ \ begingroup $
在问题中,$ P = A(P ^ \ prime + i)+ P ^ \ prime $ for $ A $未知384位素数,$ P ^ \ prime $未知128-位素数,​​而$ i $小(可能是$ 0 \ le i <500 $)。我怀疑这会使论文中的$ P $变弱。
$ \ endgroup $
–fgrieu♦
16 Jan 26 '21:00



$ \ begingroup $
@ fgrieu,$ P $大约是$ 512 $位,因此$ N = PQ $是$ 1024 $位,而$ P'+ i,P'$是$ 128 $位。请参阅第6页的表1。
$ \ endgroup $
– Meysam Ghahramani
16年1月27日在8:32