Приложение PHP, которое я поддерживаю, использует Rijndael_256 с шифрованием EBC_MODE с помощью mcrypt. Забавно, что ключ имеет длину не 256 бит, а всего 160. Согласно mcrypt_encrypt
ключ дополняется \0, чтобы получить требуемый размер, если он слишком мал.
Ключ, с помощью которого данные будут зашифрованы. Если он меньше требуемого размера ключа, он дополняется «\0». Лучше не использовать строки ASCII для ключей.
Похоже, это происходит примерно в начале строки 1186. в mcrypt.c и изменив ключ в строке 1213.
Допустим, у нас есть $key = 'abcdefghijkm';
, что слишком коротко, но реализация mcrypt в PHP обеспечивает расширение до 32 символов (или 256 бит) при использовании RIJNDAEL_256. Как будет выглядеть окончательный ключ?
Я спрашиваю об этом, потому что создается другое приложение, которое использует те же зашифрованные данные, но на другом языке. Perl, если быть точным, и я использую Crypto::Rijndael
. Для данного примера ключа, какой точный ключ я должен передать Crypto::Rijndael
(или любому другому, если на то пошло), чтобы иметь возможность снова расшифровать данные?
Обновить
С Perl я могу сгенерировать ключ, который дополнен \0, выполняя pack('a32', 'my secret key');
(или Z32
), length()
сообщит 32, а модуль Crypt::Rijndael
примет ключ. Глядя на источник PHP mcrypt, это должен быть сгенерированный ключ (дополненный \ 0), но он просто не примет его.
Теоретически в PHP pack('a32', 'my secret key');
должен получиться тот же ключ с добавлением \0, который генерирует mcrypt в PHP, но это не так.
Я очень близок к тому, чтобы снова все зашифровать, но с новым ключом. Это занимает слишком много времени.
mcrypt_encrypt
и пытался расшифровать с помощью PerlCrypt::Rijndael
. Все, что мне нужно знать, это то, как выглядит фактический ключ, когда PHPmcrypt_encrypt
делает с ним :-). - person Htbaa   schedule 18.07.2012