PHPで単純なXOR関数を書いています。それは素晴らしいスタンドアロンで動作しますが、私はクラスに実装するとき、常に "Length Not Match"の例外をスローします。PHP XOR関数が "Length Not Match"を実装しています
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;
}
クラスIは、実装するつもりです:
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);
}
私は2つの値が同じ長さを持っていることを確信しています。どうすれば修正できますか?私は実際になぜ、どのようにエラーが発生するのか分かりません。
完全なソース:(動作しない)https://gist.github.com/hartmantam/39857700831591775b1c
奇妙な問題は、それを複製することができませんでした...あなたはhttp://phpfiddle.org/でフィドルを作成してもらえますか? –
あなたはXORの文字列をお互いに直接、右にすることができます知っていますか?あなたはキャラクターごとにキャラクターを行く必要はありません。 '関数strxor($ a、$ b){戻り$ a^$ b; } ' – duskwuff
@JasonFetterly私は本当にphpfiddle.orgの使い方を知らない。だから私はすべてのソース[ここ](https://gist.github.com/hartmantam/39857700831591775b1c)を投稿してください。 – Hartman