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