2012-03-12 11 views
5

W mojej aplikacji na Androida komunikuję się z serwisem internetowym, dane wysyłane i odpowiadające są szyfrowane za pomocą szyfrowania AES.Szyfrowanie AES Java -> PHP -> Java

Więc to, co robię, jest następujące. Wysyłam kodowany za pomocą algorytmu AES ciąg JSON Base64, aby udostępnić.php

Share.php odszyfruje ten ciąg i wstawi go do bazy danych. Następnie PHP zaszyfruje i zakoduje odpowiedź.

Moja aplikacja Android musi następnie odkodować i odszyfrować tę wiadomość.

Ale odszyfrowywanie odpowiedzi PHP nie idzie zbyt dobrze.

To jest mój 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); 
} 

}

I jest to kod do kodowania pl zaszyfrować odpowiedzi w 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; 
} 

Zgaduję, że ustawienia szyfrowanie PHP nie odpowiada ustawieniom części Java. Can

Dostaję następujący błąd:

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

Dlaczego po prostu nie używać https? – kirilloid

+1

Jedna rzecz jest taka, że ​​tryby wypełniania nie są zgodne, patrz http://www.php.net/manual/de/ref.mcrypt.php#69782 – Niko

Odpowiedz

0

Proponuję przyjrzeć http://phpaes.com/. Jest to darmowa biblioteka szyfrowania AES zaimplementowana wyłącznie w PHP; jest szybki i bardzo prosty w użyciu.

Przynajmniej pozwala to zbliżyć się o jedno miejsce, aby wyodrębnić prawdziwe źródło problemu.

+1

Jeszcze jedna sprawa: kodowanie base64 ma wiele różnych kształty i rozmiary. Jeśli chodzi o kodowanie danych binarnych w base64, musisz być absolutnie pewien, że zarówno twój kod po stronie klienta, jak i po stronie serwera działają poprawnie. Proponuję zacząć od czegoś prostszego niż zaszyfrowane dane, przetestować lokal i upewnić się, że posiadasz wszystkie podstawowe podstawy. – infomaniac

-4

To może nie być odpowiedź, której szukasz - ale czy istnieje konkretny powód, dla którego ręcznie szyfrujesz te dane zamiast używać SSL/HTTPS?

W większości przypadków protokół HTTPS będzie łatwiejszy do wdrożenia i bezpieczniejszy niż ręczne wdrażanie szyfru symetrycznego.

+0

SSL/HTTPS nie zastępuje szyfrowania symetrycznego i zdarzają się sytuacje, w których nie można ufać nawet kanałowi SSL/HTTPS. –

Powiązane problemy