2015-03-26 3 views
2

Я пытаюсь зашифровать строку в Swift и расшифровать ее на PHP. Я получил хорошую помощь от SO, и, надеюсь, кто-то может помочь еще раз. Вот код, который я пытаюсь использовать в PHP для дешифрования.PHP AES256 PKCS7 расшифровка от iOS Swift

$key = "test"; 
$pass = "bLOKONASw8tE2cki5QhkcA=="; 
$iv = "123456789"; 

$base64encoded_ciphertext = $pass; 
echo "pass: ".$pass; 

$res_non = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($base64encoded_ciphertext), MCRYPT_MODE_CBC, $iv); 

$decrypted = $res_non; 
echo " 1: ".$decrypted; 
$dec_s2 = strlen($decrypted); 
echo " 2: ".$dec_s2; 
$padding = ord($decrypted[$dec_s2-1]); 
echo " padding: ".$padding; 
$decrypted = substr($decrypted, 0, -$padding); 
echo " Decrypted: ".$decrypted; 

строка шифруется в Swift, и я base64 закодировать его прежде чем отправить его на сервер.

У меня нет ошибки, но похоже, что полученное «расшифрованное» значение пуст.
У меня есть функция дешифрования теста в Swift, которая возвращает правильный результат.

Key:<74657374 73747269 6e67> 
Iv:<31323334 35363738 39303132 33343536> 
Message: <74657374 6d657373 616765> 
ivLength = 16, ivData = <31323334 35363738 39303132 33343536> 
encryptedData: <6cb38a38 d012c3cb 44d9c922 e5086470> 
base64cryptString = bLOKONASw8tE2cki5QhkcA== 

Если кто-то может помочь мне понять, где я неправильно, это было бы ар

+0

проверить, что вы дополняете. У меня возникла проблема с C#. Некоторое время назад получалось, что байты заполнения различны. Php использует true nulls. Другие языки используют ноль или вкладки и т. Д. Мне пришлось сделать некоторую работу вокруг кода, который был оскорбительным длинный. Кроме того, если они заполняли до 16 байтов в php, а C# работает до 64 байтов, я думаю, что я должен был это допускать. – Dave

+0

Не могли бы вы объяснить, как вы решили проблему? – Alex

+0

Его было, как 5 лет с тех пор, как я это сделал, и у меня нет кода для передачи. Я помню что-то вроде того, что нужно установить размер пакета pkcs на что-то глупое, как 9, чтобы дать равноценность 7 в C#. Я посмотрю, код клиента, архивированный где-то – Dave

ответ

0

Длина вектора инициализации должна быть 16 байт в AES - режиме CBC.

+0

Я исправил размер блока, сделав его 16bytes. Однако теперь я не получаю результат в конце. Я обновил код, чтобы отразить изменения. Ранее мне сказали, что мне нужно удалить заполнение PKCS7, что и должно делать часть кода. Я не уверен, где я ошибаюсь. Спасибо за вашу помощь. – Alex

+0

Во-первых, без шифрования каких-либо кодов, я могу только гадать. Если вы хотите зашифровать с помощью AES256 с помощью CCCrypto, размер ключа должен быть ровно 32 байта. Если вы хотите использовать ключ переменной длины, попробуйте использовать алгоритм Blowfish, мою рекомендацию. Я написал блог об этом, поэтому, пожалуйста, взгляните. http://blog.s21g.com/articles/2382 В этом примере я усекаю размер ключа в соответствии со спецификацией AES. – Satachito

+0

Я просмотрел вашу статью, и, хотя я ценю помощь, я не могу понять, как ее использовать. У вас есть рабочий пример Blowfish? Еще раз спасибо. – Alex

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