Ошибка шифрования и дешифрования HTTP-запроса с помощью PHP и Objective-C

1

У меня есть проблема с HTTP POST- запросами на шифрование и дешифрование.

У меня есть приложение OS X, написанное в Objective-C, которое отправляет зашифрованный (CocoaSecurity) HTTP-запрос POST на сервер:

- (NSString *)secure
{
    NSData* key = [@"9eab87dc72b927c9" dataUsingEncoding:NSASCIIStringEncoding];
    NSData* iv = [@"d6f8f85911c4d8d1" dataUsingEncoding:NSASCIIStringEncoding];

    CocoaSecurityResult *result = [CocoaSecurity aesEncrypt:@"a" key:key iv:iv];

    return result.hexLower;    
}

и я получаю шифрование

5219abd6c1439dc832ab512dae8cce80

Также у меня есть WEB-приложение, написанное на PHP, которое расшифровывает отправленный запрос

protected function processEncrypt()
{
    if ($this->input) {
        $crypt = mcrypt_module_open($this->algorithm, '', $this->mode, $this->encryptIv);
        mcrypt_generic_init($crypt, $this->encryptKey, $this->encryptIv);
        $this->input = mcrypt_generic($crypt, $this->input);
        mcrypt_generic_deinit($crypt);
        mcrypt_module_close($crypt);

        if ($this->template == 'hex') {
            $this->input = bin2hex($this->input);
        } elseif ($this->template == 'base64') {
            $this->input = base64_encode($this->input);
        }
    }
}

Зашифрованное сообщение в конце обработки запроса полностью отличается от дешифрованного.

Я получаю шифрование

10967675e5cf70878ee063a73f2a8394

До сих пор я выяснил, что это может быть проблема с добавлением PKCS#7 (библиотека PHP mcrypt имеет нулевое заполнение). Я попытался удалить дополнение, изменив CocoaSecurity.m код CocoaSecurity.m и заменив значение kCCOptionPKCS7Padding равным 0. После этой замены CocoaSecurity вызывает исключение Encrypt Error! вызвано kCCAlignmentError...

Может ли кто-нибудь сказать мне, где проблема?

  • 0
    Да, это так: NSString+Security.h .
  • 0
    'алгоритм' => 'rijndael-128', 'mode' => 'cbc',
Показать ещё 14 комментариев
Теги:
encryption
aes
cryptography

1 ответ

0
Лучший ответ

Обратите внимание, что CocoaSecurity использует стандартное дополнение PKCS # 7 (kCCOptionPKCS7Padding), но mcrypt использует нестандартное/небезопасное заполнение нулей. Вам нужно будет удалить дополнение PKCS # 7 в вашем php-коде. Вы можете использовать этот код:

Добавить PKCS # 7 padding (php):

 $pad = $block - (strlen($str) % $block);
 $str .= str_repeat(chr($pad), $pad);

Удалите PKCS # 7 padding (php):

$len = strlen($str);
$pad = ord($str[$len-1]);
$str = $strsubstr($str, 0, $len - $pad);

См. Этот ответ SO для получения более подробной информации.

  • 0
    Я отправляю зашифрованную одну букву «а» (заполнение не должно применяться), но сообщение по-прежнему недопустимо ...
  • 0
    Как правило, заполнение необходимо, поскольку AES является алгоритмом блоков и обрабатывает только данные размером с блок с размером блока 16 байтов. Один байт должен быть расширен до размера блока при шифровании и уменьшен при расшифровке. Единственное добавление времени не требуется, если данные точно кратны размеру блока, и это известно априори обеим сторонам. Если заполнение не предоставлено и данные не кратны размеру блока, оставшаяся часть последнего блока будет заполнена неопределенными данными.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню