2012-03-12 42 views
5

Trong ứng dụng Android của tôi, tôi đang kết nối với dịch vụ web, dữ liệu được gửi và trả lời được mã hóa bằng mã hóa AES.Mã hóa AES Java -> PHP -> Java

Vì vậy, những gì tôi làm là như sau. Tôi đang gửi một chuỗi JSON mã hóa AES được mã hóa theo base64 đến share.php

Share.php sau đó sẽ giải mã chuỗi này và chèn nó vào cơ sở dữ liệu. Sau đó, PHP sẽ mã hóa vi mã hóa phản hồi.

Ứng dụng Android của tôi sau đó cần giải mã để giải mã thông báo này.

Nhưng việc giải mã phản hồi PHP sẽ không diễn ra tốt đẹp.

Đây là tôi AES.java:

public class AES { 
private final String characterEncoding = "UTF-8"; 
private final String cipherTransformation = "AES/ECB/PKCS5Padding"; 
private final String aesEncryptionAlgorithm = "AES"; 

public byte[] decrypt(byte[] cipherText, byte[] key, byte [] initialVector) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException 
{ 
    Cipher cipher = Cipher.getInstance(cipherTransformation); 
    SecretKeySpec secretKeySpecy = new SecretKeySpec(key, aesEncryptionAlgorithm); 
    //IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); 
    //cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy, ivParameterSpec); 
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpecy); 
    System.out.println("Do final: "+cipherText); 

    cipherText = cipher.doFinal(cipherText); 
    return cipherText; 
} 

public byte[] encrypt(byte[] plainText, byte[] key, byte [] initialVector) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException 
{ 
    Cipher cipher = Cipher.getInstance(cipherTransformation); 
    SecretKeySpec secretKeySpec = new SecretKeySpec(key, aesEncryptionAlgorithm); 
    //IvParameterSpec ivParameterSpec = new IvParameterSpec(initialVector); 
    //cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); 
    plainText = cipher.doFinal(plainText); 
    return plainText; 
} 

private byte[] getKeyBytes(String key) throws UnsupportedEncodingException{ 
    byte[] keyBytes= new byte[16]; 
    byte[] parameterKeyBytes= key.getBytes(characterEncoding); 
    System.arraycopy(parameterKeyBytes, 0, keyBytes, 0, Math.min(parameterKeyBytes.length, keyBytes.length)); 
    return keyBytes; 
} 

/// <summary> 
/// Encrypts plaintext using AES 128bit key and a Chain Block Cipher and returns a base64 encoded string 
/// </summary> 
/// <param name="plainText">Plain text to encrypt</param> 
/// <param name="key">Secret key</param> 
/// <returns>Base64 encoded string</returns> 
public String encrypt(String plainText, String key) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException{ 
    byte[] plainTextbytes = plainText.getBytes(characterEncoding); 
    byte[] keyBytes = getKeyBytes(key); 
    //return Base64.encodeToString(encrypt(plainTextbytes,keyBytes, keyBytes), Base64.DEFAULT); 
    return Base64.encodeToString(encrypt(plainTextbytes,keyBytes, new byte[0]), Base64.DEFAULT); 
} 

/// <summary> 
/// Decrypts a base64 encoded string using the given key (AES 128bit key and a Chain Block Cipher) 
/// </summary> 
/// <param name="encryptedText">Base64 Encoded String</param> 
/// <param name="key">Secret Key</param> 
/// <returns>Decrypted String</returns> 
public String decrypt(String encryptedText, String key) throws KeyException, GeneralSecurityException, GeneralSecurityException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException{ 
    byte[] cipheredBytes = Base64.decode(encryptedText, Base64.DEFAULT); 
    byte[] keyBytes = getKeyBytes(key); 
    //return new String(decrypt(cipheredBytes, keyBytes, keyBytes), characterEncoding); 
    return new String(decrypt(cipheredBytes, keyBytes, new byte[0]), characterEncoding); 
} 

}

Và đây là mã để mã hóa en mã hóa các phản ứng trong PHP:

function mc_encrypt($encrypt, $mc_key) { 
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv)); 
    $encode = base64_encode($passcrypt); 
    return $encode; 
} 

function mc_decrypt($decrypt, $mc_key) { 
    $decoded = base64_decode($decrypt); 
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND); 
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv)); 
    return $decrypted; 
} 

Tôi đoán rằng các thiết lập của mã hóa PHP không khớp với các cài đặt cho phần Java. Tôi có thể

tôi nhận được lỗi sau:

03-12 13:44:09.661: W/System.err(15717): javax.crypto.BadPaddingException: pad block corrupted 
+2

Tại sao không chỉ sử dụng https? – kirilloid

+1

Một điều là các chế độ đệm không khớp, xem http://www.php.net/manual/de/ref.mcrypt.php#69782 – Niko

Trả lời

0

tôi đề nghị bạn hãy xem http://phpaes.com/. Đó là một thư viện mã hóa AES miễn phí được thực hiện hoàn toàn bằng PHP; nó rất nhanh và rất dễ sử dụng.

Ít nhất, nó cho phép bạn tiến gần hơn một bước để cô lập nguồn thực sự của vấn đề.

+1

Một điều khác cần lưu ý: 'base64 encoding' có nhiều khác biệt hình dạng và kích thước. Khi nói đến mã hóa dữ liệu nhị phân trong base64, bạn phải hoàn toàn chắc chắn rằng cả mã phía máy khách và mã phía máy chủ đều hoạt động chính xác. Tôi sẽ đề nghị bắt đầu với một cái gì đó đơn giản hơn so với dữ liệu được mã hóa, kiểm tra cơ sở của bạn, và chắc chắn rằng bạn đã có tất cả các cơ sở cơ bản hơn được bảo hiểm. – infomaniac

-4

Đây có thể không phải là câu trả lời bạn đang tìm kiếm - nhưng có lý do cụ thể nào bạn mã hóa thủ công dữ liệu này thay vì sử dụng SSL/HTTPS không?

Trong hầu hết các trường hợp, HTTPS sẽ dễ triển khai hơn và an toàn hơn việc triển khai thủ công một mật mã đối xứng.

+0

SSL/HTTPS không thay thế mã hóa đối xứng và có những trường hợp thậm chí không thể tin cậy kênh SSL/HTTPS. –

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