2013-08-07 4 views
1

Я разрабатываю приложение, которое позволяет конечным пользователям принимать викторины из своих браузеров. Часть требования заключается в том, что когда время начала викторины вокруг, вопрос должен отображаться каждому участнику одновременно. Это делает вопросы обслуживания конечными пользователями с сервера менее разумными, потому что это приведет к внезапному всплеску запроса, поэтому я намереваюсь отвечать на них, как только они подключатся, и менее чем за 2 часа до начала викторины. Проблема в том, что, поскольку это соревнование, вопросы не следует рассматривать перед началом работы, поэтому необходимо зашифровать его.Проблемы с совместимостью с pidcrypt и openssl_encrypt

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

Проблема теперь в симметричной части шифрования. Я пытаюсь использовать метод openssl_encrypt для шифрования на стороне сервера и пытается расшифровать с помощью pidcrypt (библиотека шифрования/дешифрования javascript) на стороне клиента. Оказывается, pidcrypt требует, чтобы ваш iv (вектор инициализации) составлял восемь байтов, однако openssl_encrypt с использованием режима AES-256-CBC не позволяет использовать восемь байтов, поэтому он постоянно настаивает на 16 байтах. Я сделал много перестановок и экспериментов без везения. В документации pidcrypt было указано, что она совместима с opensl, поэтому мой вопрос: что я делаю неправильно? Ниже приведен код, который шифрует на стороне сервера с помощью PHP

 $iv_len = openssl_cipher_iv_length("AES-256-CBC"); 
      $key='My very secret key.......'; 
    $iv = openssl_random_pseudo_bytes($iv_len); 
    $enc = openssl_encrypt('Hello', "AES-256-CBC", $key, 0, $iv); 
    $encryptedMessage = base64_encode("Salted__".bin2hex($iv).$enc); 
    echo json_encode(array('key'=>$key, 'encrypt'=>$encryptedMessage,)); 

Пожалуйста, есть способ сделать $ iv_len 8bytes долго, а не 16 байт, что этот код постоянно возвращающие и Am Я приближающиеся всю эту установку в правильно. Спасибо

ответ

0

pidcrypt не использует 8-байтный IV, он использует 8-байтовую соль. IV и соли - разные концепции, хотя они имеют много общего.

В pidcrypt рандомизированная соль используется вместе с паролем и MD5 для генерации ключа и IV. Затем соль предварительно заносится в зашифрованный текст (как это делает openssl). Сервер должен использовать тот же метод для генерации ключа и IV, используя предварительно сохраненное значение соли и общий пароль. В настоящее время вы пытаетесь напрямую с ключом и IV, что неверно.

Независимо от библиотеки, IV, используемый для дешифрования любого режима CBC, должен быть идентичен размеру блока базового шифра. Основной блок-шифр здесь AES, что означает, что IV всегда будет 16 байтов.

Вы должны внимательно прочитать комментарии пользователей к недокументированному методу openssl_encrypt, а затем, возможно, либо найти другую совместимую с OpenSL библиотеку в PHP, либо найти/реализовать the OpenSSL key derivation method (EVP_BytesToKey).

Обратите внимание, что следующий вывод производится с помощью openssl утилита командной строки:

00000000 53 61 6c 74 65 64 5f 5f 44 a2 2f ee ac ee 94 fd |Salted__D./.....| 
00000010 6f 93 17 24 44 12 88 66 e7 fe 5c d5 7d 81 fe d9 |o..$D..f..\.}...| 
00000020 

Так что это ASCII-строка, содержащая Salted__, за которым следует 8 байт случайной соли (а не IV), а затем 16 байт шифротекста (один полный блок).

+0

Большое спасибо. Я внес правильные изменения, однако проблема openssl, принимающая только 16 байтов IV и pidcrypt с использованием 32 байтов IV, по-прежнему сохраняется, поэтому получение pidcrypt для расшифровки того, что openssl зашифровано, кажется невозможным. Еще раз спасибо за ваш ответ. –

+0

А, да, извините. Для этого вам необходимо реализовать ['EVP_BytesToKey'] (http://www.openssl.org/docs/crypto/EVP_BytesToKey.html), которая является ключевой функцией деривации, которая использует соль и IV ... –

+0

Опять же, почти все способы шифрования используют IV, который имеет тот же размер, что и базовый блочный шифр. AES может использовать и использовать только 16 байтов IV в режиме CBC. Все остальное * не является IV *. –

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