簡體   English   中英

使用CryptoJS加密數據並使用AESCipherService解密

[英]Encrypt data using CryptoJS and decrypt using AESCipherService

我正在嘗試進行加密/解密設置。 加密模式是使用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的倍數

我在加密方面有什么問題嗎?

您正在使用填充模式“ NoPadding”,因此輸入必須達到完整的塊邊界( n * 16字節)才能成功加密。 您應該改用PKCS7Padding 注意:PKCS#7 在Java中被(錯誤地)稱為PKCS#5-它們本質上是等效的,並且出於這些目的, PaddingScheme.PKCS5是正確的。

此外, 應該使用ECB模式 歐洲央行微不足道,根本不安全。 如果可能,請使用經過身份驗證的加密模式(GCM / EAX / CCM),否則請使用CBC / CTR + HMAC。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM