使用Java进行AES加密并使用Javascript进行解密

我正在制作一个需要基于Java的AES加密和基于JavaScript的解密的应用程序。 我使用以下代码进行加密作为基本表单。

public class AESencrp { private static final String ALGO = "AES"; private static final byte[] keyValue = new byte[] { 'A', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k','l', 'm', 'n', 'o', 'p'}; public static String encrypt(String Data) throws Exception { Key key = generateKey(); Cipher c = Cipher.getInstance(ALGO); c.init(Cipher.ENCRYPT_MODE, key); byte[] encVal = c.doFinal(Data.getBytes()); String encryptedValue = new BASE64Encoder().encode(encVal); return encryptedValue; } private static Key generateKey() throws Exception { Key key = new SecretKeySpec(keyValue, ALGO); return key; } } 

我试图用来解密的JavaScript是

   var decrypted = CryptoJS.AES.decrypt(encrypted,"Abcdefghijklmnop").toString(CryptoJS.enc.Utf8); 

但JavaScript解密不起作用。 我是新手,有人可以告诉我一种解决方法,而无需更改Java代码块吗?

我尝试使用Base-64解码我的文本,如下所示:

 var words = CryptoJS.enc.Base64.parse(encrKey); var base64 = CryptoJS.enc.Base64.stringify(words); var decrypted = CryptoJS.AES.decrypt(base64, "Abcdefghijklmnop"); alert("dec :" +decrypted); 

但仍然没有好处。

我尝试了下面建议的解决方案来解决可能的填充问题,但它没有提供任何解决方案。

 var key = CryptoJS.enc.Base64.parse("QWJjZGVmZ2hpamtsbW5vcA=="); var decrypt = CryptoJS.AES.decrypt( encrKey, key, { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7 } ); alert("dec :" +decrypt); 

  1. 当您的JavaScript代码使用256位AES密钥时,您的Java代码使用128位AES密钥。

  2. 您的Java代码使用“Abcdefghijklmnop”.getBytes()作为实际键值,而您的JavaScript代码使用“Abcdefghijklmnop”作为从中派生实际键的密码。

  3. Java AES的默认转换是AES / ECB / PKCS5Padding,而CryptoJS的默认转换是AES / CBC / PKCS7Padding。

修复示例的一种方法是修复JavaScript端:

 // this is Base64 representation of the Java counterpart // byte[] keyValue = new byte[] { 'A', 'b', 'c', 'd', 'e', 'f', 'g', // 'h', 'i', 'j', 'k','l', 'm', 'n', 'o', 'p'}; // String keyForJS = new BASE64Encoder().encode(keyValue); var base64Key = "QWJjZGVmZ2hpamtsbW5vcA=="; console.log( "base64Key = " + base64Key ); // this is the actual key as a sequence of bytes var key = CryptoJS.enc.Base64.parse(base64Key); console.log( "key = " + key ); // this is the plain text var plaintText = "Hello, World!"; console.log( "plaintText = " + plaintText ); // this is Base64-encoded encrypted data var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); console.log( "encryptedData = " + encryptedData ); // this is the decrypted data as a sequence of bytes var decryptedData = CryptoJS.AES.decrypt( encryptedData, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 } ); console.log( "decryptedData = " + decryptedData ); // this is the decrypted data as a string var decryptedText = decryptedData.toString( CryptoJS.enc.Utf8 ); console.log( "decryptedText = " + decryptedText ); 

为了使Java和JavaScript能够互操作,在创建Key或Cipher时不必使用默认值。 迭代计数,密钥长度,填充,盐和IV应该都是相同的。

参考: https : //github.com/mpetersen/aes-example

示例代码如下:

在Java中加密字符串:

  String keyValue = "Abcdefghijklmnop"; SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); KeySpec spec = new PBEKeySpec(keyValue.toCharArray(), hex("dc0da04af8fee58593442bf834b30739"), 1000, 128); Key key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES"); Cipher c = Cipher.getInstance(“AES/CBC/PKCS5Padding”); c.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(hex("dc0da04af8fee58593442bf834b30739"))); byte[] encVal = c.doFinal("The Quick Brown Fox Jumped over the moon".getBytes()); String base64EncodedEncryptedData = new String(Base64.encodeBase64(encVal)); System.out.println(base64EncodedEncryptedData); 

}

在JavaScript中解密相同的字符串:

 var iterationCount = 1000; var keySize = 128; var encryptionKey ="Abcdefghijklmnop"; var dataToDecrypt = "2DZqzpXzmCsKj4lfQY4d/exg9GAyyj0hVK97kPw5ZxMFs3jQiEQ6LLvUsBLdkA80" //The base64 encoded string output from Java; var iv = "dc0da04af8fee58593442bf834b30739" var salt = "dc0da04af8fee58593442bf834b30739" var aesUtil = new AesUtil(keySize, iterationCount); var plaintext = aesUtil.decrypt(salt, iv, encryptionKey, dataToDecrypt); console.log(plaintext); **//AESUtil - Utility class for CryptoJS** var AesUtil = function(keySize, iterationCount) { this.keySize = keySize / 32; this.iterationCount = iterationCount; }; AesUtil.prototype.generateKey = function(salt, passPhrase) { var key = CryptoJS.PBKDF2(passPhrase, CryptoJS.enc.Hex.parse(salt), { keySize: this.keySize, iterations: this.iterationCount }); return key; } AesUtil.prototype.decrypt = function(salt, iv, passPhrase, cipherText) { var key = this.generateKey(salt, passPhrase); var cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext: CryptoJS.enc.Base64.parse(cipherText) }); var decrypted = CryptoJS.AES.decrypt(cipherParams,key, { iv: CryptoJS.enc.Hex.parse(iv) }); return decrypted.toString(CryptoJS.enc.Utf8); } }