2012-11-30 75 views
5

Giả sử tôi có một văn bản thuần túy một tách trà sữa đẹp, sẽ là mã hóa XOR với khóa .Mật mã XOR trong Java & PHP: các kết quả khác nhau

Mã này Java:

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; 
    } 
    }} 

mang lại cho tôi:

mã hóa: UBJdXVZUElBBRRFdVRRYWF5YFEFUUw ==

Giải mã: một tách trà ngon sữa

Và PHP này mã:

<?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; 
} 

?> 

mang lại cho tôi:

mã hóa: MTIzNDUxMjM0NTEyMzQ1MTIzNDUxMg ==

Giải mã:

Wonder lý do tại sao cả hai kết quả khác nhau. Tôi phải thừa nhận trước đó rằng PHP không phải là tách trà của tôi.

BTW, tôi sử dụng điều này cho một dự án đồ chơi, vì vậy không cần bảo mật cao.

+0

Tôi không phải là chuyên gia bảo mật nhưng đây là nhận định của tôi: Vì bạn đang sử dụng base64_encode cả Java và PHP, mã hóa base64 khác nhau. Có một cái nhìn tại giải pháp này để mã hóa một cái gì đó trong java và php: http://stackoverflow.com/questions/11002603/base64-encode-different-between-java-and-php – Jozzeh

+0

Câu trả lời của tôi hy vọng sẽ giải quyết một trong những vấn đề của bạn. Trong ví dụ đầu ra PHP của bạn, bạn dường như gợi ý rằng đầu ra giải mã của bạn trống. Có đúng hay là lỗi sao chép/quá khứ? –

+0

@DuncanJones Đó là khá chính xác, và có, nó giải quyết vấn đề. – phant0m

Trả lời

4

Trong phương pháp mã hóa PHP, bạn có đoạn mã sau:

for ($i = 0; $i < $ml; $i++){ 
    $newmsg = $newmsg . ($msg[$i]^$key[$i % $kl]); 
} 

Tuy nhiên, $msg không được định nghĩa bất cứ nơi nào. Đó phải là $message.

+0

+1 đánh bại tôi với nó – phant0m

+3

* Thổi khói từ súng, vỏ bọc ... * ;-) –

+0

Có Duncan, bạn nói đúng. Đôi khi loại lỗi này khó phát hiện khi bạn buồn ngủ. Đạo đức của câu chuyện: luôn sử dụng error_reporting (E_ALL) :) – anta40

Các vấn đề liên quan