簡體   English   中英

使用SJCL在Javascript中加密並在PHP中解密

[英]Encrypt in Javascript with SJCL and decrypt in PHP

我想在Javascript中加密一些數據,並在發送它后可以解密它的php服務器。

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

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

我的問題是如何在php中解密我的數據。 如果可以通過示例代碼告訴我如何使用它。 (注意:SSL不是我的選擇,現在我打算使用KEY作為每個請求生成的隨機數)

謝謝

PHP 7.1.0最終添加了對iv和aad參數的openssl支持但是它錯誤地強制執行了12字節的iv長度。

在您的示例中,我們按如下方式加密:

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);

雖然這不完全回答你的問題,但我必須:

  1. 建議使用crypto-js作為大多數標准投訴JS加密,散列和KDF庫(這意味着提供的方法與PHP等價物兼容)
  2. 建議您至少閱讀本文的第一行,在那里您將了解為什么利用Javascript加密技術獲得的所有收益都是錯誤的安全感

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM