我已經在PHP中編寫了一個簡單的XOR函數。它非常獨立,但是當我將它實現爲一個類時,它總是拋出「長度不匹配」的異常。PHP XOR函數實現「長度不匹配」
XOR函數:
private static function strxor($dataA, $dataB) {
if (($dataLen = strlen($dataA)) != strlen($dataB)) {
throw new Exception("Length Not Match in strxor");
}
$result = '';
for ($i = 0; $i < $dataLen; $i++) {
$result .= $dataA[$i]^$dataB[$i];
}
return $result;
}
我甚至嘗試從Encrypt/decrypt with XOR in PHP複製,添加了長度校驗和變量名改爲另一個版本。
private static function xor_this($dataA, $dataB) {
if (($dataLen = strlen($dataA)) !== strlen($dataB)) {
die("Length Not Match in xor_this");
}
$result = '';
for($i=0;$i<$dataLen;) {
for($j=0;($j<$dataLen && $i<$dataLen);$j++,$i++) {
$result .= $dataA{$i}^$dataB{$j};
}
}
return $result;
}
類我要去實現:
public static function encrypt($key, $data) {
$iv = parent::genSafeRandomBytes(16);
$nonce = parent::genSafeRandomBytes(16);
$firstBlock = self::xor_this($nonce, $iv);
$salt = parent::genSafeRandomBytes(16);
$hmac = parent::signText($data, $key);
$subkey = parent::genSubKey($key, $salt);
$data = self::pkcs7pad($data);
$data = str_split($data, 16);
$tmp_r = openssl_encrypt($firstBlock, self::CIPHER, $subkey, OPENSSL_RAW_DATA);
$result = '';
for ($i = 0; $i < count($data); $i++) {
$tmp_n = parent::ivAdd($nonce, $i+1);
$tmp_n = self::xor_this($tmp_n, $tmp_r);
$tmp_x = openssl_encrypt($tmp_n, self::CIPHER, $subkey, OPENSSL_RAW_DATA);
$result .= $tmp_r = self::xor_this($tmp_x, $data[$i]);
}
return Base62::encode($iv.$nonce.$salt.$hmac.$result);
}
我敢肯定,這兩個值具有相同的長度。我該如何解決它?我真的不知道錯誤發生的原因和方式。
全部來源:https://gist.github.com/hartmantam/39857700831591775b1c(不工作)
奇怪的問題,無法複製它......你可以創建在http://phpfiddle.org/一個小提琴? –
你知道你可以直接對XOR字符串進行對吧?你不必一個字符一個字。 '函數strxor($ a,$ b){return $ a^$ b; }' – duskwuff
@JasonFetterly我真的不知道如何使用phpfiddle.org。所以我張貼所有來源[這裏](https://gist.github.com/hartmantam/39857700831591775b1c),請看看。 – Hartman