這是分別使用Crypto和javax.crypto在JS和Java中加密/解密的方法。
如果你不關心不同環境的互操作性,你可以在你的JS代碼中使用createCypher(algorithm, password)很快入門,但它不是很便攜,因爲你不知道原始密鑰和初始化矢量是如何從密碼。
改變JS代碼使用createCipheriv(algorithm, key, iv)相反,會給你一個便攜式加密/解密:
encryptString : function encryptString(str, encryptionKey, iv) {
var cipher = crypto.createCipheriv('aes-128-cbc', encryptionKey, iv);
var cipherText = cipher.update(str, 'binary', 'base64');
var cipherTextRemaining = cipher.final('base64');
return cipherText + cipherTextRemaining;
},
decryptString : function decryptString(str, encryptionKey, iv) {
var desipher = crypto.createDecipheriv('aes-128-cbc', encryptionKey, iv);
var desipherText = desipher.update(str, 'base64', 'binary');
var desipherTextRemaining = desipher.final('binary');
return desipherText + desipherTextRemaining;
},
這相當於Java代碼做同樣的事情:
public static String encryptString(String clearText, byte[] key, byte[] initialVector) throws Exception
{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpecy = new SecretKeySpec(key, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpecy, ivParameterSpec);
byte[] encrypted = cipher.doFinal(clearText.getBytes());
return new String(Base64.encodeBase64(encrypted, false));
}
public static String decryptString(String cipherText, byte[] key, byte[] initialVector) throws Exception
{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpecy = new SecretKeySpec(key, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec);
return new String(cipher.doFinal(Base64.decodeBase64(cipherText)));
}
有很多關於展示如何使用AES128解密網的例子 - 你發現了什麼? – 2014-10-20 08:25:54
我已經看過http://www.androidsnippets.com/encryptdecrypt-strings,但是我通過創建原始密鑰而感到困惑。 – n0rm1e 2014-10-20 08:58:12
那麼你的問題是否真的減少爲「如何在JavaScript和Java中創建相同的密鑰」?在你的問題中更明確地說明這一點可能會有幫助。 – apsillers 2014-10-21 11:44:19