Шифрование с использованием AES-128 в Java - PullRequest
2 голосов
/ 23 ноября 2011

У меня проблема с шифрованием данных с использованием AES-128 / ecb / PKCS5Padding + base64.Я использую следующий код для шифрования своих данных:

String input = "{\"action\":\"getQuestion\"}";
String key = "4288f0b8060ca1b682bf795f2617cfdc";
byte[] data = input.getBytes();
byte[] encrypted = null;
byte[] keyBytes = new BigInteger(key, 16).toByteArray();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
encrypted = cipher.doFinal(data);
System.out.println(Base64.encodeBytes(encrypted));

Я получаю 6GuKXA6FFR+yMmO8ksAEOLL5e574a5tLob7tt5IG+jk= после шифрования, но не могу расшифровать на сервере с помощью функции PHP.

Когда я шифруюэти данные с помощью функции PHP:

function encrypt($encrypt, $key=null) 
{
   $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
   $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $encrypt, MCRYPT_MODE_ECB, $iv));
   return $encrypted;
}

Я получаю 6Wc3LPWvfJ7T86iG0igmdQaeZ8xs9qY419mAVWfNH+M=, и я могу успешно выполнить расшифровку, используя следующую функцию PHP:

function decrypt($decrypt, $key=null) 
{
   $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND);
   $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($decrypt), MCRYPT_MODE_ECB, $iv);
   return $decrypted;
}

При использовании шифрования и дешифрования base64 существуютНет проблем;Эта проблема возникает только при шифровании с использованием AES-128.

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Вы можете проверить вывод из вашего метода Java в командной строке, используя openssl. Java по умолчанию установит для IV значение 0, если оно не указано.

The file "enc.txt" contains "6GuKXA6FFR+yMmO8ksAEOLL5e574a5tLob7tt5IG+jk=" [corrected]

Run

openssl aes-128-ecb -in enc.txt -a -K 4288f0b8060ca1b682bf795f2617cfdc -iv 0 -d

Результат:

{"action":"getQuestion"}

Попробуйте ваш mcrypt_decrypt со значением $ iv равным 0.

1 голос
/ 23 ноября 2011

Проблема не в IV или набивке, как я изначально думал.Это связано с тем, как вы обрабатываете ключ в коде PHP.Если вы используете фактическую строку 4288f0b8060ca1b682bf795f2617cfdc в качестве ключа, переданного в mcrypt_encrypt и mcrypt_decrypt, то вы не используете тот же ключ, что и в коде Java.Вам нужно будет преобразовать эту шестнадцатеричную строку в байты.Это можно сделать следующим образом:

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, pack("H*", $key), base64_decode($decrypt), MCRYPT_MODE_ECB, $iv);

Обратите внимание на добавление pack("H*", $key) для преобразования значения.Я обнаружил, что здесь в комментариях к функции PHP bin2hex.Это исправит текущую проблему.Вы можете столкнуться с проблемами заполнения при работе с данными различной длины, так как PHP не выполняет заполнение PKCS5.См. этот комментарий о реализации этой отсутствующей функции.Кроме того, я бы рекомендовал смотреть на CBC вместо ECB из-за неподходящей ECB и слабости шифрования данных.

...