CryptoJs-通过PHP和Javascript加密/解密-简单输出加密字符串

CryptoJs-通过PHP和Javascript加密/解密-简单输出加密字符串,javascript,php,encryption,cryptojs,Javascript,Php,Encryption,Cryptojs,我想用Php和Javascript对一些字符串进行加密和解密,看看web,最好和最安全的方法似乎是CryptoJs 这篇文章不是重复的,因为它的输出字符串并不简单 这是我的代码,但是Js解密代码不起作用。 怎么了 <html> <head> <meta charset="UTF-8"> <title></title> <script src="h

我想用Php和Javascript对一些字符串进行加密和解密,看看web,最好和最安全的方法似乎是CryptoJs

这篇文章不是重复的,因为它的输出字符串并不简单

这是我的代码,但是Js解密代码不起作用。 怎么了

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
    </head>
    <body>
        <p>--- PHP ------------------</p>
    
        <?php
            function myCrypt($value, $passphrase, $iv){
                $encrypted_data = openssl_encrypt($value, 'aes-256-cbc', $passphrase, true, $iv);
                return base64_encode($encrypted_data);
            }
            
            function myDecrypt($value, $passphrase, $iv){
                $value = base64_decode($value);
                $data = openssl_decrypt($value, 'aes-256-cbc', $passphrase, true, $iv);
                return $data;
            }
            

            $valTxt="MyText";
            $pswd="MyPassword";
            $vector="1234567890123412";
            $encrypted = myCrypt($valTxt, $pswd, $vector);
            $decrypted = myDecrypt($encrypted, $pswd, $vector);
            
            echo "<p>Text to crypt --------> ".$valTxt." </p>";
            echo "<p>Password: ".$pswd." </p>";
            echo "<p>Vector: ".$vector." </p>";
            echo "<p>TextEncrypt: ".$encrypted." </p>";
            echo "<p>TextDecrypt: ".$decrypted." </p>";
        ?>
        
        <br><br><br>
        <p>--- Javascript ------------------</p>
        <p>JS-DataEncrypt: --------- <span id="DataEncrypt"></span></p>
        <p>JS-DataPassword: -------- <span id="DataPassword"></span></p>
        <p>JS-DataVector: ---------- <span id="DataVector"></span></p>
        <p>JS-TextDecrypted: ------- <span id="result"></span></p>
        
        <script>
            var DataEncrypt='<?php echo $encrypted;?>';
            var DataPassword='<?php echo $pswd;?>';
            var DataVector='<?php echo $vector;?>';
            
            //var key = CryptoJS.enc.Hex.parse(DataPassword);
            //var iv = CryptoJS.enc.Hex.parse(DataVector);
            //var decrypted = CryptoJS.AES.decrypt(DataEncrypt, key, { iv: iv });
            
            var decrypted = CryptoJS.AES.decrypt(DataEncrypt, DataPassword, { iv: DataVector });
            
            decrypted= CryptoJS.enc.Utf8.stringify(decrypted)
            
            
            
            document.getElementById("DataEncrypt").innerHTML = DataEncrypt;
            document.getElementById("DataPassword").innerHTML = DataPassword;
            document.getElementById("DataVector").innerHTML = DataVector;
            document.getElementById("result").innerHTML = decrypted;
        </script>
    
    
        
    </body>
</html>

---PHP------------------




---Javascript------------------

JS DataEncrypt:-----------

JS数据密码:-----------

JS数据向量:-------------

JS TextDecrypted:------

var DataEncrypt=''; var DataPassword=''; var数据向量=“”; //var key=CryptoJS.enc.Hex.parse(DataPassword); //var iv=CryptoJS.enc.Hex.parse(数据向量); //var decrypted=CryptoJS.AES.decrypt(DataEncrypt,key,{iv:iv}); var decrypted=CryptoJS.AES.decrypt(DataEncrypt,DataPassword,{iv:DataVector}); 解密=CryptoJS.enc.Utf8.stringify(解密) document.getElementById(“DataEncrypt”).innerHTML=DataEncrypt; document.getElementById(“DataPassword”).innerHTML=DataPassword; document.getElementById(“DataVector”).innerHTML=DataVector; document.getElementById(“结果”).innerHTML=已解密;

