我希望能够以加密形式从服务器B检索数据,并在服务器A上对其进行本地解密。
在服务器A上,我有一个页面,其中包含键值和文件名值的表单输入,表单发布到同一页面。输入这些值后,我接受文件名值,然后构建一个fopen字符串到Server,通过fgets读取文件的文本,然后使用键值对其进行解密,将其返回给AES类。
服务器A上的表单页是通过meta charset标记编码的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但是,如果我接受加密的字符串ѶIQ��SҨ�$��� ,O�������~ f并将其放在服务器B上的txt文件中:
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为什么会这样呢?给定相同的加密字符串,我得到两个不同的输出。我只能想象,这个字符集有一些问题,它正在改变某个方面的值。
如果我将表单页的加密更改为ISO-8859-1,则加密的字符串将变为ѶIQ’°SÒ¨á$«Îà ,OþÆÿ‡ÿè~ f。当我试图将远程txt文件的编码更改为ISO,并在那里复制该字符串时,cPanel告诉我有些字符与ISO不兼容,并将我引导回UTF-8。然后,我尝试将serverA保留为ISO,但将mb_convert_encoding或utf8-encode / utf8-decode转换到传入/传出数据,但没有工作结果。有什么想法吗?
发布于 2013-11-20 13:08:26
加密的字符串是伪随机二进制噪声。它作为可见字符没有任何意义,因为它不代表任何文本编码。如果将字符串显示为字符,则会得到一些随机垃圾,这些垃圾可能缺少单个字节,也可能没有更改字符。如果您复制并粘贴到另一个文件中,则无法保证您将得到相同的二进制数据。
不要将加密的字符串视为可读的文本。相反,把它写进一个文件,复制那个文件,不要碰它。如果您需要二进制数据作为一个复制和可压缩字符串,base64_encode它.
https://stackoverflow.com/questions/20096689
复制相似问题