这是分别使用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