gpt4 book ai didi

node.js - 解密工作使用 PHP (openssl) 而不是使用 javascript (cryptojs)

转载 作者:行者123 更新时间:2023-12-04 08:00:25 26 4
gpt4 key购买 nike

解密使用 php/openssl 工作,我可以获得我的纯数据。这是定义的调用:

<?php

function decryptString($data, $key)
{
return base64_decode(openssl_decrypt(base64_decode($data), "AES-256-CBC", $key, true, "h7oehNIHWGNIHxyN"));
}

function encryptString($data, $key)
{
return base64_encode(openssl_encrypt(base64_encode($data), "AES-256-CBC", $key, true, "h7oehNIHWGNIHxyN"));
}

echo 'encrypted: ' . encryptString('my sample text', '7f7720b911c2ecbb22637ed7adef41e82d44b6a0') . "\n";

echo 'decrypted: ' . decryptString('rFWejB1Pj6W3Gh1bheFqDZPMO9POKbhGPOP6eAH9BSk=', '7f7720b911c2ecbb22637ed7adef41e82d44b6a0') . "\n";
我得到这个输出:
encrypted: rFWejB1Pj6W3Gh1bheFqDZPMO9POKbhGPOP6eAH9BSk=
decrypted: my sample text
我尝试使用 cryptojs 实现相同的功能,但事情不起作用,我有时会收到“格式错误的 UTF-8 数据”,有时会出现其他模棱两可的错误(空字符串/无法读取未定义的属性长度,具体取决于我所做的代码更改)。所以这是迄今为止我做的最好的:(我目前有“格式错误的 UTF-8 数据”错误)
function decryptData(encrypted, pass) {
// encrypted is a base64 encoded string
let data = let data = Buffer.from(encrypted, "base64").toString(); // I tried this also [ let data = crypto.enc.Base64.parse(encrypted); ]

let key = crypto.enc.Utf8.parse(pass);
let decrypted = crypto.AES.decrypt(data, key,
{
iv: crypto.enc.Hex.parse('h7oehNIHWGNIHxyN'), // tried passing it as a simple string like this [ iv: 'h7oehNIHWGNIHxyN', ]
mode: crypto.mode.CBC,
padding: crypto.pad.NoPadding // I tried also with [ crypto.pad.Pkcs7 ]
}
);
let result = decrypted.toString(crypto.enc.Utf8); // tried this also [ let result = decrypted.toString(crypto.enc.Base64) ]
}
这是我得到的错误:
/home/vagrant/PhpstormProjects/untitled3/node_modules/crypto-js/core.js:513
throw new Error('Malformed UTF-8 data');
^

Error: Malformed UTF-8 data
at Object.stringify (/home/vagrant/PhpstormProjects/untitled3/node_modules/crypto-js/core.js:513:24)
at WordArray.init.toString (/home/vagrant/PhpstormProjects/untitled3/node_modules/crypto-js/core.js:268:38)
at decodeBase64String (/home/vagrant/PhpstormProjects/untitled3/decryptor.js:13:25)
at Object.<anonymous> (/home/vagrant/PhpstormProjects/untitled3/decryptor.js:19:1)

这可能看起来很明显,但我感到困惑,似乎没有任何效果。你能帮我一下吗?
我试图遵循但没有运气的问题:
  • CryptoJS AES Unable to decrypt
  • Encrypt with PHP, Decrypt with Javascript (cryptojs)
  • AES decryption in crypto-js returns empty string

  • 更新 1 :
    我编辑了问题以添加示例纯消息和完整的 php 加密/解密示例以及我的上一个代码版本。

    最佳答案

    AES 仅针对 16/24/32 字节 key 定义。您正在使用 40 字节的 key 。 PHP 隐式地将 key 削减为 32 字节,CryptoJS 不会,但由于错误 ( #293 ) 处理 key 而没有错误消息,当然会产生错误的结果。
    此外,密文必须作为 CipherParams 传递object 或 Base64 编码,IV 必须是 Utf8 编码,应该使用 PKCS7 padding,并且解密的数据是一个 base64 字符串(仍然需要 Base64 解码)。
    以下 CryptoJS 代码解密示例密文:

    function decryptData(encrypted, pass) {

    let decryptedWA = CryptoJS.AES.decrypt(
    encrypted, // Pass ciphertext Base64 encoded (or as CipherParams object)
    CryptoJS.enc.Utf8.parse(pass.substring(0, 32)), // Truncate key to 32 bytes
    {
    iv: CryptoJS.enc.Utf8.parse('h7oehNIHWGNIHxyN'), // UTF8 encode the IV
    mode: CryptoJS.mode.CBC, // default
    padding: CryptoJS.pad.Pkcs7 // default // Apply PKCS7 padding
    }
    );

    let decryptedB64 = decryptedWA.toString(CryptoJS.enc.Utf8);
    let decrypted = CryptoJS.enc.Base64.parse(decryptedB64).toString(CryptoJS.enc.Utf8); // Base64 decode the decrypted data

    return decrypted;
    }

    var ciphertext = "rFWejB1Pj6W3Gh1bheFqDZPMO9POKbhGPOP6eAH9BSk=";
    var key = "7f7720b911c2ecbb22637ed7adef41e82d44b6a0";
    console.log(decryptData(ciphertext, key));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

    请注意,静态 IV 是不安全的(但也许您仅将静态 IV 用于测试目的)。

    关于node.js - 解密工作使用 PHP (openssl) 而不是使用 javascript (cryptojs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66506206/

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