如果我可以发送一些明文并获得密文,那么如何找到它们之间的关系来帮助我破解另一个密文?

评论

Boneh可以在本文中找到有关RSA密码系统上当前存在的当前(1999年)攻击的一个很好的概述。 crypto.stanford.edu/~dabo/pubs/abstracts/RSAattack-survey.html

您是否有理由扩大此问题的范围?第一个问题是一个很好回答的问题,因为此修订版太广泛了。

@约翰:最初的问题看起来比当前的问题好……它正在走向“非建设性的”(如“给我所有攻击的清单”)。原始问题中是否缺少某些内容,导致您删除了“选择的密文”部分?

我认为在可搜索性方面会更好。我应该回到原来的问题吗?

我认为,使用“任何”代替“选择的密文”不会改善可搜索性,除非在极少数情况下有人在标题中搜索准确的短语(并加上引号)。我将标题更改为问题,改写了文字以询问我认为您实际想要的内容,并添加了一些相关标签(“安全”不是,抱歉)。请检查我是否没有使它过分,并随时进行再次编辑。

#1 楼

根据评论中Paulo的评论进行了轻微修订-在公钥系统中,选定的明文攻击几乎是设计的一部分-可以对任意明文进行加密以随意生成密文-通过设计,但是,这些不应提供任何信息

选择的密文攻击可以与精心选择的纯文本一起使用,但是要进行攻击-在RSA教科书中,这相当简单。首先,我们将用以下密文来表示:

$$ C = t ^ e \ mod n $$
我们所知道和喜欢的是RSA。现在,夏娃有了$ C $-这很普通,因为应该知道夏娃能够看到$ C $。现在,eve可以选择纯文本了-因此,她选择$ 2 $作为她的纯文本,并计算$ C_a = 2 ^ e \ mod n $。但是,她向我们毫无戒心的受害者发送了$ C_b = C_a * C $,因此:

$$ C_b = C \ cdot 2 ^ e = t ^ e 2 ^ e \ mod n $$

到目前为止一切都很好。现在,由于这是一种选择的明文攻击,因此我们依赖于访问替换值的解密-因此,毫无疑问的受害者将计算出:

$$(C_b)^ d = [t ^ e 2 ^ e] ^ d =(t ^ e)^ d \ cdot(2 ^ e)^ d \ mod n $$

但是对于任何纯文本$ x $,我们知道$ C \ equiv x ^ e $和$ x \ equiv C ^ d $;因此:$$(x ^ e)^ d \ equiv x \ mod n $$

因此,根据前面的结果:$$(C_b)^ d = t \ cdot 2 \ mod n $$

因此,当我们取回该值时,我们可以很容易地计算$ t $。我们只需将其减半。

这实际上可以应用于我们希望选择的任何纯文本-我之所以选择$ 2 $是因为我喜欢它作为数字。本文涵盖了一般技术以及更多内容。

这仅适用于RSA教科书。 RSA在野外的正确应用包括使用填充方案,通过确保密文不具有这种可延展性来克服这种攻击。

评论


$ \ begingroup $
这不是选择的密文攻击,而不是选择的明文攻击吗?对于非对称加密,总是能够进行选定的明文攻击(即使用公钥加密),但是检索选定密文的解密(无论它来自某个已知的明文还是其他某种东西)被称为选定密文攻击。
$ \ endgroup $
–PaŭloEbermann
2012年4月10日16:56

$ \ begingroup $
@PaŭloEbermannHmmm,实际上您可能是正确的。我想我的术语全都弄糊涂了。要编辑,两秒钟。
$ \ endgroup $
–user46
2012年4月10日18:31

#2 楼

选择的明文攻击意味着攻击者Eve可以加密其选择的明文。由于在公共密钥密码系统中这始终是可能的,因此夏娃可以始终获取鲍勃的加密指数$ e $并加密任何纯文本。当明文空间很小时,这意味着什么?

说爱丽丝和鲍勃决定使用RSA教科书,并生成所需的公钥和私钥。爱丽丝将鲍勃的年龄发送给她。夏娃收到消息$ m $(爱丽丝的年龄)为$ m ^ e \ mod N $。夏娃知道$ m ^ e $解密到一定年龄(明文空间很小)。夏娃可以通过对数字1-200进行加密并将其与密文$ m ^ e $相匹配来发起选定的纯文本攻击。

这是一个SageMath脚本,它在RSA教科书上显示了这种攻击。 >


p,q = next_prime(2^50), next_prime(2^30)
N = p*q
phi = ((p-1)*(q-1))
e = randint(0, phi)
while gcd(e, phi) != 1:
    e = randint(0, phi)
e = Integers(phi)(e)
d = e^(-1)
print('p = {}\nq = {}\nN = {}\nphi(N) = {}\n'.format(p, q, N, phi))
print('Bob\'s private key: d = {}, public key: e = {}'.format(d, e))

# BLOCK: Alice sends Bob a message
m = Integers(N)(39)
c = m^e
print('Alice sends m = {} to Bob as m^e = {}'.format(m, c))

# BLOCK: Bob decrypts c
print('Bob decrypts c = {} to m = c^d = {}'.format(c, c^d))

# BLOCK: Chosen Plaintext Attack on Textbook RSA
plaintext_space = range(200)
for t in plaintext_space:
    t = Integers(N)(t)
    if t^e == c:
        print('Eve has found the message: {}'.format(t))


以下是输出:



 ---- Bob computes his public and private key ---- 
p = 1125899906842679
q = 1073741827
N = 1208925822992387951034533
phi(N) = 1208925821866486970450028

Bob's private key: d = 663674456840375780568965, public key: e = 761705651416514555276069
 ---- Alice sends Bob a message ---- 
Alice sends m = 39 to Bob as m^e = 25719553046482356303827
 ---- Chosen Plaintext Attack on Textbook RSA ---- 
Eve has found the message: 39