最近在做一個項目中需要,在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