Java/Android中的3DES加密
阿新 • • 發佈:2018-11-13
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);
byte[] data= Base64.decode(text, Base64.DEFAULT);
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);