RSA-шифрование приводит к тайм-ауту выполнения сервера - PullRequest
0 голосов
/ 30 апреля 2010

Я использую PHP Crypt_RSA (http://pear.php.net/package/Crypt_RSA) для шифрования и расшифровки содержимого. Содержимое имеет размер 1 КБ. Ниже приведены результаты:


  1. длина ключа = 1024
  2. Функция шифрования занимает время: 225 с

  1. длина ключа = 2048
  2. Функция шифрования занимает время: 115 секунд

Мне нужно сократить это время выполнения, так как у большинства работающих серверов Apache ограничение времени выполнения составляет 120 секунд. Как сократить это время выполнения? RSA alorithm docs говорит, что генерируется только 1024 - 2048 ключей. Я фактически попытался сгенерировать ключ большего размера, но это всегда приводит к тайм-ауту выполнения.

Как мне работать над сокращением времени шифрования - дешифрования?

Спасибо, Nila

Ответы [ 4 ]

1 голос
/ 02 мая 2011

Во-первых, я бы рекомендовал использовать phpseclib - чистую реализацию PHP RSA . Проблема с Crypt_RSA в PEAR заключается в том, что он не поддерживает очень много ключевых форматов, не делает ослепление RSA (и поэтому уязвим для временных атак) и не поддерживает OAEP / PSS.

ZZ Coder рекомендует использовать PKCS # 7. Следующий URL-адрес обсуждает, как использовать phpseclib в облегченной версии PKCS # 7:

http://area51.phpbb.com/phpBB/viewtopic.php?f=84&t=33024

1 голос
/ 30 апреля 2010

Увеличьте свой ключ :) В соответствии с вашими цифрами вы вдвое сокращаете время, удваивая размер ключа. Я уверен, что это ошибка.

Первое, что нужно сделать, это переключиться на OpenSSL, который является расширением в C. Если вы используете правильную сборку, операции с открытым ключом выполняются в сборке, так что это намного, намного быстрее, чем код PHP. По моему опыту, это как минимум в 10 раз быстрее.

Второе, что нужно сделать, - это использовать стандартный конверт, такой как PKCS # 7 (OpenSSL поддерживает это). Он будет использовать симметричный ключ для шифрования и шифрования ключа с использованием открытого ключа. Он имеет много накладных расходов для небольших сообщений, но в долгосрочной перспективе вы выиграете.

0 голосов
/ 30 апреля 2010

Вместо этого вы можете использовать mcrypt или openssl для своих нужд шифрования / расшифровки Смотрите openssl_public_encrypt для примеров. Это будет намного быстрее, чем реализация PHP, выполненная в Crypt_ * (даже если они используют bigint или другую реализацию большого целого C, такую ​​как gmp).

0 голосов
/ 30 апреля 2010

Не используйте RSA для шифрования контента, используйте RSA для шифрования симметричного ключа, который затем используется для шифрования контента.

Симметричный шифр AES использует длину ключа 256 бит, что составляет 32 байта, что примерно в 30 раз меньше данных для шифрования / дешифрования с использованием RSA, чем килобайт данных, которые вы шифруете сейчас.

Таким образом, 115 секунд будут сокращены до 3-4 секунд плюс время шифрования / дешифрования, используемое для AES, которое намного быстрее, чем RSA.

...