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

时间:2017-02-13 07:30:20

标签: 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());
    }

我得到以下异常:

  

引起:javax.crypto.IllegalBlockSizeException:输入长度必须   使用填充密码解密时为16的倍数

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

1 个答案:

答案 0 :(得分:1)

您正在使用填充模式" NoPadding",因此输入必须达到完整的块边界( 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。