のは、私は、プレーンテキストにキーでXOR暗号-EDになるだろうミルクティー、の素敵なカップを持っているとしましょう。XOR暗号:異なる結果
このJavaコード:
暗号化:復号化さUBJdXVZUElBBRRFdVRRYWF5YFEFUUwの==
を:
import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; public class XORTest { public static void main(String args[]){ String plaintext = "a nice cup of milk tea"; String key = "12345"; String encrypted = xor_encrypt(plaintext, key); String decrypted = xor_decrypt(encrypted, key); System.out.println("Encrypted: "+encrypted); System.out.println("Decrypted: "+decrypted); } public static String xor_encrypt(String message, String key){ try { if (message==null || key==null) return null; char[] keys=key.toCharArray(); char[] mesg=message.toCharArray(); BASE64Encoder encoder = new BASE64Encoder(); int ml=mesg.length; int kl=keys.length; char[] newmsg=new char[ml]; for (int i=0; i<ml; i++){ newmsg[i]=(char)(mesg[i]^keys[i%kl]); } mesg=null; keys=null; String temp = new String(newmsg); return new String(new BASE64Encoder().encodeBuffer(temp.getBytes())); } catch (Exception e) { return null; } } public static String xor_decrypt(String message, String key){ try { if (message==null || key==null) return null; BASE64Decoder decoder = new BASE64Decoder(); char[] keys=key.toCharArray(); message = new String(decoder.decodeBuffer(message)); char[] mesg=message.toCharArray(); int ml=mesg.length; int kl=keys.length; char[] newmsg=new char[ml]; for (int i=0; i<ml; i++){ newmsg[i]=(char)(mesg[i]^keys[i%kl]); } mesg=null; keys=null; return new String(newmsg); } catch (Exception e) { return null; } }}
は私に与えミルクティー
そして、このPHPの素敵なカップをコード:
<?php
$input = "a nice cup of milk tea";
$key = "12345";
$encrypted = XOR_encrypt($input, $key);
$decrypted = XOR_decrypt($encrypted, $key);
echo "Encrypted: " . $encrypted . "<br>";
echo "Decrypted: " . $decrypted . "<br>";
function XOR_encrypt($message, $key){
$ml = strlen($message);
$kl = strlen($key);
$newmsg = "";
for ($i = 0; $i < $ml; $i++){
$newmsg = $newmsg . ($msg[$i]^$key[$i % $kl]);
}
return base64_encode($newmsg);
}
function XOR_decrypt($encrypted_message, $key){
$msg = base64_decode($encrypted_message);
$ml = strlen($msg);
$kl = strlen($key);
$newmsg = "";
for ($i = 0; $i < $ml; $i++){
$newmsg = $newmsg . ($msg[$i]^$key[$i % $kl]);
}
return $newmsg;
}
?>
は私を与える:暗号化
:MTIzNDUxMjM0NTEyMzQ1MTIzNDUxMgの==復号化さ
:両方の結果が異なる理由
ワンダー。 PHPが私の紅茶ではないことを前に認めなければなりません。
私はおもちゃプロジェクトにこれを使用しているため、高いセキュリティは必要ありません。
for ($i = 0; $i < $ml; $i++){
$newmsg = $newmsg . ($msg[$i]^$key[$i % $kl]);
}
しかし、$msg
がどこにも定義されていません:あなたのPHPの暗号化方式で
私はセキュリティ専門家ではありませんが、ここに私のテイクがあります:あなたはJavaとPHPの両方のbase64_encodeを使用しているので、base64エンコーディングはdiffirentです。この解決策を見て、何かをjavaとphpでエンコードしてください:http://stackoverflow.com/questions/11002603/base64-encode-different-between-java-and-php – Jozzeh
私の答えはうまくいけばあなたの問題の1つを解決します。 PHPの出力例では、解読出力が空白であることを示唆しているようです。それは正しいか、コピー/過去のエラーですか? –
@DuncanJonesそれはかなり正しいです、はい、それは問題を解決します。 – phant0m