2016-05-09 8 views
2

снабжать струной, тетивой и т.п. Ok так вот пример кода со страницы http://phpseclib.sourceforge.net/crypt/examples.htmlИспользование phpseclib AES для шифрования

<?php 
include('Crypt/AES.php'); 
include('Crypt/Random.php'); 

$cipher = new Crypt_AES(); // could use CRYPT_AES_MODE_CBC 
// keys are null-padded to the closest valid size 
// longer than the longest key and it's truncated 
//$cipher->setKeyLength(128); 
$cipher->setKey('abcdefghijklmnop'); 
// the IV defaults to all-NULLs if not explicitly defined 
$cipher->setIV(crypt_random_string($cipher->getBlockLength() >> 3)); 

$size = 10 * 1024; 
$plaintext = str_repeat('a', $size); 

echo $cipher->decrypt($cipher->encrypt($plaintext)); 
?> 

Прежде чем-нибудь, почему линия //$cipher->setKeyLength(128); идет закомментирована?

И если я хочу установить свой ключ на «1234568790», есть ли что-нибудь, что я должен делать? Потому что это намного короче, чем длина ключа в приведенном выше примере (abcdefghijklmnop).

И, наконец, если открытый текст, который я хочу зашифровать, короток, что-то вроде «мое имя - это связь с Джеймсом», есть ли что-нибудь дополнительное, что я должен делать? Потому что из приведенного выше кода, кажется, длина открытого текста, должно быть 10 х 1024. (Почему?)

+0

Plaintext не должен быть 10x1024, они просто создали строку размером 10 КБ (следовательно, 10x1024), например, цели. 128-битный ключ означает 128/8 байтов = 16 байт, по 2 байта на символ, что составляет 8 символов. 256-битный ключ = 32 байта = 16 символов (следовательно, abcdefghijklmnop, который составляет 16 символов). Я не слишком хорошо знаком с той конкретной библиотекой, которую вы нашли лично - я предпочитаю расширение 'openssl' поверх чистых php-библиотек. – Mjh

+0

@Mjh спасибо за ваш комментарий. Но пример на странице будет отображать ключ как abcdefghijklmnop, когда я устанавливаю его на 128 бит ... это 16 символов для 128-битного ключа – imin

+1

Эти символы не обязательно должны использоваться. Ключ также можно преобразовать в шестнадцатеричный формат (через хеширование), а затем можно использовать соответствующее количество байтов. Лично ключи, которые я использую, всегда создаются случайным образом, а затем хэшируются - используемая функция хеширования выбирается в соответствии с размером блока шифрования. Шифрование - сложный зверь, и он часто не выполняется правильно (обученные криптовые парни найдут ошибки в комментарии, который я разместил). Я предлагаю [этот блог] (http://www.cryptofails.com/), прежде чем вы начнете шифрование. Лучше всего сделать это с самого начала. – Mjh

ответ

3

Прежде чем-нибудь, почему линия //$cipher->setKeyLength(128); идет закомментирована?

Скажите, что вы передаете 17-байтовый ключ в phpseclib через setKey. Что, по-вашему, должно произойти? В версиях 1.0 и 2.0, если setKeyLength не вызывается, тогда ключ имеет нулевое значение, равное 24 байтам (например, 192 бит). Но если setKeyLength-, то он будет усечен до 16 байт. В основной ветке (которая, как я понимаю, в конечном итоге станет ветвью 3.0), возникает исключение, если длина ключа недопустима. В этой версии может оказаться желательным вызвать setKeyLength, если, например, если вы хотите установить длину ключа как 128-бит в одной части кода, а затем на самом деле установить ключ в другой части кода. то есть. вы можете выполнить проверку длины, или phpseclib может выполнить проверку длины.

И если я хочу установить свой ключ на «1234568790», я должен что-нибудь сделать? Потому что это намного короче, чем длина ключа в приведенном выше примере (abcdefghijklmnop).

1234568790 технически недостаточно долго, чтобы быть действующим ключом. Это 80 байтов. Наименьший ключ AES поддерживает 128 бит. Возможно, вам стоит подумать о том, чтобы сделать что-то вроде setPassword('1234568790') вместо setKey('1234568790'). setPassword будет использовать функцию генерации ключа для генерации ключа из пароля.

В phpseclib 1.0 и 2.0 setKey будет, тем не менее, принять это как ключ. Он просто пропустит ключ. Мастер-ветвь otoh будет генерировать исключение, поскольку ключ на самом деле не достаточно длинный.

И, наконец, если открытый текст, который я хочу зашифровать, короток, что-то вроде «мое имя - связь с Джеймсом», есть ли что-нибудь дополнительное, что я должен делать? Потому что из приведенного выше кода кажется, что длина открытого текста должна быть 10 x 1024. (Почему?)

10 * 1024 - всего лишь пример. phpseclib по умолчанию будет использовать дополнение PKCS7, чтобы сделать строки достаточно длинными. например. ваша строка имеет длину 21 байт (если я правильно подсчитал). Поэтому, если вы вызываете $cipher->encrypt('my name is james bond'), то chr(11) будет добавляться в обычный текст 11 раз, phpseclib, а затем строка будет зашифрована. Это связано с тем, что блочные алгоритмы должны иметь открытый текст как кратный длине блока. Таким образом, зашифрованный текст будет иметь длину 32 байта. Когда вы выберете $cipher->decrypt('...'), вы получите исходную 21-байтную строку. Я мог бы подробнее рассказать о дополнении PKCS7, но, думаю, я ответил на ваш ближайший вопрос.

+0

Ничего себе. Очень информативно. Большое спасибо. – imin

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