AES-Verschlüsselung mit Java -> PHP -> Java
In meine Android app bin ich die Kommunikation mit einem web service die Daten, die gesendet und beantwortet werden verschlüsselt mit AES-Verschlüsselung.
Also, was ich Tue, ist Folgendes. Ich werde senden eine base64-verschlüsselte AES-verschlüsselte JSON-String zu share.php
Share.php wird dann entschlüsselt diese Zeichenfolge und fügen Sie Sie in die Datenbank. Nach, dass die PHP verschlüsseln de Kodieren der Antwort.
Mein Android-Anwendung muss dann decodieren en entschlüsseln dieser Nachricht.
Aber die Entschlüsselung der PHP-Reaktion ist nicht sehr gut.
Dies ist mein 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);
}
}
- Und dies ist der code zum codieren en verschlüsseln der Antwort 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;
}
Ich vermute, dass die Einstellungen der PHP-Verschlüsselung, die nicht mit den Einstellungen für den Java-Teil. Kann
Bin ich immer die folgende Fehlermeldung:
03-12 13:44:09.661: W/System.err(15717): javax.crypto.BadPaddingException: pad block corrupted
- Warum nicht benutzen Sie einfach https?
- Eine Sache ist, dass die Polsterung Modi nicht übereinstimmen, finden Sie unter php.net/manual/de/ref.mcrypt.php#69782
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich schlage vor, Sie nehmen einen Blick auf http://phpaes.com/. Es ist ein free-AES-Verschlüsselung-Bibliothek implementiert, die rein in PHP; es ist schnell und sehr sehr einfach zu bedienen.
Zumindest, ermöglicht es Ihnen zu bekommen, einen Schritt näher zu isolieren, die wahre Quelle des Problems ist.
base64 encoding
kommt in vielen verschiedenen Formen und Größen. Wenn es um die Verschlüsselung von binären Daten werden im base64, du musst absolut sicher sein, dass Ihr client-side und server-side-code korrekt. Ich würde vorschlagen, beginnend mit etwas einfacher als verschlüsselte Daten, testen Ihre Räumlichkeiten, und Sie haben alle mehr basic Grundlagen abgedeckt.Könnte dies nicht die Antwort, die Sie suchen - aber gibt es einen bestimmten Grund, dass du noch manuell die Verschlüsselung dieser Daten anstelle der Verwendung von SSL/HTTPS?
In den meisten Fällen HTTPS wird einfacher zu implementieren und sicherer als manuelle Umsetzung einer symmetrischen Chiffre.