我希望能够以加密形式从服务器B检索数据,并在服务器A上本地解密。
在服务器A上,我有一个页面,其中包含键值和文件名值的表单输入,表单发布到同一页面。输入值后,我获取文件名值,然后为服务器B构建fopen
字符串,通过fgets
读取文件的文本,并使用密钥将其返回到AES class解密它的价值。
服务器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
为什么会这样?给定相同的加密字符串,我得到两个不同的输出。我只能想象,charset存在一些问题,即在整个过程中改变了值。
如果我将表单页面的加密更改为ISO-8859-1
,则加密的字符串将变为ѶIQ’°SÒ¨á$«Îà ,OþÆÿ‡ÿè~ f
。当我尝试将远程txt文件的编码更改为ISO,并在那里复制此字符串时,cPanel告诉我某些字符与ISO不兼容并将我引导回UTF-8。然后我尝试将serverA作为ISO,但在传入/传出数据上投射mb_convert_encoding
或utf8-encode
/ utf8-decode
,但没有工作结果。有什么想法吗?
答案 0 :(得分:0)
加密字符串是伪随机二进制噪声。它没有作为可见字符的含义,因为它不代表任何文本编码。如果您将字符串显示为字符,您将获得一些随机垃圾,这可能会或可能不会丢失单个字节或更改字符。如果您将其复制并粘贴到另一个文件中,则无法保证您获得相同的二进制数据。
请勿将加密字符串视为可读文本。而是将其写入文件,复制该文件,不要触摸它。如果您需要二进制数据作为可复制和可粘贴的字符串,base64_encode
它。