1. 程式人生 > >Java/Android中的3DES加密

Java/Android中的3DES加密

3DES(或稱為Triple DES)是通過DES進行3次加密,金鑰的長度為DES的金鑰3,加密後的資料長度與DES加密長度相同。安全方面相對於DES加密更加安全,不容易被破解。

程式碼:

/* 定義加密方式, DESede:加密演算法; ECB:工作模式 ; NOPadding:填充方式 */
private static final String Algorithm = "DESede/ECB/NOPadding";

/**
 * 說明 :3DES加密
 *
 * @param keybyte 金鑰
 * @return
 * @key data     明文
 */
public static byte[] encryptMode(byte[] data, byte[] keybyte) {
    try {
        // 生成金鑰
        SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
        // 加密
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.ENCRYPT_MODE, deskey);
        byte result[] = c1.doFinal(data);
        return result;
    } catch (NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
        e2.printStackTrace();
    } catch (Exception e3) {
        e3.printStackTrace();
    }
    return null;
}

/**
 * 說明 :3DES解密
 *
 * @param data    密文
 * @param keybyte 金鑰
 * @return
 */

public static byte[] decryptMode(byte[] data, byte[] keybyte) {
    try {
        // 生成金鑰
        SecretKey deskey = new SecretKeySpec(keybyte, "DESede");
        // 解密
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.DECRYPT_MODE, deskey);
        byte[] result = c1.doFinal(data);
        return result;

    } catch (NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
        e2.printStackTrace();
    } catch (Exception e3) {
        e3.printStackTrace();
    }
    return null;
}

大家可以根據需要將byte[]轉換成16進位制或者轉換為Base64格式,如需要加密字串最後將byte[]轉換為Base64格式,不然會出現亂碼;


加密中文字串流程:

1、字串轉換為Byte陣列

2、Byte陣列加密

3、將加密之後的Byte陣列轉換為Base64格式


解密:

1、Base64格式字串轉換為Byte陣列

2、Byte陣列解密

3、將解密後的Byte陣列轉換為String格式

Byte[]16進位制字串

/**
 * byte陣列轉換為16進位制字串
 *
 * @param bts 資料來源
 * @return 16進位制字串
 */
public static String bytes2Hex(byte[] bts) {
    String des = "";
    String tmp = null;
    for (int i = 0; i < bts.length; i++) {
        tmp = (Integer.toHexString(bts[i] & 0xFF));
        if (tmp.length() == 1) {
            des += "0";
        }
        des += tmp;
    }
    return des;
}

16 進位制轉 byte[]

/**
 * 將16進位制轉換為byte陣列
 *
 * @param hexString 16進位制字串
 * @return byte陣列
 */

public static byte[] toByte(String hexString) {
    int len = hexString.length() / 2;
    byte[] result = new byte[len];
    for (int i = 0; i < len; i++)
        result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
                16).byteValue();
    return result;
}

Byte[] Base64 格式

String encrypedValue = Base64.encodeToString(
        data, Base64.DEFAULT);


Base64 Byte[] 格式

byte[] data= Base64.decode(text, Base64.DEFAULT);


String  byte[] 格式

byte[] data= str.getBytes("UTF8");

Byte[] String 格式
String str= new String(data);


生成金鑰方法 :

KeyGenerator kg = KeyGenerator.getInstance("DES");
    Key key = kg.generateKey();
    byte[] keyBytes = ((Key) key).getEncoded();
    String Keystr = DES.bytes2Hex(keyBytes);