2012-11-30 3 views
5

のは、私は、プレーンテキストにキーで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の暗号化方式で

+0

私はセキュリティ専門家ではありませんが、ここに私のテイクがあります:あなたはJavaとPHPの両方のbase64_encodeを使用しているので、base64エンコーディングはdiffirentです。この解決策を見て、何かをjavaとphpでエンコードしてください:http://stackoverflow.com/questions/11002603/base64-encode-different-between-java-and-php – Jozzeh

+0

私の答えはうまくいけばあなたの問題の1つを解決します。 PHPの出力例では、解読出力が空白であることを示唆しているようです。それは正しいか、コピー/過去のエラーですか? –

+0

@DuncanJonesそれはかなり正しいです、はい、それは問題を解決します。 – phant0m

答えて

4

は、次のコードを持っています。それは$messageでなければなりません。

+0

+1それに私を打ちなさい – phant0m

+3

*銃、リホステルから煙を吹く... * ;-) –

+0

はいダンカン、そうです。時折、この種のエラーは、あなたが眠いときに見つけにくいです。ストーリーのモラル:常にerror_reporting(E_ALL)を使用してください:) – anta40