您的“基本 RSA”可能不是PKCS#1中指定的标准 RSA,而是所谓的“教科书 RSA”,这是不安全的,因为它被简化为核心模幂运算并且不包括必不可少的填充。
在“教科书 RSA”中,公钥由n(模数)和e(公共指数)组成。私钥是d(私人指数)。明文是整数模n。m的加密是m e mod n;解密是通过提高d次幂来获得的,因为(m e ) d = m mod n对于0到n-1范围内的所有整数m 。
事实上,教科书 RSA 对选择的密文攻击并不安全,原因如下:对于模数n和所有消息m和m',您有:
(mm') e = (m e )(m' e ) mod n
换句话说,产品的加密是加密的产品。在 CCA 设置中:
- 有一条消息m及其密文c = m e mod n。攻击者知道c并想找到m。
- 攻击者被允许获得他选择的密文的解密,只要它们都不等于c。
- 攻击者生成一个随机m'(模n)并计算c' = m' e mod n。
- 攻击者要求解密cc' mod n:这是一个整数模n,与c不同,因此攻击者得到响应。
- 响应必然等于mm' mod n。攻击者知道m'(他自己选择),所以他很容易计算出m 。
至于选择的明文攻击:如果要提供任何安全性,非对称加密必然对 CPA 是安全的。事实上,加密使用的公钥是公开的,因此每个人都知道,包括攻击者。如果攻击者想要加密他选择的一些消息,那么他……就这么做了。他不需要私钥所有者的任何帮助,因为加密只使用公共元素。
如果教科书 RSA 对 CPA 不安全,那么带有填充的标准RSA 也会很弱:使用他的破坏方法,攻击者将恢复填充的消息,并从中获得未填充的消息。
现在这并不意味着教科书 RSA对无法获得自定义密文解密的攻击者是安全的。教科书 RSA (至少)存在以下非常严重的问题:
- 如上所述,它对 CCA 是不安全的。
- 如果消息是一个小整数,那么 RSA 问题可能会变得很容易。例如,如果m是 200 位整数并且公共指数是e = 3,则m e是 600 位整数,而模数通常更大(至少 1024 位)。这意味着可以使用简单的非模立方根(这很容易)来恢复m 。
- 教科书 RSA 是确定性的;因此,如果消息本身可以进行暴力破解(例如,它是密码),则可以通过尝试潜在的消息值直到找到匹配项来恢复它。
PKCS#1 中指定的标准填充解决了这些问题:填充确保填充的整数足够大;填充包括随机字节。旧式 PKCS#1 填充(称为“v1.5”)实际上对 CCA 的攻击力不是很强,尽管在正确使用时它仍然可以说是不错的,就像在 SSL 中一样(它要求 SSL 服务器在解密时不抱怨)客户端发送的内容没有语法上有效的填充)。新型 PKCS#1 填充(称为“OAEP”)是强大的(甚至“被证明是强大的”以获得适当的“证明”的含义)。