RSA加密常用的填充方式以及常见错误

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

RSA加密常⽤的填充⽅式以及常见错误
⼀、RSA加密常⽤的填充⽅式
1.RSA_PKCS1_PADDING
输⼊:⽐ RSA modulus 短⾄少11个字节。

如果输⼊的明⽂过长,必须切割,然后填充
输出:和modulus⼀样长
根据这个要求,对于512bit的密钥, block length = 512/8 – 11 = 53 字节
1024 1024/8 - 11 = 117
当java.security.KeyPairGenerator.initialize(int keysize) 来定义密钥长度为1024时,那么我们需要加密的明⽂长度不能超过117字节否则 javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
2.RSA_PKCS1_OAEP_PADDING
输⼊:⽐ RSA modulus 短⾄少41个字节
输出:和modulus⼀样长
3.RSA_NO_PADDING
输⼊:可以和RSA modulus⼀样长,如果输⼊的明⽂过长,必须切割, 然后填充
输出:和modulus⼀样长
和AES⼀样, RSA也是⼀个块加密算法( block cipher algorithm),总是在⼀个固定长度的块上进⾏操作。

和AES不同的是, RSA block length是跟key length有关的。

The AES algorithm has a 128-bit block size, regardless of whether you key length is 256, 192 or 128 bits.
每次RSA加密的明⽂的长度是受RSA填充模式限制的,但是RSA每次加密的块长度就是key length。

需要注意:
假如你选择的秘钥长度为1024bit共128个byte:
1.当你在客户端选择RSA_NO_PADDING填充模式时,如果你的明⽂不够128字节,加密的时候会在你的明⽂前⾯填充零。

解密后的明⽂也会包括前⾯填充的零,这是服务器需要注意把解密后的字段前向填充的零去掉,才是真正之前加密的明⽂。

2.当你选择RSA_PKCS1_PADDING填充模式时,如果你的明⽂不够128字节
加密的时候会在你的明⽂中随机填充⼀些数据,所以会导致对同样的明⽂每次加密后的结果都不⼀样。

对加密后的密⽂,服务器使⽤相同的填充⽅式都能解密。

解密后的明⽂也就是之前加密的明⽂。

3.RSA_PKCS1_OAEP_PADDING填充模式没有使⽤过,他是PKCS#1推出的新的填充⽅式,安全性是最⾼的,
和前⾯RSA_PKCS1_PADDING的区别就是加密前的编码⽅式不⼀样。

⼆、常见错误
1.java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/NONE/OAEPPADDING
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
Security.addProvider(new BouncyCastleProvider());
2.ArrayIndexOutOfBoundsException: too much data for RSA block
3.java.security.InvalidKeyException: Illegal key size
因为美国法律限制,JAVA默认⽀持AES 128 Bit 的key, 如果你计划使⽤ 192 Bit 或者 256 Bit key, java complier 会抛出 Illegal key size Exception
解决⽅案有两种:
1. 需要安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files
2. 设置设置key的长度为16个字符(128 /8=16)就不报错了。

相关文档
最新文档