4

Javascriptでいくつかのデータを暗号化したいのですが、それをphpサーバーに送信した後、復号化できます。

SJCL として JS 暗号化ライブラリを使用する予定です: http://crypto.stanford.edu/sjcl/。今までは、JS でデータを暗号化し、ajax post で送信できました。私のJSコードはこのように笑っています。

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

私の質問は、php でデータを復号化する方法です。可能であれば、サンプルコードでそれを行う方法を教えてください。(注:SSLは私にとってオプションではありません。現在、リクエストごとに生成された乱数としてキーを使用することを計画しています)

ありがとう

4

2 に答える 2

3

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);
于 2016-12-25T19:27:05.990 に答える
0

これはあなたの質問に完全に答えるわけではありませんが、次のことを行う必要があります。

  1. crypto-jsを最も標準的な JS 暗号化、ハッシュ、および KDF ライブラリとして使用することを提案します (つまり、提供されたメソッドは PHP の同等のものと互換性があります)。
  2. この記事の少なくとも最初の行を読むことをお勧めします 。ここでは、Javascript 暗号化を利用することで得られるすべての利益が誤った安心感である理由を学びます。
于 2014-06-20T09:04:39.313 に答える