AES Rijndael на PHP-сервере и iOS генерирует иногда разные шифры - PullRequest
2 голосов
/ 26 ноября 2011

Я использую категорию NSData + AESCrypt Джима Дови и NSString + AESCrypt Майкла Седлачека (2011-02-22).

А на PHP у меня есть простой скрипт:

<?php
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = '01234567890123456789012345678901';
$plaintext = "myworda";

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_ECB);
$base64encoded_ciphertext = base64_encode($ciphertext);
echo "ciphertext: ".$base64encoded_ciphertext."<br/>";
?>

В ObjC:

NSString *key = @"01234567890123456789012345678901";
NSString *plaintext = [@"+l56Ia4yyK19D2x2+oCXuw==" AES256DecryptWithKey: key];
NSLog(@"plaintext: %@", plaintext);

Я изменяю переменную $ plaintext в PHP, запускаю скрипт, копирую и вставляю выходной шифр в Objective-c, чтобы расшифровать его.

И:

  1. «myword» дает мне «+ l56Ia4yyK19D2x2 + oCXuw ==», и я расшифровываю и получаю «myword» на iOS [OK]

  2. «Доброе утро» дает мне «5UdImsV1pQs60ovXmH74HQ ==», и я дешифрую и получаю «Доброе утро» на iOS [OK]

  3. «Шредер» дает мне «KqNSCE8nGsYUYVdGZ2tnMw ==» и я расшифруюи получить «Шредер» на iOS [OK]
  4. «Шредер» дает мне «KqNSCE8nGsYUYVdGZ2tnMw ==», а я расшифровываю и получаю «Шредер» на iOS [OK]
  5. »очень долготекст "дает мне" lsa + QF3IHQnAFiOjl2Heyg == "и я расшифровываю и получаю" очень длинный текст "на iOS [OK]
  6. " очень, очень, очень, очень длинный текст "дает мне" kl / ThEyuyUMmKSqU4 / fJSzzJOyvsXrGRt5 / zsnqjQww = ", и я не могу расшифровать его на iOS [FAIL]

Почему отказывает # 5?Если я пытаюсь зашифровать «очень, очень, очень, очень длинный текст» с помощью XCode, я получаю «kl / ThEyuyUMmKSqU4 / fJS90UZoJ73S4gox2uCoWoIL8 =», заметив, что*

Но в дальнейшем, шифрование «доброе утро» на Xcode дает мне «hVq1AuR8PAXSOztK26pmMw ==», в то время как PHP выдает «5UdImsV1pQs60ovXmH74HQ ==», но Xcode расшифровывает оба «доброе утро» с помощью одного и того же ключа.

Пожалуйста, помогите.

Ответы [ 2 ]

4 голосов
/ 26 ноября 2011

Ваш PHP-код использует режим ECB. Я не вижу, где вы устанавливаете режим в ObjC. Предположительно вы используете режим по умолчанию. Возможно, что режим по умолчанию ObjC не ECB, скорее CBC. Также обратите внимание, что всякий раз, когда ваш открытый текст составляет 16 байтов или меньше (то есть один блок или меньше), расшифровка работает Когда он больше 16 байтов (то есть расширяется во второй блок), он терпит неудачу.

Я подозреваю, что по умолчанию ObjC - это режим CBC с нулевым IV. Это будет действовать так, как будто это ECB только для первого блока, и будет отличаться для второго и последующих блоков.

Режим ECB небезопасен и пропускает информацию. Вместо этого используйте режим CBC с указанным IV. Как минимум измените свой PHP-код, чтобы использовать режим CBC вместо режима ECB.

0 голосов
/ 26 ноября 2011

Вы шифруете сообщение, используя MCRYPT_RIJNDAEL_128, что дает размер блока 128 бит или 16 байтов. Вы заметите, что very very very very long text больше 16 байтов.

Так что я полагаю, что вы расшифровываете на ios, который использует другой размер блока. Я не знаком с ios, но AES256DecryptWithKey, кажется, указывает, что он использует размер блока 256 бит.

Попробуйте использовать MCRYPT_RIJNDAEL_256 в своем PHP-коде или измените код ios на AES128DecryptWithKey (я не знаю, существует ли он, опять же, я не знаю ios)

...