2017-02-13 113 views
0

我想要加密/解密设置。加密模式是使用AES算法的ECB。对于加密,我使用CryptoJS作为我的应用程序的一部分。以下代码用于加密:使用CryptoJS加密数据并使用AESCipherService解密

 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

您正在使用填充模式“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。

+0

谢谢。像魅力一样工作。我将更改我的代码以使用CBC模式而不是ECB。 –