2013-04-09 4 views
1

Мне нужно иметь базовое/простое шифрование String (т.е. низкая безопасность - это достаточно хорошо, я просто хочу, чтобы это сообщение было доступно для чтения) между моим клиентским приложением Java и сервером PHP ,Java и PHP симметричное шифрование (DES)

Я выбрал симметричное шифрование DES, так как он не требует обмена ключами (тот же ключ будет использоваться на клиенте и на сервере) + он не требует обновлений политики безопасности Java для более длинных ключей. Я также кодирую/расшифровываю Base64, поскольку данные отправляются почтой Http.

К сожалению, мой код не работает, так как дешифрованный текст не соответствует введенному.

Мой Java-код для шифрования:

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"); 

Мой PHP код для расшифровки:

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)); 
} 

Мое предположение, что мои параметры ан/дешифрования Java и PHP не равны (например, в режиме CFB8), но я не знаю, как это решить.

Любая помощь или подсказка будет весьма признателен (я уже потерял несколько часов на этом), Приветствия, Томас

+0

Я угадываю здесь, но на стороне java вы шифруете b64. на php вы дешифруете decryptb64. я думаю, что на стороне php вам сначала нужно сделать decryptb64, а затем шаг дешифрования – ITroubs

+0

Найдено [это] (http://stackoverflow.com/questions/8530312/php-equivalent-for-java-triple-des-encryption -decryption), которые могут помочь вам приступить к работе. Java находится в вопросе, PHP equiv в ответе. – Jon

ответ

3

Спасибо за подсказки.

К сожалению, никто из них не работал для меня.

я, наконец, решить его на основе этого кода: https://github.com/stevenholder/PHP-Java-AES-Encrypt

Чирза, Томас

+0

что? этот код дает javax.crypto.BadPaddingException, как вы решили это: https://github.com/stevenholder/PHP-Java-AES-Encrypt/issues/1 –

1

Вы тоже выбираете метод обивка, прочитать this с кодом PHP на звено вы haveto @ Джон выбрать PKCS # 5-отступы:

// Create the cipher 
Cipher desCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
0

я имел такую ​​же проблему в контексте RSA (Java: шифрование, PHP: дешифрование), решить мой проблема следующая: в генерации keyPair увеличивается значение «initialize» с 512 до 1024. И это работает. намек я следовал здесь: http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html , где говорится, что каждый Java-реализация должна реализовать, по крайней мере: ... RSA/ЕЦБ/PKCS1Padding (1024, 2048) ... поэтому, возможно, результат из keygeneration не совместимо

Смежные вопросы