javascript中的AES加密和java中的解密
我有一个激动人心的Web服务,它用AES加密和解密,现在我必须用与java相同的方式加密,但使用javascript。 我已经阅读了所有关于使用javascript执行此操作的主题,但还没有找到任何有用的解决方案。 Javascript总是以不同的方式加密,我不知道为什么 这是令人兴奋的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
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
}