Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用SJCL在Javascript中加密,用PHP解密_Php_Javascript_Cryptography_Sjcl - Fatal编程技术网

用SJCL在Javascript中加密,用PHP解密

用SJCL在Javascript中加密,用PHP解密,php,javascript,cryptography,sjcl,Php,Javascript,Cryptography,Sjcl,我想用Javascript对一些数据进行加密,并在将其发送到php服务器后对其进行解密 我计划使用JS加密库作为SJCL:。到目前为止,我可以用JS加密我的数据,并通过ajax post发送。 我的JS代码就是这样 sjcl.encrypt('a_key','secured_message'); 我的问题是如何用php解密我的数据。如果可能的话,用一个示例代码告诉我如何做。(注意:SSL不是我的选项,现在我计划使用密钥作为每个请求生成的随机数) 谢谢虽然这并不能完全回答您的问题,但我必须: 建

我想用Javascript对一些数据进行加密,并在将其发送到php服务器后对其进行解密

我计划使用JS加密库作为SJCL:。到目前为止,我可以用JS加密我的数据,并通过ajax post发送。 我的JS代码就是这样

sjcl.encrypt('a_key','secured_message');
我的问题是如何用php解密我的数据。如果可能的话,用一个示例代码告诉我如何做。(注意:SSL不是我的选项,现在我计划使用密钥作为每个请求生成的随机数)


谢谢

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

  • 建议使用最标准的JS加密、哈希和KDF库(这意味着提供的方法与PHP等价物兼容)
  • 建议你至少阅读文章的第一行 在这里,您将了解为什么利用Javascript加密技术所获得的所有好处都是错误的安全感

  • PHP7.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) }));
    
    $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);
    
    要获得:

    {"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中进行如下解密:

    var sjcl = require('./sjcl');
    console.log(sjcl.encrypt('a_key', 'secured_message', { mode: 'ccm', iv: sjcl.random.randomWords(3, 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);
    

    你打算如何传输密钥?所以你要在同一个通道上发送一个加密消息,其中包含解密密钥。你知道你的加密和发送明文一样好,对吧?出于兴趣,你不使用SSL有什么原因吗?把SJCL代码复制到Java中(仍然没有完成)花了我不少时间。如果这不是直接可用的(而且可能不是),则需要相当多的知识,尤其是测试来复制功能。请参阅:php错误:“openssl_decrypt()最多需要5个参数,7个给定/…”