Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 实现Php open_ssl_将AES 256 CBC解密为CryptoJS_Javascript_Encryption_Aes_Cryptojs_Php Openssl - Fatal编程技术网

Javascript 实现Php open_ssl_将AES 256 CBC解密为CryptoJS

Javascript 实现Php open_ssl_将AES 256 CBC解密为CryptoJS,javascript,encryption,aes,cryptojs,php-openssl,Javascript,Encryption,Aes,Cryptojs,Php Openssl,我尝试在ReactJs(而不是NodeJs)中生成以下代码,但这在JS中不起作用 PHP中的原始代码运行良好: function decryptOpensslDigestSHA256Sum($data) { $key = hash('sha256', 'Nootric2703202'); //My password has 14 characters $method = 'AES-256-CBC'; $data = base64

我尝试在ReactJs(而不是NodeJs)中生成以下代码,但这在JS中不起作用

PHP中的原始代码运行良好:

    function decryptOpensslDigestSHA256Sum($data)
    {
        $key = hash('sha256', 'Nootric2703202'); //My password has 14 characters

        $method = 'AES-256-CBC';

        $data = base64_decode($data);

        $iv_size = openssl_cipher_iv_length($method);

        $salt_header = substr($data, 0, $iv_size);

        if (substr($salt_header, 0, 8) != "Salted__") {
            return "";
        }
        $salt = substr($salt_header, 8);

        $creds = extractOpenSSLCreds($key, $salt, $iv_size);

        $data = openssl_decrypt(substr($data, $iv_size), $method, $creds['password'], OPENSSL_RAW_DATA, $creds['iv']);

        return $data;
    }

    function extractOpenSSLCreds($key, $salt, $iv_size)
    {
        $m = "";
        while (strlen($m) < 48) {
            $m .= hashCryptoDigestSHA256Sum($m, $key, $salt);
        }
        $result = array(
            'password' => substr($m, 0, 32),
            'iv' => substr($m, 32, $iv_size)
        );
        return $result;
    }

    function hashCryptoDigestSHA256Sum($hash, $key, $salt)
    {
        $hash.= $key.$salt;
        $prev = openssl_digest($hash, "sha256", true);
        return $prev;
    }
如果调用JS中的最后一个函数:

    const dec = CryptoJSAesDecrypt("U2FsdGVkX1++7PN6CsF5Bi38t0N3EjXpH5oGpaIZXUwk4T8QCwcATjvA4b/8VaxD8nf/MZhKPnWb1L8raLR4lw==");
    console.log("Data Decrypted: " + dec);
这显示为空: 解密的数据:

如果我使用此数据调用:

    const dec = CryptoJSAesDecrypt("U2FsdGVkX18BI0VniavN78vlhR6fryIan0VvUrdIr+YeLkDYhO2xyA+/oVXJj/c35swVVkCqHPh9VdRbNQG6NQ==");
    console.log("Data Decrypted: " + dec);
在Javascript函数中,我替换这一行:

var password = 'Nootric2703202'
关于这一点:

var password = 'mypassword'
这个很好用!但是用我自己的密码&我的加密数据,这个JS解密代码不起作用。 请帮帮忙

const dec=cryptojsaesdefcrypt();
console.log(“解密:+dec”);
函数CryptoJSAesDecrypt(加密){
//1.将密文和salt分开
var encrypted=“U2FsdGVkX1++7PN6CsF5Bi38t0N3EjXpH5oGpaIZXUwk4T8QCwcATjvA4b/8VaxD8nf/MZhKPnWb1L8raLR4lw=”;
console.log(“加密:”,加密);
var encryptedWA=CryptoJS.enc.Base64.parse(加密);
var prefixWA=CryptoJS.lib.WordArray.create(encryptedWA.words.slice(0,8/4));//Salted_uuuuuu前缀
var saltWA=CryptoJS.lib.WordArray.create(encryptedWA.words.slice(8/4,16/4));//8字节salt:0x0123456789ABCDEF
var ciphertextWA=CryptoJS.lib.WordArray.create(encryptedWA.words.slice(16/4,encryptedWA.words.length));//密文
//2.使用PBKDF2确定键和IV
var密码='Nootric2703202'
var keyIvWA=CryptoJS.PBKDF2(
密码,
萨尔特瓦,
{
键大小:(32+16)/4、//键和IV
迭代次数:10000次,
hasher:CryptoJS.algo.SHA256
}
);
var keyWA=CryptoJS.lib.WordArray.create(keyIvWA.words.slice(0,32/4));
var ivWA=CryptoJS.lib.WordArray.create(keyIvWA.words.slice(32/4,(32+16)/4));
//3.解密
var decryptedWA=CryptoJS.AES.decrypt(
{ciphertext:ciphertextWA},
凯瓦,
{iv:ivWA}
);
var decrypted=decryptedWA.toString(CryptoJS.enc.Utf8)
返回解密;
}

PHP实现使用作为密钥派生函数,因此与CryptoJS密钥派生兼容

但是,CryptoJS默认情况下将MD5作为摘要应用,而PHP代码使用SHA256(请注意,从v1.1.0版开始,OpenSSL已将默认摘要从MD5更改为SHA256)。
此外,应用于密钥派生函数的密码不是密码本身(即Nootric2703202),而是密码的十六进制编码SHA256哈希

如果考虑到这一点,则使用CryptoJS解密为:

var密码='Nootric2703202';
var passwordHashWA=CryptoJS.SHA256(密码);
var passwordHashHex=passwordHashWA.toString(CryptoJS.enc.Hex);
var ciphertext='U2FsdGVkX1++7PN6CsF5Bi38t0N3EjXpH5oGpaIZXUwk4T8QCwcATjvA4b/8VaxD8nf/MZhKPnWb1L8raLR4lw=';
CryptoJS.algo.EvpKDF.cfg.hasher=CryptoJS.algo.SHA256.create();
var data=CryptoJS.AES.decrypt(密文,passwordHashHex);
log(data.toString(CryptoJS.enc.Utf8))

您应该另外发布关于第一个代码段的内容:1。执行加密时使用的确切OpenSSL语句,2。一个完整的测试示例。当前缺少密码,因此无法复制,请参阅。只是猜测一下,但可能使用了不同的键派生函数(
EVP_BytesToKey()
在上面的代码段中,PBKDF2在下面的代码段中)。如果你提供丢失的信息,可以说更准确。真的!我不太明白使用了什么样的键派生函数。。。正如您在JS代码中所说,这使用了PBKDF2,但在PHP中,我真的不知道使用了什么函数。我现在发布了我真实代码的JS示例!现在我正在尝试使用这个库节点forge。我们的谈话目的是否相互矛盾?PHP代码应该解密用OpenSSL加密的密文。对吗?然后请为加密和/或解密发布相应的OpenSSL语句。如果是这样的话,可以使用现有的功能移植到JavaScript,这样可以减少工作量。否则,必须移植整个PHP逻辑。对于CryptoJS和node-forge都是如此。使用Go代码,我找到了CryptoJS/OpenSSL的连接,请参阅我的答案。
var password = 'Nootric2703202'
var password = 'mypassword'