1. 程式人生 > >java加密之AES/CBC/PKCS5Padding

java加密之AES/CBC/PKCS5Padding

和上一篇原理一樣,只是多一個偏移量

1.加密

public static String Encrypt(String sSrc, String sKey) throws Exception {  
        if (sKey == null) {  
            System.out.print("Key為空null");  
            return null;  
        }  
        // 判斷Key是否為16位  
        if (sKey.length() != 16) {  
            System.out
.print("Key長度不是16位"); return null; } byte[] raw = sKey.getBytes("utf-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"演算法/模式/補碼方式" IvParameterSpec iv = new IvParameterSpec(cKey.getBytes());//使用CBC模式,需要一個向量iv,可增加加密演算法的強度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(sSrc.getBytes()); return new Base64().encode(encrypted);//此處使用BASE64做轉碼功能,同時能起到2次加密的作用。 }

2.解密

// 解密  
    public static String Decrypt(String sSrc, String sKey) throws Exception {  
        try
{ // 判斷Key是否正確 if (sKey == null) { System.out.print("Key為空null"); return null; } // 判斷Key是否為16位 if (sKey.length() != 16) { System.out.print("Key長度不是16位"); return null; } byte[] raw = sKey.getBytes("utf-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec(cKey.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密 try { byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original); return originalString; } catch (Exception e) { System.out.println(e.toString()); return null; } } catch (Exception ex) { System.out.println(ex.toString()); return null; } }

3.測試

 public static void main(String[] args) throws Exception {  
        /* 
         * 加密用的Key 可以用26個字母和數字組成,最好不要用保留字元,雖然不會錯,至於怎麼裁決,個人看情況而定 
         * 此處使用AES-128-CBC加密模式,key需要為16位。 
         */  

        // 需要加密的字串  
        String cSrc = "{data:[{'name':'你好','age':20},{'name':'zd','age':18}]}";  
        System.out.println(cSrc);  
        // 加密  
        long lStart = System.currentTimeMillis();  
        String enString = AES.Encrypt(cSrc, cKey);  
        System.out.println("加密後的字串是:" + enString);  

        long lUseTime = System.currentTimeMillis() - lStart;  
        System.out.println("加密耗時:" + lUseTime + "毫秒");  
        // 解密  
        lStart = System.currentTimeMillis();  
        String DeString = AES.Decrypt(enString, cKey);  
        System.out.println("解密後的字串是:" + DeString);  
        lUseTime = System.currentTimeMillis() - lStart;  
        System.out.println("解密耗時:" + lUseTime + "毫秒");  
    } 

4.結果

{data:[{'name':'你好','age':20},{'name':'zd','age':18}]}
加密後的字串是:NYVX44VBZP9890WYjeJC7lOnpXCR/Z/B+kbc+nu432KrcegOS08U+lA6clLoP92bHblcBcYf1dced25iNLTTIA==
加密耗時:413毫秒
解密後的字串是:{data:[{'name':'你好','age':20},{'name':'zd','age':18}]}
解密耗時:0毫秒

本事例中偏移量直接使用金鑰,但是為了安全起見,最好不要這麼做

想了解更多java相關技術,請關注公眾號“JavaEE那些事”

掃描下面二維碼,更多技術資料等你來拿
這裡寫圖片描述