javascript - 如何在 JavaScript 中创建 aes-256 加密

标签 javascript php encryption cryptography

我有一个 PHP 脚本,可以为给定字符串创建 AES-256-CBF8 加密。 我想在 JavaScript 中为相同的加密创建等效的代码。 我用 CryptoJS 来做同样的事情。但我的 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,正如评论中已经说过的那样,因为隧道和其他属性可以显着提高例程的安全性。

我知道网络上有很多客户端例程,但使用它们并不好,恕我直言,与密码学的后端例程相比,客户端的缺陷不胜枚举。

For several reasons, including the following:

Secure delivery of Javascript to browsers is a chicken-egg problem.

Browser Javascript is hostile to cryptography.

The "view-source" transparency of Javascript is illusory.

Until those problems are fixed, Javascript isn't a serious crypto research environment, and suffers for it.

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

You can. It's harder than it sounds, but you safely transmit Javascript crypto to a browser using SSL. The problem is, having established a secure channel with SSL, you no longer need Javascript cryptography; you have "real" cryptography. Meanwhile, the Javascript crypto code is still imperiled by other browser problems.

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

关于javascript - 如何在 JavaScript 中创建 aes-256 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44234137/

相关文章:

javascript - 自动将凭据传递到下一页的脚本

javascript - WordPress自定义插件按钮onclick调用php函数

php - 使用 FFMPEG 或可能的 HTML5 获取视频信息

Java:使用 Bouncy CaSTLe 进行 PGP 加密

用于 HTTPS 连接的 Powershell SSL TLS 密码套件

javascript - Vuejs 从 .js 文件返回数据

javascript - 如何在javascript中对嵌套对象数组进行排序

PHP:JSON 或 XML 解析器更快吗?

php - 如何获取每行mysql的总和

php - 将 crypt() salt 存储在数据库中以进行密码比较是否安全