【问题标题】:Javascript to Java AESJavascript 到 Java AES
【发布时间】: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


【解决方案1】:

Android中使用的模式Cipher.getInstance("AES");是ECB模式。欧洲央行模式不安全。您可以从Wikipedia 的企鹅图像中看到它。您应该至少使用 CBC 模式或更好的身份验证加密作为 AES-GCM 模式。

既然你说安卓部分不能改,那你就得把JS部分降级为ECB模式。

var aesEcb = new aesjs.ModeOfOperation.ecb(key);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多