Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.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 AES加密字符集问题_Php_Encoding_Utf 8_Aes - Fatal编程技术网

PHP AES加密字符集问题

PHP AES加密字符集问题,php,encoding,utf-8,aes,Php,Encoding,Utf 8,Aes,我希望能够以加密的形式从服务器B检索数据,并在服务器A上对其进行本地解密 在服务器A上,我有一个页面,其中包含一个键值和一个文件名值的表单输入,表单将发布到同一页面。输入值后,我获取文件名值,并向服务器B构建一个fopen字符串,通过fgets读取文件文本,然后将其返回到,使用密钥值对其进行解密 服务器A上的表单页通过元字符集标记进行utf-8编码。服务器B上的文件是utf-8编码的txt文件 当只处理本地值而不使用表单或任何东西时,一切正常: $original = "this is my s

我希望能够以加密的形式从服务器B检索数据,并在服务器A上对其进行本地解密

在服务器A上,我有一个页面,其中包含一个键值和一个文件名值的表单输入,表单将发布到同一页面。输入值后,我获取文件名值,并向服务器B构建一个fopen字符串,通过fgets读取文件文本,然后将其返回到,使用密钥值对其进行解密

服务器A上的表单页通过元字符集标记进行utf-8编码。服务器B上的文件是utf-8编码的txt文件

当只处理本地值而不使用表单或任何东西时,一切正常:

$original = "this is my string";
$original_encrypted = $aes->encrypt($original);
$return = "<p>Original, encrypted: ".$original_encrypted."</p>";
$return.= "<p>Original: ".$aes->decrypt($original_encrypted)."</p>";
echo  $return;

//prints:
Original, encrypted: ѶIQ��SҨ�$��� ,O�������~ f
Original: this is my string
为什么会这样?给定相同的加密字符串,我得到两个不同的输出。我只能想象,字符集会出现一些问题,它会在某个地方改变值


如果我将表单页的加密更改为ISO-8859-1,则加密的字符串将变为¨IQ''sÒá$«206; a,Oÿ198ÿÿÿ~f。当我尝试将远程txt文件的编码更改为ISO并将此字符串复制到那里时,cPanel告诉我某些字符与ISO不兼容,并引导我返回UTF-8。然后,我尝试将serverA保留为ISO,但对传入/传出数据强制使用mb_convert_编码或utf8编码/utf8解码,但没有工作结果。有什么想法吗?

加密字符串是伪随机二进制噪声。它作为可见字符没有任何意义,因为它不表示任何文本编码。如果您将字符串显示为字符,您将得到一些随机垃圾,这些垃圾可能会或可能不会丢失单个字节或更改了字符。如果您将其复制并粘贴到另一个文件中,则无法保证您将获得相同的二进制数据


不要将加密字符串视为可读文本。而是把它写进一个文件,复制那个文件,不要碰它。如果需要二进制数据作为可复制和粘贴的字符串,请使用base64_对其进行编码

由于两台服务器上的加密数据相同,在我看来,您没有使用正确的密钥对数据进行加密或解密。您是通过将加密字符串作为垃圾复制粘贴到文件中来放置加密字符串的吗?@deceze Yep-我只是通过将其作为垃圾复制和放置来放置加密字符串。你认为我应该写入该文件吗?@JesperBunnyJensen嗯,我现在使用相同的密钥同时加密和解密本地和远程数据,即使给定相同的初始数据,它们也返回不同的值。太棒了-我想我没有意识到其中的细节。现在可以工作了-tyvm!
function retrieve_data($filename) {
    //... some validation
    $file=fopen("http://serverB/authorisation/logs/$filename.txt","r");
        while (($line = fgets($file)) !== false) {
            $parts.=stripslashes(trim($line));
        }
    fclose($file);
    return $parts;
}

//... some key validation
$z = "A3C56F83425746B4D62F984".$key; // 256-bit key
$aes = new AES($z);

$data = retrieve_data(stripslashes(trim($_POST['filename'])));
$return = "<p>Remote, Encrypted, Text: ".$data."</p>";
$return.= "<p>Now Plain Text: ".$aes->decrypt($data)."</p>";
echo $return;

//prints:
Remote, Encrypted, Text: ѶIQ��SҨ�$��� ,O�������~ f

Now Plain Text: B\�%;�`��]��\mb���q�)� �E�������l�����P�V+c�Ah�@ƶ>yq