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

时间:2012-08-16 06:51:57

标签: php javascript cryptography sjcl

我想在Javascript中加密一些数据,并在发送它后可以解密它的php服务器。

我打算将JS加密库用作SJCL:http://crypto.stanford.edu/sjcl/。到目前为止,我可以在JS中加密我的数据并通过ajax发送它。 我的JS代码就像这样。

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

我的问题是如何在php中解密我的数据。如果可以通过示例代码告诉我如何使用它。 (注意:SSL不是我的选择,现在我打算使用KEY作为每个请求生成的随机数)

由于

2 个答案:

答案 0 :(得分:3)

PHP 7.1.0最终添加了openssl支持iv和aad参数 BUT 它错误地强制执行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 :(得分:0)

虽然这不完全回答你的问题,但我必须:

  1. 建议使用crypto-js作为大多数标准投诉JS加密,散列和KDF库(这意味着所提供的方法与PHP等价物兼容)
  2. 建议您至少阅读this article的第一行 在那里你将了解为什么利用Javascript加密获得的所有收益都是错误的安全感