加密在Javascript与SJCL和PHP解密(Encrypt in Javascript wit

2019-07-31 01:02发布

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

我planig用JS加密库为SJCL: http://crypto.stanford.edu/sjcl/ 。 到现在为止,我可以在JS我的资料加密,并通过AJAX后发送。 我的JS代码LOOL这样。

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

我的问题是我怎么解密的PHP我的数据。 如果可能的话告诉我怎么用一个例子代码来做到这一点。 (注:SSL是不是我的选择,现在我打算使用密钥按每个请求生成的随机数)

谢谢

Answer 1:

PHP 7.1.0最后添加openssl支持用于IV和AAD参数, 它错误地强制一个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);


Answer 2:

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

  1. 建议使用加密JS作为最标准的投诉JS加密,散列和KDF库(这意味着所提供的方法是compatibile用PHP当量)
  2. 建议您阅读的至少第一线这篇文章中 ,您将了解为什么从使用Java脚本加密所有的增益是错误的安全感


文章来源: Encrypt in Javascript with SJCL and decrypt in PHP