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.}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章