2012-03-12 25 views
5

Nella mia app Android sto comunicando con un servizio Web i dati inviati e risposto vengono criptati con crittografia AES.crittografia AES Java -> PHP -> Java

Quindi quello che faccio è la seguente. Sto inviando una stringa JSON codificata AES codificata Base64 per share.php

Share.php quindi decrittografa questa stringa e la inserisce nel database. Successivamente, il PHP crittograferà e codificherà la risposta.

applicazione My Android quindi ha bisogno di decodificare en decifrare questo messaggio.

Ma la decrittazione della risposta PHP non sta andando molto bene.

Questo è il mio 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); 
} 

}

E questo è il codice per codificare en crittografare la risposta in 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; 
} 

Sto indovinando che le impostazioni del la crittografia PHP non corrisponde alle impostazioni per la parte Java. Can

sto ottenendo il seguente errore:

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

Perché non usare solo https? – kirilloid

+1

Una cosa è che le modalità di riempimento non corrispondono, vedere http://www.php.net/manual/de/ref.mcrypt.php#69782 – Niko

risposta

0

vi consiglio di dare un'occhiata a http://phpaes.com/. È una libreria di crittografia AES gratuita implementata esclusivamente in PHP; è veloce e molto molto semplice da usare.

Per lo meno, permette di ottenere un passo più vicino ad isolare la vera fonte del problema.

+1

Un'altra cosa da notare: 'codifica base64 'è disponibile in molti diversi forme e dimensioni. Quando si tratta di codificare i dati binari in base64, devi essere assolutamente sicuro che sia il tuo lato client che il codice lato server funzionino correttamente. Ti suggerirei di iniziare con qualcosa di più semplice dei dati crittografati, testare i tuoi locali e assicurarti di avere tutte le basi più basilari coperte. – infomaniac

-4

Questo potrebbe non essere la risposta che stai cercando - ma c'è un motivo specifico che stai cifrare manualmente questi dati invece di utilizzare SSL/HTTPS?

Nella maggior parte dei casi, HTTPS sarà più facile da implementare e più sicuro dell'implementazione manuale di un codice simmetrico.

+0

SSL/HTTPS non sostituisce una crittografia simmetrica e ci sono situazioni in cui nemmeno un canale SSL/HTTPS non può essere considerato attendibile. –