另外,如果输出字符串($encrypted)为16位A-Za-z0-9,则更好。。。是否可以更改PHP代码中的“aes-256-cbc”?

应考虑以下内容:

  • $passphrase
    不表示密码短语,而是表示密钥。此密钥的大小必须为32字节才能选择
    aes-256-cbc
    。如果太短,则填充0个值;如果太长,则截断。这是常见的错误源,因此应使用正好32字节的密钥。如果要使用密码短语,必须使用KDF(如PBKDF2)
  • 在第四个参数中,设置了标志,并且没有布尔表达式(如
    true
    )。如果数据应以二进制形式返回,则必须设置
    OPENSSL\u RAW\u data
    标志
  • 静态IV是不安全的,通常会为每次加密生成一个新的IV,并与密文一起发送给收件人。由于IV不是秘密的,它通常在字节级别放在密文前面而不加密
以下示例PHP代码(基于发布的代码):

返回以下结果:

1SF+kez1CE5Rci3H6ff8og==
MyText

用于解密的相应CryptoJS代码为:

var DataEncrypt=“1SF+kez1CE5Rci3H6ff8og=”;
var DataKey=CryptoJS.enc.Utf8.parse(“01234567890123456789012345678901”);
var DataVector=CryptoJS.enc.Utf8.parse(“1234567890123412”);
var decrypted=CryptoJS.AES.decrypt(DataEncrypt,DataKey,{iv:DataVector});
var decrypted=CryptoJS.enc.Utf8.stringify(已解密);
console.log(解密)

在PHP代码中,应考虑以下内容:

  • $passphrase
    不表示密码短语,而是表示密钥。此密钥的大小必须为32字节才能选择
    aes-256-cbc
    。如果太短,则填充0个值;如果太长,则截断。这是常见的错误源,因此应使用正好32字节的密钥。如果要使用密码短语,必须使用KDF(如PBKDF2)
  • 在第四个参数中,设置了标志,并且没有布尔表达式(如
    true
    )。如果数据应以二进制形式返回,则必须设置
    OPENSSL\u RAW\u data
    标志
  • 静态IV是不安全的,通常会为每次加密生成一个新的IV,并与密文一起发送给收件人。由于IV不是秘密的,它通常在字节级别放在密文前面而不加密
以下示例PHP代码(基于发布的代码):

返回以下结果:

1SF+kez1CE5Rci3H6ff8og==
MyText

用于解密的相应CryptoJS代码为:

var DataEncrypt=“1SF+kez1CE5Rci3H6ff8og=”;
var DataKey=CryptoJS.enc.Utf8.parse(“01234567890123456789012345678901”);
var DataVector=CryptoJS.enc.Utf8.parse(“1234567890123412”);
var decrypted=CryptoJS.AES.decrypt(DataEncrypt,DataKey,{iv:DataVector});
var decrypted=CryptoJS.enc.Utf8.stringify(已解密);
console.log(解密)

谢谢,非常感谢。。。现在我决定用aes-128-ofb编码,在这种情况下,密钥必须是16位数字。编码和解码在PHP工作,但不是在Javascript。。。但在CryptoJs上,aes-128-ofb是可以接受的。怎么了?这里JsTest函数myCrypt($value,$key,$iv){$encrypted_data=openssl_encrypt($value,'aes-128-ofb',$key,openssl_RAW_data,$iv);返回base64_encode($encrypted_data);}$valTxt=“MyText”$key=“1234567890123456”$vector=“123456789013412”$加密=myCrypt($valTxt,$key,$vector);echo$加密//GlwC/Kg在花括号中,除了IV之外,还必须定义模式和填充:
{IV:DataVectorUtf8,模式:CryptoJS.mode.OFB,填充:CryptoJS.pad.NoPadding}
。如果有更多的问题,请发布一个新问题,否则这个问题会变得混乱,并且注释中的代码很难阅读。谢谢。好的。。。但是有一个错误。。。看这里:我必须写一篇新文章吗?你需要点击左侧面板上的参考资料链接并添加CryptoJS的参考资料(例如)。然后点击加号。在添加引用之后,代码将成功执行。谢谢,非常感谢。。。现在我决定用aes-128-ofb编码,在这种情况下,密钥必须是16位数字。编码和解码在PHP工作,但不是在Java