2012-06-20 39 views
5

Tôi có một ứng dụng có tệp java và PHP. Các tệp java gửi nội dung tới tệp PHP và tệp này gửi phản hồi tới tệp java, bằng mọi thứ HTTP. Tôi có phản hồi với định dạng JSON.Mã hóa nội dung bằng php và java

Tôi muốn mã hóa thông tin và giải mã nó ở phía bên kia, java->phpphp->java (điều này là quan trọng nhất) nhưng tôi không biết cách thực hiện.

Edit: tôi đang cố gắng Blowfish, đây là mã của tôi trong PHP (crypt dữ liệu và gửi cho Java) và Java (lấy dữ liệu và giải mã nó)

PHP

$key = "this is the key"; 
$crypttext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $result_json, MCRYPT_MODE_ECB); 
echo($crypttext); 

JAVA

public String decryptBlowfish(String to_decrypt, String strkey) { 
    System.out.println(to_decrypt); 
    try { 
     SecretKeySpec key = new SecretKeySpec(strkey.getBytes(), "Blowfish"); 
     Cipher cipher = Cipher.getInstance("Blowfish"); 
     cipher.init(Cipher.DECRYPT_MODE, key); 
     byte[] decrypted = cipher.doFinal(to_decrypt.getBytes()); 
     return new String(decrypted); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
     ; 
     return null; 
    } 
} 

System.out.println(decryptBlowfish(result, "this is the key")); 

Kết quả khi tôi thực hiện là:

Input length must be multiple of 8 when encrypting with padded cipher 

hoặc đôi khi

Given final block not properly padded 
+5

Hoàn toàn vô nghĩa. Sử dụng SSL để thay thế. –

Trả lời

-1

Nếu bạn không muốn SSL, mà tôi khuyên bạn quá, bạn có thể thử này:

$str = 'hello world'; //your input data 
$pass = 'haj83kdj843j'; //something random, the longer the better 
$l = strlen($pass); 

for ($i=0; $i<strlen($str); $i++) 
{ 
    $str[$i] = chr(ord($str[$i]) + ord($pass[$i % $l])); 
} 

Đó là nhanh chóng d dễ dàng để viết một coder/encoder trong bất kỳ ngôn ngữ nào bạn muốn. Chuỗi kết quả là một chuỗi nhị phân, do đó bạn có thể muốn chuyển đổi nó bằng cách sử dụng base64_encode hoặc một cái gì đó. Nên bảo mật khá tốt.

+2

Downvote cho: a) mật mã kém, b) sử dụng mã PHP để mã hóa/giải mã (thay vì sử dụng hàm gốc, như [mcrypt] (http://www.php.net/manual/en/function.mcrypt-encrypt. php), sẽ chậm khủng khiếp, c) phát minh lại weel – Crozin

+2

a) cho hầu hết các trường hợp đủ tốt b) bạn cần giải mã nó bằng ngôn ngữ khác. không chắc chắn nếu các thuật toán được hỗ trợ bởi mcrypt được hỗ trợ bởi java. mã của tôi là xách tay và nó là nhanh chóng c) tái phát minh bánh xe là những gì gây ra sự tiến bộ bởi vì bánh xe mới có thể được nhanh hơn hoặc rẻ hơn hoặc bất cứ điều gì. Nhưng tôi đồng ý SSL là tốt hơn. – Tom

+0

Hoàn toàn đồng ý với Crozin do đó các downvote – Yura

4

Đồng ý với nhận xét đó là những gì SSL để xem ở đây cho ứng dụng java của khách hàng sử dụng Chứng chỉ SSL và mã hóa để kết nối với trang web HTTPS/SSL: http://www.mkyong.com/java/java-https-client-httpsurlconnection-example/ tiếp theo bạn có thể muốn có máy chủ php HTTPS/SSL trợ giúp: http://cweiske.de/tagebuch/ssl-client-certificates.htm Hoặc sử dụng thư viện Opensource này: http://nanoweb.si.kz/

Nếu điều này không thành công thì tôi không biết, nhưng phương án cuối cùng sẽ là của riêng bạn, bạn có thể không bao giờ biết nó thực sự an toàn như thế nào?

0

Bạn có thể muốn sử dụng cùng một thuật toán để giải mã/giải mã cụ thể là "blowfish/ECB/nopadding" thay vì "blowfish".

private static final String DECRYPTION_ALGORITHM = "blowfish/ecb/nopadding"; 
private static final String KEY_ALGORITHM = "blowfish"; 
private static byte[] decrypt(byte[] keyData, byte[] valueData) throws Exception { 
    SecretKeySpec keySpec = new SecretKeySpec(keyData, KEY_ALGORITHM); 
    Cipher cipher = Cipher.getInstance(DECRYPTION_ALGORITHM); 
    cipher.init(Cipher.DECRYPT_MODE, keySpec); 
    return cipher.doFinal(valueData); 
} 
Các vấn đề liên quan