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

时间:2017-05-29 03:15:04

标签: 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);

请帮助我。

1 个答案:

答案 0 :(得分:1)

你应该依靠后端进行加密,这是更安全的方法。但是如果您非常关心使用AES256的安全性,那么应该使用已经在评论中说过的SSL,因为隧道和其他属性会显着提高您日常工作的安全性。

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

  

有几个原因,包括以下内容:

     

将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-considered-harmful/