rsa加密--選擇padding模式需要注意的問題。。。


最近在做一個項目中需要,在android對一個密碼字段首先進行

一次md5加密后再進行一次rsa加密,然后把加密的結果通過

json協議傳輸給nginx服務器進行解密。在android中,可以直接

使用java提供Cipher類來進行加密,nginx服務器使用openssl來進行解密。

android客戶端使用RSA加密的字段,要使nginx服務器能正常解密,

這里需要客戶端和服務器統一RSA加密所用的填充方式。

RSA加密常用的填充方式有下面3種:

1.RSA_PKCS1_PADDING 填充模式,最常用的模式

要求:
輸入:必須 比 RSA 鑰模長(modulus) 短至少11個字節, 也就是 RSA_size(rsa) – 11
如果輸入的明文過長,必須切割, 然后填充

輸出:和modulus一樣長

根據這個要求,對於512bit的密鑰, block length = 512/8 – 11 = 53 字節

2.RSA_PKCS1_OAEP_PADDING
輸入:RSA_size(rsa) – 41

輸出:和modulus一樣長

3.for RSA_NO_PADDING  不填充

輸入:可以和RSA鑰模長一樣長,如果輸入的明文過長,必須切割, 然后填充

輸出:和modulus一樣長

跟DES,AES一樣, RSA也是一個塊加密算法( block cipher algorithm),總是在一個固定長度的塊上進行操作。

但跟AES等不同的是, block length是跟key length有關的。

每次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的區別就是加密前的編碼方式不一樣。

 

https://www.cnblogs.com/lzl-sml/p/3501447.html


免責聲明!

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



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