javascript中的AES加密和java中的解密

我有一个令人兴奋的网络服务,用AES加密和解密,现在我必须以与java相同的方式加密,但是在javascript中。 我已经阅读了有关在javascript中执行此操作的所有主题,但未找到任何有用的解决方案。 Javascript总是以不同的方式加密,我找不到原因。

这是令人兴奋的java代码:

public static String encrypt(String data) throws Exception { byte[] keyValue = encryptionKey.getBytes(); Key key = new SecretKeySpec(keyValue, "AES"); Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding"); c.init(Cipher.ENCRYPT_MODE, key); byte[] encVal = c.doFinal(data.getBytes()); String encryptedValue = new BASE64Encoder().encode(encVal); return encryptedValue; } 

这是我倾向于使用的javascript代码,但提供了不同的加密(CryptoJS):

 var encrypted = CryptoJS.AES.encrypt(data, encryptionKey); 

或其中任何一个(GibberishAES):

 // Defaults to 256 bit encryption var encrypted = GibberishAES.enc(data, encryptionKey); // change the bit encrytion GibberishAES.size(128); var encrypted = GibberishAES.enc(data, encryptionKey); GibberishAES.size(192); var encrypted = GibberishAES.enc(data, encryptionKey); 

我无法改变java中的实现或我们的安全方式。 有人有更多经验可以告诉我这里我做错了什么吗?

您正在查看加密算法,但您也需要关注块模式和填充,否则您将无法创建兼容的结果。 根据code.google.com ,您的Java代码使用ECBPKCS5PKCS5的默认值为CBCPKCS7

你必须把它带来匹配。 您可以设置CryptoJS以使用ECB 。 关于填充,它更加棘手,因为CryptoJS没有列出支持的PKCS5 ,而Java没有列出PKCS7 ,事实上,它列出的很少,因此可能是实现依赖于AES提供程序支持的填充算法,但至少支持NoPadding由Java和CryptoJS共同完成。

这是使用ezcrypto模块在JavaScript(Node.js)中实现“AES / ECB / PKCS5Padding”的工作解决方案

 const Crypto = require('ezcrypto').Crypto; let whatToEncryptAsUtf8 = Crypto.charenc.UTF8.stringToBytes(whatToEncrypt); let keyAsUtf8 = Crypto.charenc.UTF8.stringToBytes(key); let encrypted = Crypto.AES.encrypt(whatToEncryptAsUtf8, keyAsUtf8, { mode: new Crypto.mode.ECB(Crypto.pad.pkcs7) }); 

要解密使用JAVA AES / ECB / PKCS5Padding生成的哈希,您需要使用js(nodejs)中的填充创建解密密码。

 const crypto = require('crypto'); function decrypt(data){ var decipher = crypto.createCipheriv("aes-128-ecb", 'SAME_KEY_AS_JAVA', ''); var dec = decipher.update(data,'base64','utf8'); dec += decipher.final('utf8'); return dec }