Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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
Php 高效地加密/解密数据列表_Php_Encryption_Cryptography_Aes_Rsa - Fatal编程技术网

Php 高效地加密/解密数据列表

Php 高效地加密/解密数据列表,php,encryption,cryptography,aes,rsa,Php,Encryption,Cryptography,Aes,Rsa,我有一个加密的JSON对象,其中包含使用AES和RSA加密的数据列表 <?php function decrypt_data($encrypted_data, $session_key) { $decrypt = explode('|', $encrypted_data); $decoded = base64_decode($decrypt[0]); $iv = base64_decode($decrypt[1]);

我有一个加密的JSON对象,其中包含使用AES和RSA加密的数据列表

<?php

    function decrypt_data($encrypted_data, $session_key)
    {
        $decrypt = explode('|', $encrypted_data);
        $decoded = base64_decode($decrypt[0]);
        $iv = base64_decode($decrypt[1]);
        $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $session_key, $decoded, MCRYPT_MODE_CBC, $iv);
        $decrypted = unserialize($decrypted);

        return $decrypted;
    }

    function encrypt_session_key($session_key)
    {
        $sealed ="";
        $ekeys="";
        $pubKey[] = openssl_pkey_get_public("file:///public.pem");
        $result = openssl_seal($session_key, $sealed, $ekeys, $pubKey);
        $encrypted_session_key = array( 'encdata' => base64_encode($sealed), 'enckey' => base64_encode(serialize($ekeys)) );
        return $encrypted_session_key;
    }

    $data = '{"index":{"12345":{"title":"title 1","date_modified":1029232323},"23456":{"title":"title 2","date_modified":1029232323}},"archived":{}}';
    $session_key = openssl_random_pseudo_bytes(32);
    $encrypted_data = encrypt_data($session_key, $data);
    $encrypted_session_key = encrypt_session_key($session_key);
    $session_key = null;
    $encrypted_session_key_data = $encrypted_session_key['encdata'];
    $encrypted_session_key_keys = $encrypted_session_key['enckey'];

    // the encrypted data
    $the_encrypted_data = array("data_key" => $encrypted_session_key_data, "encryption_data_key" => $encrypted_session_key_keys, "data" => $encrypted_data);
?>

也许您可以使用多个ajax请求来模拟多线程解密。

大部分时间都可能被会话密钥的RSA解密所占用。RSA比AES慢得多。可能最好的办法是为多个字段创建一个会话单密钥,并解密一次。目前,它们都依赖于相同的私钥,因此对于密钥管理来说没有多大关系。您已经为每个字段提供了随机IV,因此加密本身应该是安全的

您可以做的另一个小改变是实际使用AES
MCRYPT_RIJNDAEL_256
是块大小为256位而不是128位的RIJNDAEL。块大小为128位的Rijndael(
MCRYPT_Rijndael_1282
)等于AES-目前您无法使用仅AES的库进行解密。密钥大小取决于会话密钥的大小

另一个解决方案是切换到椭圆曲线EC密钥对并使用ECIE。这对于解密来说要快得多(对于加密来说只稍微慢一点)。如果你还不知道椭圆曲线密码,这需要一个陡峭的学习曲线


最后,与不支持AES-NI指令集的mcrypt相比,OpenSSL在英特尔平台上的速度更快(据我所知,目前C-lib已经多年没有更新)。但是,PHP OpenSSL API非常有限,目前我无法在此提供帮助。

注意:我还没有对代码进行完整的代码检查。
<?php

    function decrypt_session_key($encrypted_session, $env_key)
    {
        $private_key = openssl_get_privatekey("file:///private.pem", "password");
        openssl_open(base64_decode($encrypted_session), $open, unserialize(base64_decode($env_key))[0], $private_key);

        return $open;
    }

    function decrypt_data($encrypted_data, $session_key)
    {
        $decrypt = explode('|', $encrypted_data);
        $decoded = base64_decode($decrypt[0]);
        $iv = base64_decode($decrypt[1]);
        $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $session_key, $decoded, MCRYPT_MODE_CBC, $iv);
        $decrypted = unserialize($decrypted);
        return $decrypted;
    }

    $decrypted_key = decrypt_session_key($data_key, $encryption_data_key);
    $the_decrypted_data = json_decode(decrypt_data($data, $decrypted_key), true);

?>