2012-08-16 70 views
3

我想要使用Javascript加密一些數據,並且在將它發送給PHP服務器後,它可以被解密。使用SJCL在Javascript中加密並在PHP中解密

我打算使用JS加密庫作爲SJCL:http://crypto.stanford.edu/sjcl/。到目前爲止,我可以在JS中加密我的數據並通過ajax發送。 我的JS代碼lool是這樣的。

sjcl.encrypt('a_key','secured_message'); 

我的問題是我如何在php中解密我的數據。如果有可能告訴我如何用一個示例代碼來做到這一點。 (注:SSL是不是我的選擇,現在我打算使用密鑰按每個請求生成的隨機數)

感謝

+1

您打算如何轉讓鑰匙? – Adi 2012-08-16 06:56:24

+0

@Adnan我計劃將會話ID用作密鑰。感謝您的答覆。 – 2012-08-16 06:59:37

+12

所以你要用同一個通道上的解密密鑰發送一條加密的消息。你知道你的加密和發送純文本一樣好,對吧? – Adi 2012-08-16 07:02:01

回答

0

雖然這並不完全回答你的問題,我有:

  1. 建議使用crypto-js作爲最標準的投訴JS加密,散列和KDF庫(這意味着所提供的方法是compatibile用PHP當量)
  2. 建議您閱讀的this article ,你將至少第一線LEA RN爲什麼從使用Java腳本加密所有增益爲安全
2

PHP 7.1.0的錯覺終於增加了對四和AAD參數它錯誤地強制執行一個12字節的長度IV openssl支持。

在你的榜樣,我們加密如下:

var sjcl = require('./sjcl'); 
console.log(sjcl.encrypt('a_key', 'secured_message', { mode: 'ccm', iv: sjcl.random.randomWords(3, 0) })); 

要獲取:

{"iv":"YAKkgmNCcVawQtiB","v":1,"iter":10000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"CwEDE4PXBzY=","ct":"pJ7nmnAGXiC9AD29OADlpFdFl0d/MxQ="} 

因此,考慮到:

$password = 'a_key'; 
$input = json_decode('{"iv":"YAKkgmNCcVawQtiB","v":1,"iter":10000,"ks":128,"ts":64,"mode":"ccm","adata":"","cipher":"aes","salt":"CwEDE4PXBzY=","ct":"pJ7nmnAGXiC9AD29OADlpFdFl0d/MxQ="}', true); 

我們可以在PHP 7.1.0作爲解密如下:

$digest = hash_pbkdf2('sha256', $password, base64_decode($input['salt']), $input['iter'], 0, true); 
$cipher = $input['cipher'] . '-' . $input['ks'] . '-' . $input['mode']; 
$ct  = substr(base64_decode($input['ct']), 0, - $input['ts']/8); 
$tag  = substr(base64_decode($input['ct']), - $input['ts']/8); 
$iv  = base64_decode($input['iv']); 
$adata = $input['adata']; 

$dt = openssl_decrypt($ct, $cipher, $digest, OPENSSL_RAW_DATA, $iv, $tag, $adata); 
var_dump($dt); 
相關問題