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

javascript中的AES加密和java中的解密,java,javascript,encryption,aes,Java,Javascript,Encryption,Aes,我有一个激动人心的Web服务,它用AES加密和解密,现在我必须用与java相同的方式加密,但使用javascript。 我已经阅读了所有关于使用javascript执行此操作的主题,但还没有找到任何有用的解决方案。 Javascript总是以不同的方式加密,我不知道为什么 这是令人兴奋的java代码: public static String encrypt(String data) throws Exception { byte[] keyValue = encryptionKey.g

我有一个激动人心的Web服务,它用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):

或其中一种(胡言乱语):


我不能改变java的实现,也不能改变我们实现安全性的方式。是否有人在这方面更有经验,谁能告诉我我做错了什么?

您只查看加密算法,但您也关心块模式和填充,否则您将无法创建兼容的结果。根据CryptoJS,默认值为
CBC
PKCS7
,而Java代码使用
ECB
PKCS5


你必须带着它去比赛。您可以将CryptoJS设置为使用
ECB
。关于填充,它更棘手,因为CryptoJS没有列出所支持的
PKCS5
,Java也没有列出
PKCS7
,事实上,它列出的内容很少,因此AES提供程序支持的填充算法可能取决于实现,但至少两者都支持
NoPadding
,Java和CryptoJS。

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

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)
});

要解密使用javaaes/ECB/PKCS5Padding生成的哈希,还需要在js(nodejs)中创建一个带有填充的解密密码


好的,谢谢这让我更进一步。我已经阅读了关于填充的下一个内容:PKCS#5和PKCS#7填充之间只有一个主要区别是块大小。PKCS#5填充仅针对8字节块大小定义。PKCS#7填充适用于从1到255字节的任何块大小。既然我已经将块模式设置为ECB,那么这应该可以工作了。但我仍然没有得到相同的结果,我发现我的问题是我必须执行var encryptionKey=CryptoJS.enc.Utf8.parse(key);否则我的密钥不会被随意使用,crypto js会使我成为一个随机密钥,并分别使用time@Cenz0请发布完整的解决方案。您的模块在浏览器中使用时似乎已损坏。我得到错误
找不到模块'./lib/hmac'
这是node.js模块,它在node中工作正常。如果您需要在浏览器中使用它,它可能不太容易,因为它可能在内部使用本机模块
// 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);
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)
});
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
}