2017-05-29 209 views
0

我有一个PHP脚本为给定的字符串创建AES-256-CBF8加密。 我想为javascript中的相同加密创建等效代码。 我用同样的CryptoJS。但我的加密代码的JavaScript和PHP都不同。如何在javascript中创建aes-256加密

我已经试过这样:

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

不要打扰,使用SSL证书 – user2182349

+0

@ user2182349我倒没到加密,你能解释一下为什么我需要SSL?我只想要一种可以用另一种语言开发的通用加密方法 – Rajan

+0

JavaScript全部在客户端。它可以被读取,加密可以被所有网站访问者检查。使用SSL证书将在数据从客户端发送到服务器时正确保护数据。加密非常复杂,您应该使用现有的解决方案,而不是编写自己的解决方案。 – user2182349

回答

1

您应该依靠后端来执行加密,这是更安全的方法。但是,如果您对使用AES256的安全性非常关注,应该使用SSL,因为隧道和其他属性会显着提高日常安全性。

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

由于多种原因,其中包括:

安全交付的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/

+0

感谢这宝贵的信息,但我只是想检查我的PHP代码是否可以在任何其他语言再现 – Rajan

+0

我发现这CryptoJS所以只是试图测试它 – Rajan

+0

我知道拉詹,但我想展示关于JS加密,明白吗?检查在Java保持可靠性在您的PHP API,好吗? – calexandre