Opções apropriadas para openssl com texto cifrado simples

1

No último final de semana houve um desafio criptográfico em que o texto cifrado era o seguinte hex:

FC 89 BF C2 B0 5F 1C 2E 64 B8 78 43 92 78 3A C9

Eu sei com certeza que isso é criptografado usando o AES / Rijndael 128-bit ECB, a chave é o REDRYDER e uma solução para isso já foi postada para confirmar isso. O texto sem formatação é FLAG = DAISY. Eu escrevi um script PHP mcrypt simples que descriptografa isso sem sal ou sem seqüência IV e descriptografa corretamente. No entanto, quando tentei usar o openssl, não obtive o texto simples:

echo "0: FC 89 BF C2 B0 5F 1C 2E 64 B8 78 43 92 78 3A C9" | xxd -r | openssl aes-128-ecb -d -k REDRYDER -nosalt -nopad ; echo

Isso apenas gera alguns dados binários. Eu também tentei passar a entrada através de dd conv = swab para fazer uma troca de bytes.

O que estou fazendo de errado?

    
por deltaray 18.06.2014 / 16:50

2 respostas

2

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-KREDRYDER$(echo REDRYDER | od -An -tx1 | tr -d ' ')5245445259444552FLAG=DAISY%code%%code%%code%%code%%code%%code%%code%%code%%code%%code%%code%%code%%code%%code%%code%%code%%code% , em que %code% são bytes nulos.

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'
    
por 19.06.2014 / 02:59
0

Isso funciona:

echo '0: FC89BFC2B05F1C2E64B8784392783AC9' | xxd -r | openssl enc -aes-128-ecb -d -nopad -nosalt -K 5245445259444552

Eu não entendo a entrada para a opção -k, mas se você converter sua chave de texto simples em hex (ordenação de bytes apropriada) e usar -K em vez disso, ela funcionará.

openssl é voodoo!

    
por 18.06.2014 / 18:16