在 JavaScript 中解密 AES
Decrypt AES in JavaScript
我正在使用 swift 语言的 AES256 加密文本并将其输出为十六进制。我想解密我用JS收到的这段代码,但我无法得到结果。我尝试了 CryptoJS 库,但仍然无法获得我想要的结果。我想要的只是当我输入 IV、密码和密文时会给我解码版本的 js 代码。
const crypto = require("crypto");
var key = "";
const iv = "";
const token = "";
function decrypt(token, iv, key) {
const decrypter = crypto.createDecipheriv("aes-256-cbc", key, iv);
let decrypted = decrypter.update(token, "hex", "utf8");
decrypted += decrypter.final("utf8");
return decrypted
}
console.log(decrypt(token, iv, key));
使用上面的 Node.js 代码,我实现了我想要的,但我想用普通的 JS 代码来实现,而不是使用 node.js。我不想弄乱服务器。如果你能帮上忙,我会很高兴。
编辑:
我正在使用 Swift 语言的 CryptoSwift 库。
func encryption(uuid: String, token: String) -> String {
do {
let aes = try AES(key: String(uuid.prefix(32)), iv: String(uuid.prefix(16)))
let ciphertext = try aes.encrypt(Array(token.utf8))
let encrypttext = ciphertext.toHexString()
return encrypttext
}
catch {
return "error"
}
}
我尝试使用来自以下站点的代码对 CryptoJS 做一些事情,但它不像 Node.js 中的代码那样工作。
编辑2:
- 我一直在尝试不同的东西,但不太明白。添加 PBKDF2 时出现错误。我没有完全理解这个问题。
var password = "6268890F-9B58-484C-8CDC-34F9C6A9";
var iv = "6268890F-9B58-48";
var cipher = "79a247e48ac27ed33ca3f1919067fa64";
/*
var key = CryptoJS.PBKDF2(password, {
keySize: 32
});
*/
var dec= CryptoJS.enc.Hex.parse(cipher);
const decrypted = CryptoJS.AES.decrypt({
ciphertext: dec
},
password, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
console.log(decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/pbkdf2.js"></script>
CryptoJS 使用 WordArray
s,因此必须相应地转换密钥、IV 和密文。为此,必须使用合适的编码器。此外 decrypt()
期望密文为 CipherParams
object.
这导致以下可能的 CryptoJS 实现:
var ciphertext = "79a247e48ac27ed33ca3f1919067fa64";
var key = "6268890F-9B58-484C-8CDC-34F9C6A9";
var iv = "6268890F-9B58-48";
var ciphertextWA = CryptoJS.enc.Hex.parse(ciphertext);
var keyWA = CryptoJS.enc.Utf8.parse(key);
var ivWA = CryptoJS.enc.Utf8.parse(iv);
var ciphertextCP = { ciphertext: ciphertextWA };
var decrypted = CryptoJS.AES.decrypt(
ciphertextCP,
keyWA,
{ iv: ivWA }
);
console.log(decrypted.toString(CryptoJS.enc.Utf8)); // Apple
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
这与发布的同样成功解密测试数据的 NodeJS 代码在功能上相同。
关于评论中关于编码的问题:
通常,解密方必须了解用于加密的编码。但是,在这种情况下,编码可以从发布的 NodeJS 代码中导出:
- 解密,指定密文的输入编码为
'hex'
,参见decipher.update()
。
key
和 iv
被定义为 UTF-8 编码的字符串,参见 crypto.createDecipheriv()
.
另外,所使用的数据也符合这些结论。
请注意,出于安全原因,可能无法使用静态 IV。相反,必须为每次加密生成一个随机 IV。
此外,即使密码长度正确,也不能将密码用作密钥。如果要使用密码,则需要派生密钥,例如与 PBKDF2.
测试用,数据当然够了。
我正在使用 swift 语言的 AES256 加密文本并将其输出为十六进制。我想解密我用JS收到的这段代码,但我无法得到结果。我尝试了 CryptoJS 库,但仍然无法获得我想要的结果。我想要的只是当我输入 IV、密码和密文时会给我解码版本的 js 代码。
const crypto = require("crypto");
var key = "";
const iv = "";
const token = "";
function decrypt(token, iv, key) {
const decrypter = crypto.createDecipheriv("aes-256-cbc", key, iv);
let decrypted = decrypter.update(token, "hex", "utf8");
decrypted += decrypter.final("utf8");
return decrypted
}
console.log(decrypt(token, iv, key));
使用上面的 Node.js 代码,我实现了我想要的,但我想用普通的 JS 代码来实现,而不是使用 node.js。我不想弄乱服务器。如果你能帮上忙,我会很高兴。
编辑: 我正在使用 Swift 语言的 CryptoSwift 库。
func encryption(uuid: String, token: String) -> String {
do {
let aes = try AES(key: String(uuid.prefix(32)), iv: String(uuid.prefix(16)))
let ciphertext = try aes.encrypt(Array(token.utf8))
let encrypttext = ciphertext.toHexString()
return encrypttext
}
catch {
return "error"
}
}
我尝试使用来自以下站点的代码对 CryptoJS 做一些事情,但它不像 Node.js 中的代码那样工作。
编辑2:
- 我一直在尝试不同的东西,但不太明白。添加 PBKDF2 时出现错误。我没有完全理解这个问题。
var password = "6268890F-9B58-484C-8CDC-34F9C6A9";
var iv = "6268890F-9B58-48";
var cipher = "79a247e48ac27ed33ca3f1919067fa64";
/*
var key = CryptoJS.PBKDF2(password, {
keySize: 32
});
*/
var dec= CryptoJS.enc.Hex.parse(cipher);
const decrypted = CryptoJS.AES.decrypt({
ciphertext: dec
},
password, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
console.log(decrypted.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/pbkdf2.js"></script>
CryptoJS 使用 WordArray
s,因此必须相应地转换密钥、IV 和密文。为此,必须使用合适的编码器。此外 decrypt()
期望密文为 CipherParams
object.
这导致以下可能的 CryptoJS 实现:
var ciphertext = "79a247e48ac27ed33ca3f1919067fa64";
var key = "6268890F-9B58-484C-8CDC-34F9C6A9";
var iv = "6268890F-9B58-48";
var ciphertextWA = CryptoJS.enc.Hex.parse(ciphertext);
var keyWA = CryptoJS.enc.Utf8.parse(key);
var ivWA = CryptoJS.enc.Utf8.parse(iv);
var ciphertextCP = { ciphertext: ciphertextWA };
var decrypted = CryptoJS.AES.decrypt(
ciphertextCP,
keyWA,
{ iv: ivWA }
);
console.log(decrypted.toString(CryptoJS.enc.Utf8)); // Apple
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
这与发布的同样成功解密测试数据的 NodeJS 代码在功能上相同。
关于评论中关于编码的问题:
通常,解密方必须了解用于加密的编码。但是,在这种情况下,编码可以从发布的 NodeJS 代码中导出:
- 解密,指定密文的输入编码为
'hex'
,参见decipher.update()
。 key
和iv
被定义为 UTF-8 编码的字符串,参见crypto.createDecipheriv()
.
另外,所使用的数据也符合这些结论。
请注意,出于安全原因,可能无法使用静态 IV。相反,必须为每次加密生成一个随机 IV。
此外,即使密码长度正确,也不能将密码用作密钥。如果要使用密码,则需要派生密钥,例如与 PBKDF2.
测试用,数据当然够了。