在AES中,我们在消息末尾使用一些填充字节来容纳128/256
字节块。但是由于RSA不是分组密码,为什么要使用填充?
消息大小可以是任何字节长度(加密代理
可以自由选择)还是使用RSA必须一定字节长度
加密吗?


#1 楼

没有填充的RSA也称为“教科书RSA”。
为什么没有填充的RSA不安全的问题已经在该问题中得到了回答。

我们可以通过介绍填充来解决一些问题。


可恶性:如果我们对消息采用严格的格式,即前字节或后字节包含特定值,则简单地将消息和密文相乘将降低创建有效消息的可能性。 (就填充而言)消息。
语义安全性:添加随机性,使RSA不再具有确定性(确定性加密方案对于$ x = enc_ {pubkey}(m)的每个实例始终产生相同的$ x $ $代表常量$ m $和$ pubkey $)。请参阅OAEP作为如何实现此目的的示例。

编辑:要回答第二个问题,RSA纯文本(与AES纯文本不同)受上限限制。消息的长度不得超过公钥的$ N $。同样值得注意的是,通用密码方案根本无法处理或填充RSA密码文本块。通常,使用对称密码(例如AES)对邮件进行加密,而使用不对称密码(例如RSA)仅加密此单独的密码文本的密钥。这也称为混合加密。

#2 楼

1.为什么要使用填充?

两个块密码和RSA都是一个块上的置换(RSA的块不是整数字节),因此很显然,它们两者都需要某种如果数据大小与块大小不匹配,则进行填充。

使用块密码,填充不会做很多事情:它将填充块的其余部分,并告诉您其中有多少填充。

对于RSA,填充对于其核心功能至关重要。 RSA具有很多数学结构,这会导致缺点。使用正确的填充可以防止这些缺陷。

例如RSA加密填充是随机的,以确保多次加密的同一封邮件每次看起来都不同。它还避免了其他缺陷,例如使用不同的RSA密钥对同一条消息进行加密以泄漏消息,或者攻击者创建从其他密文派生的消息。最小大小为几十个字节,而不是具有大多数分组密码填充的单个字节。

2。使用RSA加密,消息大小可以是任何字节长度还是必须是特定字节长度?

原则上,可以链接多个RSA操作,类似于我们链接分组密码的方式。实际上(几乎)没有人这样做。 RSA速度很慢,使用AES解密的速度可能是100kB / s,而不是> 100MB / s。

我们实际要做的是生成随机对称密钥,并使用该密钥和AES对消息进行加密。然后,我们使用RSA加密密钥。这是有效的,并且至少与使用RSA加密消息一样安全。

评论


$ \ begingroup $
所以RSA使用1个块,并且它的长度并不重要(如果不是太大)对吗?消息将转换为数字,并且加密应用于整个数字,没有像AES CBC这样的扩展块?
$ \ endgroup $
–马里奥
2012年8月23日14:51

$ \ begingroup $
@mario不,您不会像CBC那样传播代码块,通常只使用一个代码块。 RSA块恰好是模数-填充的大小(模幂将始终导致模数或更小)。在该块中,通常会加密随机对称数据密钥,该密钥用于加密实际的纯文本。
$ \ endgroup $
–马腾·博德威斯♦
2012年8月25日在22:53

#3 楼

根据Wikipedia所述,在对明文进行加密之前对其添加随机填充的目的是为了防止成功选择的明文攻击。 ,
没有随机成分),攻击者可以通过在公钥下加密可能的
明文并测试它们是否等于
明文攻击。 >密文。如果攻击者即使知道(或已选择)相应的纯文本,但攻击者也无法将两种加密彼此区分开,则该密码系统在语义上称为安全。如上所述,没有填充的RSA在语义上是不安全的。


有关详细信息,请参阅针对纯RSA和填充方案的攻击。<​​br />

评论


$ \ begingroup $
注意:由于加密是公共的,因此选择的明文攻击确实在攻击者的能力范围内。与对称密码(例如AES)不同,我们的问题的作者引用对称密码进行比较。
$ \ endgroup $
–freddyb
2012年8月26日19:00

#4 楼

RSA出于与CBC模式加密完全不同的原因而要求填充。


诸如AES和(三重)DES之类的分组密码只能用于将一个明文块替换为一个密文块。这不是很有用,因为通常我们希望对多个大小可变的消息进行加密。

此外,操作模式需要具有某种初始化向量,以使生成的密码不确定。如果结果是确定性的,则攻击者将可以轻松测试两个输入消息是否相同。

只有少数几种分组密码操作模式需要填充。但是,CBC操作模式经常使用,并且需要填充或密文窃取。对于基本上由按位运算和重新排序运算组成的分组密码,填充仅用于填充最后一个数据块,最好以消息可以包含任何字节值的方式填充。


RSA不是像DES或AES这样的分组密码。 RSA的主要操作是数字的模幂。该数字是使用填充的输入消息的数字表示。但是,并非所有数字都适用于RSA。例如,如果数字只是零或一,那么RSA将会失败。由于这个原因和许多其他原因,RSA需要填充方案以确保安全。该填充方案需要遵守特定要求才能确保安全;仅仅能够将消息编码/解码为特定大小只是众多要求之一。

到目前为止,对RSA使用padding这个词是相当不正确的-由于历史原因,它基本上仍被称为“ padding”。 RSA的填充方案确实只是在转换数字之前扩展了消息。但是,新的方案实际上也会改变消息本身。 RSA取幂之前,无法直接在号码中标识该消息。 OAEP是在RSA模幂化之前对整个消息进行随机转换的方案之一。

如果消息是由RSA直接加密的,那么是的,要求消息在一定范围内。由于使用了模幂运算,因此要求消息+填充在模数的范围内。因此,消息的大小取决于模数大小以及填充所引起的开销。 5 padding的最大消息大小是模数大小(以字节为单位),减去11表示填充开销。因此,可以使用2048位RSA密钥进行加密(2048/8)-11 = 245个字节。没有最小值,因此可以加密的消息的大小为0到245字节。


但是,在实际操作中,使用混合加密方案而不是数据加密方案。由RSA直接加密。在那种情况下,使用对称密码(例如AES)(具有特定的操作模式,例如CBC)来加密实际消息。然后使用RSA加密/解密对称密钥。在那种情况下,消息大小仅取决于对称密码的操作模式(在任何操作模式下,对于AES通常为数GB或更多)。 AES(-256)密钥应始终容易地适合任何RSA计算,以确保模数的安全大小,而与所使用的填充方案无关。

另一种方法是使用RSA KEM,其中完全没有密钥或消息由RSA加密。而是使用RSA KEM派生用于混合加密的对称密钥。

#5 楼

我们使用填充是因为RSA在没有填充的情况下是不安全的。参见以下研究论文:为什么ElGamal和RSA加密教科书不安全,Dan Boneh,Antoine Joux,Phong Nguyen,ASIACRYPT 2000。 >另请参见:


针对普通RSA的攻击
填充方案

对消息的长度没有特殊要求,除了它可以不会太长。通常,我们会生成随机对称密钥(例如AES密钥),使用RSA加密AES密钥,然后使用AES加密真实消息。这样,我们就超过了长度限制。