В моем приложении Android я общаюсь с веб-службой, данные, отправленные и отправленные, шифруются с помощью AES-шифрования.
Так что я делаю следующее. Я отправляю закодированную A64 зашифрованную кодировку AES с кодировкой base64 в share.php
Затем Share.php расшифровывает эту строку и вставляет ее в базу данных. После этого PHP зашифрует и закодирует ответ.
Моему Android-приложению необходимо расшифровать en decrypt это сообщение.
Но дешифрование ответа PHP не очень хорошо.
Это мой 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); }
}
И это код для кодирования en encrypt the response в 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; }
Я предполагаю, что настройки шифрования PHP не соответствуют настройкам для Java-части. Можно
Я получаю следующую ошибку:
03-12 13:44:09.661: W/System.err(15717): javax.crypto.BadPaddingException: pad block corrupted
Я предлагаю вам взглянуть на http://phpaes.com/ . Это бесплатная библиотека шифрования AES, реализованная исключительно на PHP; он быстрый и очень простой в использовании.
По крайней мере, это позволяет вам сделать один шаг ближе к изоляции истинного источника проблемы.
Возможно, это не тот ответ, который вы ищете – но есть ли конкретная причина, по которой вы вручную шифруете эти данные вместо использования SSL / HTTPS?
В большинстве случаев HTTPS будет проще реализовать и более безопасно, чем вручную реализовать симметричный шифр.