我正在研究加密。我遇到了这样的问题:
在我用一把钥匙的XOR明文之后,我得到一个地穴,“010e010c15061b4117030f54060e54040e0642181b17”,作为十六进制类型。如果我想从这个地穴获取明文,我该怎么做PHP?
我尝试将其转换为string / int,然后用密钥(三个字母)将它们转换为XOR。但它不起作用。
这是代码:
function xor_this($string) {
// Let's define our key here
$key = 'fpt';
// Our plaintext/ciphertext
$text = $string;
// Our output text
$outText = '';
// Iterate through each character
for($i=0; $i<strlen($text); )
{
for($j=0; $j<strlen($key); $j++,$i++)
{
$outText .= ($text[$i] ^ $key[$j]);
//echo 'i=' . $i . ', ' . 'j=' . $j . ', ' . $outText{$i} . '<br />'; // For debugging
}
}
return $outText;
}
function strToHex($string)
{
$hex = '';
for ($i=0; $i < strlen($string); $i++)
{
$hex .= dechex(ord($string[$i]));
}
return $hex;
}
function hexToStr($hex)
{
$string = '';
for ($i=0; $i < strlen($hex)-1; $i+=2)
{
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
$a = "This is the test";
$b = xor_this($a);
echo xor_this($b), '-------------';
//
$c = strToHex($b);
$e = xor_this($c);
echo $e, '++++++++';
//
$d = hexToStr($c);
$f = xor_this($d);
echo $f, '=================';
这就是结果:
这是测试-------------
PHP注意:未初始化的字符串偏移量:C中的29: 第210行上的Users \ Administrator \ Desktop \ test.php PHP堆栈跟踪:PHP 1. {main}()C:\ Users \ Administrator \ Desktop \ test.php:0 PHP 2. xor_this()C:\ Users \ Administrator \ Desktop \ test.php:239
注意:未初始化的字符串偏移量:29英寸 第210行的C:\ Users \ Administrator \ Desktop \ test.p hp
调用堆栈: 0.0005 674280 1. {main}()C:\ Users \ Administrator \ Desktop \ test.php:0 0.0022 674848 2. xor_this()C:\ Users \ Administrator \ Desktop \ test.php:23 9
UBE ^A►WEAVA►WEAV@◄WEARAFWECWB++++++++
这是zs $fs☺=================
为什么呢?结果是“UBE ^A►WEAVA►WEAV@◄WEARAFWECWB+++++++++++++++++++++++++++++++++++++++++++++++++++++++
答案 0 :(得分:23)
试试这个:
function xor_this($string) {
// Let's define our key here
$key = ('magic_key');
// Our plaintext/ciphertext
$text = $string;
// Our output text
$outText = '';
// Iterate through each character
for($i=0; $i<strlen($text); )
{
for($j=0; ($j<strlen($key) && $i<strlen($text)); $j++,$i++)
{
$outText .= $text{$i} ^ $key{$j};
//echo 'i=' . $i . ', ' . 'j=' . $j . ', ' . $outText{$i} . '<br />'; // For debugging
}
}
return $outText;
}
基本上要将文本还原(甚至是数字),您可以使用相同的功能:
$textToObfuscate = "Some Text 12345";
$obfuscatedText = xor_this($textToObfuscate);
$restoredText = xor_this($obfuscatedText);
答案 1 :(得分:10)
更容易:
connection.setRequestProperty("Connection", "Keep-Alive");
答案 2 :(得分:2)
基于上面的代码,我创建了两个函数,用xor编码JSON字符串,然后使用PHP在服务器端对其进行解码。
<强> !!!重要提示:如果您的JSON字符串中包含与ASCII不同的字符(如中文,西里尔文,符号...), 必须要么用PHP或JS编写一些代码来修复这些代码 字符被编码/解码(PHP中的ord / chr产生不同 结果与JS charCodeAt / String.fromCharCode)或进行比较 只需base64_encode JSON字符串,然后xor编码。
我个人在JS和PHP方面使用xor_string(base64_encode(JSON.stringify(object)), 'xor_key')
:
$json = json_decode(base64_decode(
xor_string(file_get_contents("php://input"), 'xor_key')
),
true);
PHP:
function xor_string($string, $key) {
$str_len = strlen($string);
$key_len = strlen($key);
for($i = 0; $i < $str_len; $i++) {
$string[$i] = $string[$i] ^ $key[$i % $key_len];
}
return $string;
}
使用Javascript:
function xor_string(string, key) {
string = string.split('');
key = key.split('');
var str_len = string.length;
var key_len = key.length;
var String_fromCharCode = String.fromCharCode;
for(var i = 0; i < str_len; i++) {
string[i] = String_fromCharCode(string[i].charCodeAt(0) ^ key[i % key_len].charCodeAt(0));
}
return string.join('');
}