PHP 加密过滤器无法与 rijndael 一起正常工作

PHP Encryption filter not working properly with rijndael

我在使用加密过滤器时遇到了一些问题 http://php.net/manual/en/filters.encryption.php

该代码与 tripledes 算法一起工作正常,但是,当更改为 rijndael-256 或 128 时,它只会在读取时产生乱码数据。

我认为这是 IV 或密钥系统的错误,所以我尝试在读写中使用硬编码对,但是,它仍然产生乱码数据。

public function writeEncrypt($path, $data){

    $key = "1234567812345678";
    $iv = "1234567812345678";
    $opts = array('iv'=>$iv, 'key'=>$key, 'mode'=>'cbc');

    $fp = fopen($path, 'wb');
    stream_filter_append($fp, 'mcrypt.rijndael-128', STREAM_FILTER_WRITE, $opts);
    fwrite($fp, $data);
    fclose($fp);

    return true;
}

public function readDecrypt($path){

    $key = "1234567812345678";
    $iv = "1234567812345678";
    $opts = array('iv'=>$iv, 'key'=>$key, 'mode'=>'cbc');

    $fp = fopen($path, 'rb');
    stream_filter_append($fp, 'mcrypt.rijndael-128', STREAM_FILTER_READ, $opts);
    $data = rtrim(stream_get_contents($fp));
    fclose($fp);

    header("Content-Type: application/zip");
    header("Content-Length: " . count($data));

    echo $data;
}

所有数据均以二进制形式输入。 我究竟做错了什么? (php 日志中没有错误)

您在尝试读取文件时传递的是 'mcrypt.rijndael-128' 而不是 'mdecrypt.rijndael-128'。

无论如何,过滤器真的很强大而且通常很方便,但是你不应该特别使用这个,因为它不提供身份验证,这在密码学中非常重要。