javascript - 使用 CryptoJS 加密数据并使用 AESCipherService 解密

标签 javascript encryption

我正在尝试进行加密/解密设置。加密方式是使用AES算法的ECB。对于加密,我使用 CryptoJS 作为我的应用程序的一部分。下面的代码用于加密:

        var keyHex = CryptoJS.enc.Utf8.parse(key);
        alert(keyHex + ":" + keyHex.toString().length);


        var cipherText = CryptoJS.enc.Base64.stringify(CryptoJS.AES.encrypt(inputString, keyHex, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding}).ciphertext);
        console.log("Encrypted: " + cipherText);

为了解密,我使用Shiro的AESCipherService来解密。我有以下代码:

public static String decryptUsingShiro(String base64EncodedData, String key) {
        byte[] base64decoded = Base64.decodeBase64(base64EncodedData.getBytes());
        AesCipherService decryptService = new AesCipherService();
        decryptService.setMode(OperationMode.ECB);
        decryptService.setPaddingScheme(PaddingScheme.PKCS5);
        ByteSource decrypt = decryptService.decrypt(base64decoded, key.getBytes());
        return new String(decrypt.getBytes());
    }

我收到以下异常:

Caused by: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

我在加密方面做错了什么?

最佳答案

您正在使用填充模式“NoPadding”,因此输入必须达到完整的 block 边界(n * 16 字节)才能成功加密。您应该使用 PKCS7Padding反而。 (注意:PKCS #7 是 referred to (incorrectly) as PKCS #5 in Java ——它们本质上是等效的,出于这些目的,PaddingScheme.PKCS5 是正确的。)

此外,you should not use ECB mode 。欧洲央行已经微不足道,而且根本不安全。如果可能,请使用经过身份验证的加密模式 (GCM/EAX/CCM),否则请使用 CBC/CTR + HMAC。

关于javascript - 使用 CryptoJS 加密数据并使用 AESCipherService 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42198685/

相关文章:

javascript - 如何构建 Angularjs/Leaflet/Node.js 应用程序

javascript - 将值绑定(bind)到javascript中的函数

android - setStorageEncryption 是否加密所有移动存储内存?

java - 有没有办法解密S/MIME公钥数据?

api - 使用 SSL 的 Rest API 加密

javascript - Firebase (2016) 浅层查询

javascript - AngularJS——如何解释输出

javascript - addEventListener 不会将监听器附加到元素

android - XML文件加密

跨平台加密容器库