A ferramenta de linha de comando openssl
é uma demonstração da biblioteca OpenSSL. Tem uma interface bastante aleatória e pouca documentação. Eu não recomendo usá-lo para nada além de testar a biblioteca OpenSSL. (Sim, existem pessoas que gerenciam CAs com openssl
. Eu temo por sua sanidade.)
AES funciona com uma chave, não com uma senha. Uma chave AES-128 tem exatamente 16 bytes.
A opção -k
não aceita uma chave como entrada, é necessária uma senha. Essa senha é criptografada para derivar uma chave; o padrão é MD5 e pode ser substituído pela opção de linha de comando -md
. Isso não está documentado no manual, tanto quanto eu posso ver, você só tem que ler a fonte ( apps/enc.c
, ligue para EVP_BytesToKey
). O MD5 digest produz um valor de 16 bytes de qualquer string, mas isso não é o que foi usado aqui. Nesse caso, a chave é, na verdade, REDRYDER
, em que %code% são bytes nulos. -K
REDRYDER
%code%%code%%code%%code%%code%%code%$(echo REDRYDER | od -An -tx1 | tr -d ' ')
5245445259444552
FLAG=DAISY%code%%code%%code%%code%%code%%code%
%code%%code%%code%%code%%code%
A opção %code% permite passar uma chave, em hexadecimal. Se você passar menos bytes que o tamanho da chave, o OpenSSL será concluído com bytes nulos. Então, para passar a chave %code% , você pode passar %code% , que é %code% .
A opera�o de desencripta�o AES-128-ECB do bloco de texto cifrado FC89BFC2B05F1C2E64B8784392783AC9 com a chave 52454452594445520000000000000000 produz 464c41473d4441495359000000000000 (utilizando hexadecimal para representar as sequ�cias de bytes). Isso é %code% .
Para pequenas manipulações criptográficas como essas, gosto do nível superior do Python com a biblioteca Pycrypto .
>>> from binascii import hexlify, unhexlify
>>> from Crypto.Cipher import AES
>>> ciphertext = unhexlify('FC 89 BF C2 B0 5F 1C 2E 64 B8 78 43 92 78 3A C9'.replace(' ', ''))
>>> key = 'REDRYDER'.ljust(16, '>>> from binascii import hexlify, unhexlify
>>> from Crypto.Cipher import AES
>>> ciphertext = unhexlify('FC 89 BF C2 B0 5F 1C 2E 64 B8 78 43 92 78 3A C9'.replace(' ', ''))
>>> key = 'REDRYDER'.ljust(16, '%pre%')
>>> AES.new(key, AES.MODE_ECB).decrypt(ciphertext)
'FLAG=DAISY\x00\x00\x00\x00\x00\x00'
')
>>> AES.new(key, AES.MODE_ECB).decrypt(ciphertext)
'FLAG=DAISY\x00\x00\x00\x00\x00\x00'