[英]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.