在 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:

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 使用 WordArrays,因此必须相应地转换密钥、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 代码中导出:

另外,所使用的数据也符合这些结论。


请注意,出于安全原因,可能无法使用静态 IV。相反,必须为每次加密生成一个随机 IV。
此外,即使密码长度正确,也不能将密码用作密钥。如果要使用密码,则需要派生密钥,例如与 PBKDF2.
测试用,数据当然够了。