ホームページ > バックエンド開発 > PHPチュートリアル > php md5暗号化後のバイトに対するXOR演算の問題

php md5暗号化後のバイトに対するXOR演算の問題

WBOY
リリース: 2016-06-20 12:59:31
オリジナル
1017 人が閲覧しました

$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";
$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
md5 暗号化後に返された 16 ビット バイナリ バイトに対して XOR 演算を実行します
$data = array();
$data[0]="0"; $i $data[$i % 4 +1] ^=$md5[$i];
次に、整数値を取得します
$val = 0;
$val = $bytes[$data+1] & 0xff;
$val < $val |= $bytes[$data+ 2] & 0XFF; $ val & lt;
$ バイト [$ データ + 3] & lt; > $ value | = $bytes[$data+4] & 0xff;
echo $val; 戻り値が間違っているのはなぜですか?私に何か問題があるのでしょうか?アドバイスをお願いします




ディスカッション(解決策)への返信

自分が何をしたいのか、つまり自分のやりたいことを明確にすべきです。正しい論理?また、コード自体にも構文エラーがあります。あなたが何をしたいのかも分かりません。

私の目的は、md5 暗号化文字列の 8 ビットごとに XOR して長整数を取得することです。

結果が間違っているとのことですが、正しい値は何ですか?布?

コード スニペットのみを提供したため、テストすることはできません

回答ありがとうございます。私の目的は、md5 暗号化文字列のすべての 8 ビットを XOR して長整数を取得することです。


1. MD5 は暗号化とは呼ばれません http://zh.wikipedia.org/wiki/MD5

2. 今回の記述は、コード内のコメント以上の情報を提供するものではありません。プログラマー。たとえば、XOR が 8 ビットごとに実行され、XOR が二項演算子であるとすると、誰と XOR されるのでしょうか?

3. 上で述べたように、実装に問題があると思われる場合は、入力が取得するはずの通常の出力を提供してください

4. 私の最初の返信を見て、まず自分のコードを大事にしてください。実行可能なバージョンに書き込み、論理的なエラーがあっても文法的なエラーがあってはなりません。問題自体に関連する部分のみを残します。





結果が間違っているとのことですが、正しい値はどれですか?
コード スニペットを提供しただけで、テストすることはできません

これは、国内のプログラマーがますます増えているのに、かつて確立されていた中国の技術コミュニティが衰退した理由を説明することがよくあります。 また質問が下手な人に出会ったら、その人のアカウントを禁止して、「質問する知恵」のような文書を見つけて、禁止された人に録音したものを朗読して送ってもらうべきだと思います。手動でブロックを解除します。録音中、不正行為を避けるために、その人に送信された確認コードを読み上げる必要があります。

適切に質問しなかったり、今後この人のアカウントをブロックしたりする場合は、質問の後ろにその人の朗読をリンクしてください。


PS: 今日はとても暇です。





回答ありがとうございます。私の目的は、md5 暗号化文字列の 8 桁ごとにこれを行うことです。 XOR は長整数を取得します

1. md5 は暗号化とは呼ばれません http://zh.wikipedia.org/wiki/MD5

2. 今回の説明はコード内にあるものと同じですコメントにはさらに詳しい情報が含まれています。プログラマーのように説明してください。たとえば、XOR が 8 ビットごとに実行され、XOR が二項演算子であるとすると、誰と XOR されるのでしょうか?

3. 上で述べたように、実装に問題があると思われる場合は、入力が取得するはずの通常の出力を提供してください
4. 私の最初の返信を見て、まず自分のコードを大事にしてください。実行可能なバージョンに書き込み、論理的なエラーがあっても文法的なエラーがあってはなりません。問題自体に関連する部分のみを残します。



わかりました。辛抱強く答えていただきありがとうございます。Java を使用してコードを実行し、次に PHP を使用してコードを実行しましたが、結果は実際には異なっていました。おそらく私の説明が曖昧すぎたので、最初にコードを見てみましょう。
Java コード:

文字列データ = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111"; > ByteArrayOutputStreamストリーム = 新しい ByteArrayOutputStream();
stream.write(apSecert.getBytes());
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(data.getBytes());
stream.write(md5.digest());
md5.update(stream.toByteArray());
byte[] md = md5.digest(); new byte[5]; // 負の数への変換を防ぐために最初のバイトの 0 を保持し、(int i = 0; i には最後の 4 桁のみを使用します。 {
ret [i % 4 + 1] ^= md[i]
}
System.out.println("--------------"+ new BigInteger(ret) );-----整数を取得します
}
PHP コード:
$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111 ";
$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
$data = array();
$data[0]="0";
for($i = 0; $i $data[$i % 4 +1] ^=$md5[$i];
} > $val = 0 ;
$val = $data[1] & 0xff;
$val |= $data[2] & 0xff; $val <<= 8;
$val |= $data[3] & 0xff;
$val <<= 8;
$val |= $data[4] & 0xff ;
echo $val;

最終結果は異なります。精度の問題ですか?それとも私のコードに何か問題があるのでしょうか?
java:=2676031167
php:=16327680

PHP コード: 初めて投稿したコードには確かに問題があります。もう一度書きます。
$string = " !&22E2&! '&5aSJ^#$&6<&!&()pR49}I&dh111111";
$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
$data = 配列();
$data[0]="0";
for($i = 0; $i $data[$i % 4 +1] ^=$md5[$i];

}
$val = $data[1] & 0xff;
$val <<= 8;
$val |= $data[2] & 0xff;
$val <<= 8;
$val |= $data[3] & 0xff; ;= 8 ;
$val |= $data[4] & 0xff;
echo $val;私のどこが間違っているのか指摘してもらえますか?報酬は 100 RMB

php の実行結果は 16327680
だと言いましたが、投稿したコードは 327680



はい、書き間違えました。 PHPに詳しくないのですが、JAVAの値が正しいのですが、JAVAはUnicodeエンコードなので、PHPでのビット演算でエラーが発生するのではないかと考えます。

こう書いてください

こう書いてください


モデレータのおかげで、あなたは専門家です、私はそれを投稿しました、どうすればよいですかお金を送りますか?

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート