javascript - Javascript 到 Java AES
问题描述
我需要将加密字符串从 Javascript 发送到 Android,但出现以下错误:javax.crypto.BadPaddingException: pad block损坏
不幸的是,我无法修改 Android 实现,我只能调整 Javascript 代码。我已经尝试过 CryptoJS 和现在的 aes-js。
安卓解密代码:
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;
解决方案
Android中使用的模式Cipher.getInstance("AES");
是ECB模式。欧洲央行模式不安全。您可以从Wikipedia上的企鹅图像中看到它。您应该至少使用 CBC 模式或更好的身份验证加密作为 AES-GCM 模式。
既然您说您不能更改 Android 部分,那么您必须将 JS 部分降级为 ECB 模式。
var aesEcb = new aesjs.ModeOfOperation.ecb(key);
推荐阅读
- python - 加入 3 个表查询集 Python Django
- c++ - 调用自身的模板函数导致“实例化深度超过最大值 900”
- javascript - 错误:退避操作已在进行中。当我尝试从 react 应用程序从 firebase 读取数据时
- swift - 添加弱子视图导致iOS14崩溃
- git - 无法使用 Jenkins 配置私有 Git 服务器
- libgit2 - 使用libgit2同时读取存储库多次的最佳方法,性能/内存明智?
- python - TypeError: int() 参数必须是字符串、类似字节的对象或数字,而不是“NoneType”深度学习
- c++ - 在字符串中查找项目并说何时找到 - c++
- python - 创建一个新文件夹并将其设置为 selenium 中的默认下载
- ruby - 是否有一个 Ruby 单线器来 join() 嵌套的 Ruby 数组,内部/外部数组有不同的 join() 字符串?