1. padding模式
1.1 三类常见填充方式
RSA加密常用的填充模式有三种:RSA_PKCS1_PADDING, RSA_PKCS1_OAEP_PADDING, RSA_NO_PADDING。
与对称加密算法DES,AES一样,RSA算法也是一个块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。但跟AES等不同的是,block length是跟key length有关的。
每次RSA加密的明文的长度是受RSA填充模式限制的,但是RSA每次加密的块长度就是key length。
填充方式 | 输入 | 输出 | 条件 |
RSA_PKCS1_PADDING | 必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是 RSA_size(rsa) – 11 | 和modulus一样长 | |
RSA_PKCS1_OAEP_PADDING | RSA_size(rsa) – 41 | 和modulus一样长 | |
RSA_NO_PADDING | 可以和RSA钥模长一样长,如果输入的明文过长,必须切割, 然后填充 | 和modulus一样长 |
1.2 不同模式下的加密的最大数据长度
- 在不同的padding模式下,使用相同长度的密钥可以加密的数据最大长度不同;
- 在不同密钥长度下,使用相同的padding模式可以加密的数据最大长度也不同;
因此,脱离了密钥长度而讨论padding模式可以加密的最大长度是不严谨的。
常用的密钥长度有1024bits,2048bits等,理论上1024bits的密钥可以加密的数据最大长度为1024bits(即1024/8 = 128bytes)。2048bits的密钥可以加密的数据最大长度为2048bits(2048/8 = 256bytes),但是RSA在实际应用中不可能使用这种“教科书式的RSA”系统。实际应用中RSA经常与填充技术(padding)一起使用,可以增加RSA的安全性。填充技术实现的不好,RSA也不会安全。原因如下:
- RSA加密是确定的,即给定一个密钥,特定明文总会映射到特定的密文。攻击者可以根据密文中统计信息获取明文的一些信息。
- 填充技术如果比较弱,那么较小的明文和小型公开指数e将易于受到攻击。
- RSA有个特性叫做延展性,如果攻击者可以将一种密文转换为另一种密文,儿这种新密文会导致对明文的转换变得可知,这种特性并没有解密明文,而是以一种可预测的方式操纵了明文,比如:银行交易系统中,攻击者根据新密文,直接去修改原密文中金额的数据,可以在用户和接受方无法感知的情况下进行修改。
所以,填充技术关系到RSA的安全性的高低。最优非对称填充(OAEP)就是一种优秀的填充方式,对应上述表格中RSA_PKCS1_OAEP_PADDING填充方式。