Descobrir a chave exata criada pelo mcrypt do PHP
Um aplicativo PHP que estou mantendo usa Rijndael_256 com criptografia EBC_MODE com mcrypt. Diversão diz que a chave não tem 256 bits, mas apenas 160. De acordo com omcrypt_encrypt
documentação a chave é preenchida com \ 0 para obter o tamanho necessário se for muito pequeno.
A chave com a qual os dados serão criptografados. Se for menor que o tamanho necessário, é preenchido com '\ 0'. É melhor não usar strings ASCII para chaves.
Isso parece acontecer em torno do início delinha 1186 em mcrypt.c e modificando a chave na linha 1213.
Então vamos dizer que temos$key = 'abcdefghijkm';
o que é muito curto, mas a implementação do PHP do mcrypt garante que ele seja estendido para 32 caracteres (ou 256 bits) ao usar o RIJNDAEL_256. Como será a chave final?
Eu estou perguntando isso porque outro aplicativo está sendo construído que usa os mesmos dados criptografados, mas está em outro idioma. Perl para ser exato e eu estou usandoCrypto::Rijndael
. Para a chave de exemplo fornecida, qual é a chave exata que eu teria que alimentar paraCrypto::Rijndael
(ou qualquer outro para esse assunto) para poder descriptografar os dados novamente?
Atualizar
Com Perl eu posso gerar uma chave que é \ 0 acolchoado fazendopack('a32', 'my secret key');
(ouZ32
)length()
irá relatar 32 e oCrypt::Rijndael
módulo aceita a chave. Olhando para a fonte do mcrypt do PHP, esta deve ser a chave que está sendo gerada (\ 0 padded), mas ela simplesmente não vai aguentar.
Em teoria em PHPpack('a32', 'my secret key');
deve resultar na mesma tecla \ 0 acolchoada que o mcrypt do PHP gera, mas este não é o caso.
Estou muito perto de apenas criptografar tudo novamente, mas com uma nova chave. Isso está demorando muito tempo.