如何在JavaScript中创建AES-256加密



我有一个PHP脚本,该脚本为给定的字符串创建AES-256-CBF8加密。我想在JavaScript中为同一加密创建一个等效的代码。我也使用了同样的加密j。但是我的JavaScript和PHP的加密代码都不同。

我尝试了以下方法:

php:

$secret_key = 'qIthpcluB8xA4Y0CGS7ahl3kfluBay7p';
    $secret_iv = '99FF8B0332880F69D14110316D640AFFA8F422311C1576AF055A00498A88EEE80D337FBB1E4B8081A0901E9A1750806B2B371E7438AB968E4C1C8D3EF05A81ED';
    $output = false;
    $encrypt_method = "AES-256-CFB8";
    $key = hash( 'sha256', $secret_key );
    $iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );
    if( $action == 'enc' )
    {
        $output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) );
    }
    else if( $action == 'dec' )
    {
        $output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv );
    }
    else
    {
        return false;
    }
    return $output;

javaScript:

var message = '{"Request":"login","Username":"123456","API_AccessKey":"b57a4d91965d456","GMT_Timestamp":"101439"}';
var key = CryptoJS.SHA256("qIthpcluB8xA4Y0CGS7ahl3kfluBay7p"); //length=22
console.log(key);

var iv1  = CryptoJS.SHA256("99FF8B0332880F69D14110316D640AFFA8F422311C1576AF055A00498A88EEE80D337FBB1E4B8081A0901E9A1750806B2B371E7438AB968E4C1C8D3EF05A81ED"); //length=22
var iv = iv1.toString().substring(0,16);

var key1 = key.toString();

console.log(iv);
console.log(key);
//iv.substring(0,16);
//iv is now 987185c4436764b6e27a72f2fffffffd, length=32
var cipherData = CryptoJS.AES.encrypt(message, key1, { iv: iv },{mode: CryptoJS.mode.CFB8});
console.log(cipherData.toString());
//var cipherData="NUUyUDZPVGFLUzVCSUZpRUR3S28vN3dwY2ZLbjVTeDRDc25aTUdmS2pYc3VlTFBFWEpxVFVENmRIV1BCTUdxQXo4UHpOdTlqK2lqcXVNWlBZdTQvTlFlSW5CZnI5UHdiQ1ovNEhCUHU2KytyT3dyOCtrLzBmQT09";

var data = CryptoJS.AES.decrypt(cipherData.toString(), key1, { iv: iv },{mode: CryptoJS.mode.CFB});
console.log(data);
var NewCipher = CryptoJS.enc.Utf8.parse(cipherData);
document.getElementById("demo0").innerHTML = message;
document.getElementById("demo1").innerHTML = CryptoJS.enc.Base64.stringify(NewCipher);
document.getElementById("demo2").innerHTML = data;
//document.getElementById("demo3").innerHTML = CryptoJS.enc.Base64(data.toString(CryptoJS.enc.Utf8));
document.getElementById("demo3").innerHTML = data.toString(CryptoJS.enc.Utf8);

请在此帮助我。

您应该依靠后端进行加密,这是这样做的更安全的方法。但是,如果您非常关心使用AES256的安全性,则应按照评论中已经说过的SSL,因为隧道和其他属性会大大提高您的日常安全性。

我知道网络周围的客户端有很多例程,但是使用它们不好,客户端的缺陷与分布造象的后端例程相比,imho。

出于多种原因,包括以下原因:

安全地将JavaScript交付给浏览器是一个鸡蛋问题。

浏览器JavaScript对密码学是敌对的。

JavaScript的" View-Source"透明度是虚幻的。

直到解决这些问题,JavaScript并不是严重的加密货币 研究环境,为此遭受痛苦。

关于SSL解决方案,它已经提供了比您自己的JS例程更好地使用某种安全性的:

你可以。它比听起来难得难,但是您可以安全地传输 JavaScript加密使用SSL浏览器。问题是, 使用SSL建立了一个安全的频道,您不再需要JavaScript 密码学;您有"真实的"密码学。同时,JavaScript 加密代码仍然受到其他浏览器问题的损害。

https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considography-considered-harmful/

最新更新