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)就不報錯了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM