I need to have a basic/simple String encryption (ie low security is good enough, I just want to avoid that the communication is human readable) between my Java client application and the PHP server.
I opted thus for the symmetric DES encryption as it doesn't require any key exchange (same key will be used on client and on server) + it doesn't require Java Security Policy updates for longer keys. I also encode/decode Base64 as the data gets sent by a Http post.
Unfortunately my code doesn't work as decrypted text doesn't match input.
My Java code to encrypt:
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
DESKeySpec keySpecEncrypt = new DESKeySpec(ParamsProvider.SERVER_ECRYPTION_SECRETKEY2); //Secret key is a byte[8] = {1, 2, 3, 4, 5, 6, 7, 8}
SecretKey keyEncrypt = keyFactory.generateSecret(keySpecEncrypt);
// Create the cipher
Cipher desCipher = Cipher.getInstance("DES/CFB8/NoPadding");
// Initialize the cipher for encryption
desCipher.init(Cipher.ENCRYPT_MODE, keyEncrypt);
// Encrypt the text
byte[] textEncrypted = desCipher.doFinal(data.getBytes("UTF-8"));
//B64 encoding and return
byte[] encryptedB64ByteArray = (new org.apache.commons.codec.binary.Base64()).encode(textEncrypted);
return new String(encryptedB64ByteArray, "UTF8");
My PHP code to decrypt:
function decrypt($message) {
$secret_key = array(1, 2, 3, 4, 5, 6, 7, 8);
$decodedMsg = base64_decode($message);
return base64_decode(mcrypt_decrypt(MCRYPT_DES, $key, $decodedMsg, MCRYPT_MODE_CFB));
}
My best guess is that my Java and PHP en/decryption parameters are not equal (eg CFB8 mode) but I have no clue on how to solve this.
Any help or hint would be greatly appreciated (I already lost a few hours on this one), Cheers, Thomas
Thanks for the hints.
Unfortunately none of them worked out for me.
I finally solved it based on this code: https://github.com/stevenholder/PHP-Java-AES-Encrypt
Cheers, Thomas
You have too choose a padding method, read this With the php code at the link of @Jon you haveto choose the PKCS#5-padding:
// Create the cipher
Cipher desCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
I had the same problem in the context of RSA (java:encryption, php:decryption), solved my problem the following way: in the keyPair-generation in increased the 'initialize' value from 512 to 1024. and it works. the hint i followed was here: http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html where it states that every java-implementation has to implement at least: ... RSA/ECB/PKCS1Padding (1024, 2048) ... so maybe the result of the keygeneration was not compatible
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.