遵循Android中的相同加密CryptoJS
问题描述:
开发的我想在android中加密此javascript代码。遵循Android中的相同加密CryptoJS
let base64Key = CryptoJS.enc.Base64.parse(key);
let encryptedValue = CryptoJS.AES.encrypt(value, base64Key, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: base64Key
});
return encryptedValue.toString();
代码:
String encryptedKey = Base64.encodeToString(keyword.getBytes(), Base64.NO_WRAP);
Key key = new SecretKeySpec(encryptedKey.getBytes(), algorithm);
Cipher chiper = Cipher.getInstance("AES");
chiper.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = chiper.doFinal(plainText.getBytes());
String encryptedValue = Base64.encodeToString(encVal, Base64.NO_WRAP);
return encryptedValue;
但它返回一个完全不同的价值。
代码本身的第一线在两种情况下会返回一个不同的值:
所以我得到了这部分工作。 我只需要以下行添加到Android代码:
byte[] decoded = Base64.decode(key.getBytes());
String hexString = Hex.encodeHexString(decoded);
这是CryptoJS.enc.Base64.parse(key);
此行CryptoJS相当。
但仍试图找出最终结果。两者都不同。
答
终于得到了它在Android中使用工作下面的代码,如果有其他人面临问题:
public static String encrypt(String key, String value) {
try {
SecretKey secretKey = new SecretKeySpec(Base64.decode(key.getBytes(), Base64.NO_WRAP), "AES");
AlgorithmParameterSpec iv = new IvParameterSpec(Base64.decode(key.getBytes(), Base64.NO_WRAP));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
return new String(Base64.encode(cipher.doFinal(value.getBytes("UTF-8")), Base64.NO_WRAP));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
答
要打开一个文本字符串(UTF-8编码)为基64字符串,你需要:
var textString = 'Hello world'; // Utf8-encoded string
var words = CryptoJS.enc.Utf8.parse(textString); // WordArray object
var base64 = CryptoJS.enc.Base64.stringify(words); // string: 'SGVsbG8gd29ybGQ='
我无法更改JavaScript代码。我只能访问android代码。所以我需要在android中进行更改。我如何改变这在android? – user2893564
问题是,在JavaScript中,您将密钥转换为“Word数组”,并在Java代码中将密钥转换为64位编码的字符串。那是不一样的 – UKoehler
是的。我读到:“CryptoJS中的大多数结果对象都是WordArray类型,当您在这样的对象上调用toString()函数时,会得到该二进制对象的Hex编码字符串。” – user2893564