簡述 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長度不對