簡述 3DES,也稱為3DESede或TripleDES,是三重數據加密,且可以逆推的一種演算方案。 1975年每果IBM公司成功研究並發布了DES加密演算法,但DES密码長度容易被暴力破解,通過對DES演算法進行改版,針對每個數據塊進行三次DES加密,也就是3DES加密演算法。 但由于3DES的演算法是公開的,所以演算法本身沒有秘密可言,主要依靠唯一密鑰來確保數據加密解密的安全。 有人可能會問,那3DES到底安不安全呢?!目前為止,還沒有人能破解3DES,所以你要是能破解它,就足以震驚整個資安界了……
JAVA Code:
public class DESedeCrypto{ private static final String Algorithm = "DESede/ECB/NoPadding"; private static final String PASSWORD_CRYPT_KEY = "your_key"; public static byte[] encryptMode(byte[] src) { try { //生成密鑰 SecretKeySpec deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm); //實現加解密物件 Cipher c1 = Cipher.getInstance(Algorithm); //初始化為加密模式 c1.init(Cipher.ENCRYPT_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; } 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; } /** * 修正KEY長度,3DES的密鑰長度需為24Byte,不夠補0 * * @param keyStr 原KEY * @return * @throws UnsupportedEncodingException */ public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException { byte[] key = new byte[24]; //宣告一個24Byte的Key,初始值為0 byte[] temp = keyStr.getBytes("UTF-8"); //將字串轉為位元陣列 if (key.length > temp.length) { //如果原key不夠24Byte,則拷貝至原key長度 System.arraycopy(temp, 0, key, 0, temp.length); } else { //如果原key大於24Byte,則拷貝至24Byte System.arraycopy(temp, 0, key, 0, key.length); } return key; } }
MainActivity
public class MainActivity extends Activity { String text = "your_will_encrypto_text"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); DESedeCrypto crypto = new DESedeCrypto(); try { byte[] textEncode = crypto.encryptMode(text.getBytes("UTF-8")); System.out.println(Base64.encodeToString(textEncode, Base64.DEFAULT)); byte[] textDecode = crypto.decryptMode(textEncode); System.out.println(new String(textDecode)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
※ java.security.InvalidKeyException :通常是你的key長度不對