【发布时间】:2019-05-30 21:46:11
【问题描述】:
我需要将加密字符串从 Javascript 发送到 Android,但我收到以下错误: javax.crypto.BadPaddingException:垫块损坏
很遗憾,我无法修改 Android 实现,我只能修改 Javascript 代码。我已经尝试过 CryptoJS,现在是 aes-js。
要解密的Android代码:
SecretKey secret_user_key = new SecretKeySpec(user_key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secret_user_key);
byte[] clearBytes = cipher.doFinal(encrypted);
要加密的Javascript:
var aesCbc = new aesjs.ModeOfOperation.cbc(new Uint8Array(userKey));
var encrypted = aesCbc.encrypt(aesjs.padding.pkcs7.pad(clearByteArray));
用户密钥和加密变量在两个平台上是相同的。 user key 和 clearByteArray 都是 32 字节。
请注意,Android 实现没有指定填充、iv 或操作模式,但我无法修改那部分。
我尝试了十亿种不同的加密参数组合,并为此浪费了无数小时。
编辑:这也是我必须在 Javascript 上重现的 Android 上的等效加密方法:
SecretKey secret_user_key = new SecretKeySpec(user_key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secret_user_key);
byte[] encrypted = cipher.doFinal(clearBytes);
return encrypted;
【问题讨论】:
-
Cipher.getInstance("AES");是不安全的ECB模式, -
我建议您更改您的 android 实现,因为它不如您用于 javascript 的安全。您的 js 实现的兼容模式将是
Cipher.getInstance("AES/CBC/PKCS7PADDING")
标签: javascript java android encryption aes