gpt4 book ai didi

javascript - 使用 CryptoJS 在 Javascript 中进行 Java AES 加密

转载 作者:行者123 更新时间:2023-12-03 06:22:36 27 4
gpt4 key购买 nike

我正在尝试使用 Javascript 和 CryptoJS 复制 Java 应用程序中使用的加密。我不太确定应该如何复制 SecretKeySpec,因为 CryptoJS 似乎需要一个字符串作为 key 。

这是我需要在 JS 中复制的 Java 加密代码:

public byte[] encrypt(byte[] origin)
{
String key = "testkey";
SecretKeySpec sks = new SecretKeySpec(convertAESKey(key), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[16];
cipher.init(Cipher.ENCRYPT_MODE, sks, new IvParameterSpec(iv));
return cipher.doFinal(origin);
}

private byte[] convertAESKey(String key)
{
byte[] keyBytes;
keyBytes = key.getBytes("UTF-8");
byte[] keyBytes16 = new byte[16];
System.arraycopy(keyBytes, 0, keyBytes16, 0,
Math.min(keyBytes.length, 16));
return keyBytes16;
}
}

到目前为止我的 JS 代码:

var iv = new Uint8Array(16);
var key = "testkey";

var encrypted = CryptoJS.AES.encrypt(
someByteArray,
key,
{
iv: iv,
mode: CryptoJS.mode.CBC
}
);

此外,cipher的最终输出是一个加密的字节数组。 CryptoJS 的最终输出似乎是一个带有 cipherText 的对象。有没有办法以字节数组的形式获取输出?

我现在唯一能想到的就是将加密的响应转换为字符串,然后将其转换为字节数组,但这似乎与Java加密的输出不匹配。

最佳答案

CryptoJS 默认情况下不处理 Uint8Array,因此我不会使用它,而是使用默认的 WordArray 来表示二进制数据。

var iv = CryptoJS.lib.WordArray.create([0, 0, 0, 0]);
var key = "testkey";

key = CryptoJS.enc.Utf8.parse(key);
for (var i = key.words.length; i < 4; i++) {
key.words[i] = 0;
}
key.sigBytes = 16;
key.clamp();

var encrypted = CryptoJS.AES.encrypt(
someByteArray,
key,
{
iv: iv,
mode: CryptoJS.mode.CBC
}
);
console.log(encrypted.ciphertext.toString(CryptoJS.enc.Hex));

这将给出一个十六进制字符串,可以轻松地将其与 Java 生成的密文进行比较。

<小时/>

这段代码不太安全:

  • IV 必须是不可预测的(即:随机)。不要使用静态 IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前何时发送过相同的消息前缀。 IV 不是 secret 的,因此您可以将其与密文一起发送。通常,它只是简单地添加到密文之前并在解密之前将其切掉。

  • key 必须是随机的(读作:看起来像随机噪声)。文本看起来并不随机,如果(错误地)使用密码作为 key ,您会严重降低安全性。如果您有密码,那么您需要使用 PBKDF2、bcrypt、scrypt 或 Argon2 等具有高迭代次数/成本系数的东西从中派生 key 。

  • 您应该验证您的密文,以便检测(恶意)操纵。如果您不这样做,那么这可能容易受到填充预言机攻击。身份验证可以通过 GCM 或 EAX 等经过身份验证的操作模式来完成,也可以使用具有强大 MAC 的加密然后 MAC 方案(例如 HMAC-SHA256)来完成。

关于javascript - 使用 CryptoJS 在 Javascript 中进行 Java AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38796839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com