一、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
解決方案有兩種:
- 需要安裝Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files
- 設置設置key的長度為16個字符(128 /8=16)就不報錯了。
