【Android工具類】比DES加密更安全的算法——3DES加密算法

ph44 9年前發布 | 4K 次閱讀 Java Android

  轉載請注明出處: http://blog.csdn.net/zhaokaiqiang1992

    在前面的文章里面,我們討論了DES算法,同時也明白了如何才能保證不同平臺下的加密和解密結果的一致性。但是DES作為出現了很長時間的一種加密算法, 隨著計算機運算能力的加強,DES加密容易被暴力破解,其安全性變得有點低。于是,為了增強數據的安全性,3DES算法就應運而生了。

    3DES,顧名思義,就是對DES加密算法的改進,3DES通過對每個數據進行3次DES加密,從而降低被破解的可能性。

     如果我們要使用3DES加密,需要以下幾個步驟

    ①傳入共同約定的密鑰(keyBytes)以及算法(Algorithm),來構建SecretKey密鑰對象

        SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);    

    ②根據算法實例化Cipher對象。它負責加密/解密

        Cipher c1 = Cipher.getInstance(Algorithm);    

    ③傳入加密/解密模式以及SecretKey密鑰對象,實例化Cipher對象

        c1.init(Cipher.ENCRYPT_MODE, deskey);    

    ④傳入字節數組,調用Cipher.doFinal()方法,實現加密/解密,并返回一個byte字節數組

        c1.doFinal(src);

   

    具體的代碼實現過程如下

    package com.qust;

import java.io.UnsupportedEncodingException;  

import javax.crypto.Cipher;  
import javax.crypto.SecretKey;  
import javax.crypto.spec.SecretKeySpec;  

/** 
 *  
 * @ClassName: com.qust.SecretUtils 
 * @Description: 3DES加密解密工具類 
 * @author zhaokaiqiang 
 * @date 2014-11-13 下午11:28:14 
 *  
 */  
public class DES3Utils {  

    // 定義加密算法,DESede即3DES  
    private static final String Algorithm = "DESede";  
    // 加密密鑰  
    private static final String PASSWORD_CRYPT_KEY = "zhaokaiqiang1992";  

    /** 
     * 加密方法 
     *  
     * @param src 
     *            源數據的字節數組 
     * @return 
     */  
    public static byte[] encryptMode(byte[] src) {  
        try {  
            // 生成密鑰  
            SecretKey deskey = new SecretKeySpec(  
                    build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);  
            // 實例化Cipher  
            Cipher cipher = Cipher.getInstance(Algorithm);  
            cipher.init(Cipher.ENCRYPT_MODE, deskey);  
            return cipher.doFinal(src);  
        } catch (java.security.NoSuchAlgorithmException e1) {  
            e1.printStackTrace();  
        } catch (javax.crypto.NoSuchPaddingException e2) {  
            e2.printStackTrace();  
        } catch (java.lang.Exception e3) {  
            e3.printStackTrace();  
        }  
        return null;  
    }  

    /** 
     * 解密函數 
     *  
     * @param src 
     *            密文的字節數組 
     * @return 
     */  
    public static byte[] decryptMode(byte[] src) {  
        try {  
            SecretKey deskey = new SecretKeySpec(  
                    build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);  
            Cipher c1 = Cipher.getInstance(Algorithm);  
            c1.init(Cipher.DECRYPT_MODE, deskey);  
            return c1.doFinal(src);  
        } catch (java.security.NoSuchAlgorithmException e1) {  
            e1.printStackTrace();  
        } catch (javax.crypto.NoSuchPaddingException e2) {  
            e2.printStackTrace();  
        } catch (java.lang.Exception e3) {  
            e3.printStackTrace();  
        }  
        return null;  
    }  

    /** 
     * 根據字符串生成密鑰24位的字節數組 
     *  
     * @param keyStr 
     * @return 
     * @throws UnsupportedEncodingException 
     */  
    public static byte[] build3DesKey(String keyStr)  
            throws UnsupportedEncodingException {  
        byte[] key = new byte[24];  
        byte[] temp = keyStr.getBytes("UTF-8");  

        if (key.length > temp.length) {  
            System.arraycopy(temp, 0, key, 0, temp.length);  
        } else {  
            System.arraycopy(temp, 0, key, 0, key.length);  
        }  
        return key;  
    }  
}  </pre> 


測試類的代碼如下

    package com.qust;

public class Main {  

    public static void main(String[] args) {  
        String msg = "使用3DES對數據進行加密";  
        System.out.println("【加密前】:" + msg);  

        // 加密  
        byte[] secretArr = DES3Utils.encryptMode(msg.getBytes());  
        System.out.println("【加密后】:" + new String(secretArr));  

        // 解密  
        byte[] myMsgArr = DES3Utils.decryptMode(secretArr);  
        System.out.println("【解密后】:" + new String(myMsgArr));  
    }  
}  </pre> 


 本文由用戶 ph44 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!