Android平臺和java平臺 DES加密解密互通程序及其不能互通的原因
網上的demo一搜一大堆,但是,基本上都是一知半解(包括我)。爲什麼呢?我在嘗試分別在兩個平臺加密的時候,竟然發現Android DES 加密和java DES加密的程序不能互通。就是加密的結果不一樣,更不要說Android平臺的加密輸入作爲java DES的解密輸出了。這樣的話,客戶端和服務器端就不能進行通信了。我網上之前也發帖子問了不少人,但是回答都不滿意。
今天部門的另外一個同事跟我說了一下,才解決了這個不能互通的問題。
調用DES加密算法包最精要的就是下面兩句話:
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
CBC是工作模式,DES一共有電子密碼本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種模式,
PKCS5Padding是填充模式,還有其它的填充模式:
然後,cipher.init()一共有三個參數:Cipher.ENCRYPT_MODE, key, zeroIv,zeroIv就是初始化向量,一個8爲字符數組。
工作模式、填充模式、初始化向量這三種因素一個都不能少。否則,如果你不指定的話,那麼就要程序就要調用默認實現。問題就來了,這就與平臺有關了。難怪網上一搜"DES加密結果不一致“,出現n多網頁結果。(之前我並沒有指定IV,被折磨了2周)
源程序如下(從java平臺到android平臺,我根本沒有更改一行代碼):
另外,一般情況下,加密後的結果都會用base64編碼進行傳輸。
java平臺:
主程序
1.public class testDES {
2.
3. /**
4. * @param args
5. * @throws Exception
6. */
7. public static void main(String[] args) throws Exception {
8. // TODO Auto-generated method stub
9. String key = "12345678";
10. String text = "12345678";
11. String result1 = DES.encryptDES(text,key);
12. String result2 = DES.decryptDES(result1, key);
13. System.out.println(result1);
14. System.out.println(result2);
15. }
16.}
用到的DES加密類
1.import javax.crypto.Cipher;
2.import javax.crypto.spec.IvParameterSpec;
3.import javax.crypto.spec.SecretKeySpec;
1.public class DES {
2. private static byte[] iv = {1,2,3,4,5,6,7,8};
3. public static String encryptDES(String encryptString, String encryptKey) throws Exception {
4.// IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);
5. IvParameterSpec zeroIv = new IvParameterSpec(iv);
6. SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
7. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
8. cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
9. byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
10.
11. return Base64.encode(encryptedData);
12. }
13. public static String decryptDES(String decryptString, String decryptKey) throws Exception {
14. byte[] byteMi = new Base64().decode(decryptString);
15. IvParameterSpec zeroIv = new IvParameterSpec(iv);
16.// IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);
17. SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
18. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
19. cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
20. byte decryptedData[] = cipher.doFinal(byteMi);
21.
22. return new String(decryptedData);
23. }
24.}
今天部門的另外一個同事跟我說了一下,才解決了這個不能互通的問題。
調用DES加密算法包最精要的就是下面兩句話:
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
CBC是工作模式,DES一共有電子密碼本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種模式,
PKCS5Padding是填充模式,還有其它的填充模式:
然後,cipher.init()一共有三個參數:Cipher.ENCRYPT_MODE, key, zeroIv,zeroIv就是初始化向量,一個8爲字符數組。
工作模式、填充模式、初始化向量這三種因素一個都不能少。否則,如果你不指定的話,那麼就要程序就要調用默認實現。問題就來了,這就與平臺有關了。難怪網上一搜"DES加密結果不一致“,出現n多網頁結果。(之前我並沒有指定IV,被折磨了2周)
源程序如下(從java平臺到android平臺,我根本沒有更改一行代碼):
另外,一般情況下,加密後的結果都會用base64編碼進行傳輸。
java平臺:
主程序
1.public class testDES {
2.
3. /**
4. * @param args
5. * @throws Exception
6. */
7. public static void main(String[] args) throws Exception {
8. // TODO Auto-generated method stub
9. String key = "12345678";
10. String text = "12345678";
11. String result1 = DES.encryptDES(text,key);
12. String result2 = DES.decryptDES(result1, key);
13. System.out.println(result1);
14. System.out.println(result2);
15. }
16.}
用到的DES加密類
1.import javax.crypto.Cipher;
2.import javax.crypto.spec.IvParameterSpec;
3.import javax.crypto.spec.SecretKeySpec;
1.public class DES {
2. private static byte[] iv = {1,2,3,4,5,6,7,8};
3. public static String encryptDES(String encryptString, String encryptKey) throws Exception {
4.// IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);
5. IvParameterSpec zeroIv = new IvParameterSpec(iv);
6. SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
7. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
8. cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
9. byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
10.
11. return Base64.encode(encryptedData);
12. }
13. public static String decryptDES(String decryptString, String decryptKey) throws Exception {
14. byte[] byteMi = new Base64().decode(decryptString);
15. IvParameterSpec zeroIv = new IvParameterSpec(iv);
16.// IvParameterSpec zeroIv = new IvParameterSpec(new byte[8]);
17. SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES");
18. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
19. cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
20. byte decryptedData[] = cipher.doFinal(byteMi);
21.
22. return new String(decryptedData);
23. }
24.}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.