Estou intrigado por você parecer usar um novo formato de despejo de arquivo toda vez que você postar :-)
Supondo que você esteja como antes de usar (RSA-com-) AES256CBC- (HMAC) SHA1: sim, você pode descriptografar cifras CBC de TLS com openssl enc
, exceto para ARIA. (Também RC4, embora você deva evitar o uso do RC4 para qualquer finalidade, inclusive o TLS. OTOH enc
não pode fazer nenhuma cifra AEAD: não GCM ou CCM, e não ChaCha / Poly.)
O formato de registro em TLS1.2 (e 1.1) para uma cifra CBC é abordado em RFC5246 seção 6.2.3.2 . Para AES, os primeiros 16 octetos são o IV eo restante é o texto cifrado, que deve ser descriptografado no corpo do registro de texto simples (neste caso, a mensagem Finished) mais preenchimento HMAC plus - mas o preenchimento TLS não é o mesmo que o PKCS5 / 7 padding suportado por enc
(e internamente pela EVP_{??crypt,Cipher}*
API), então você mesmo precisa fazer essa parte.
Conforme descrito em sua página man no seu sistema ou na web , e algumas perguntas em várias pilhas (embora a maioria das que eu tenha notado seja sobre a correspondência da linha de comando com outro código como Java e python, não com uma especificação), openssl enc
usa a criptografia baseada em senha ) que não é o que você quer aqui. Para fazer a descriptografia baseada em chave, você precisa especificar -d
, -K
(maiúsculas e minúsculas) com a chave em hexadecimal e -iv
com o IV em hexadecimal se usado pela codificação (AES-CBC não ):
$ echo $key; echo $iv
4bf20108190203c4210ff9df6c4eb6e907ddd1f49646ab4b243c80a6ae9b4808
9A1BF36B786C3B5985617C76AFD985D6
$ sed 1,2d <1346633.dat
8FFDAF6D9F1A25EF
40159702B5ADEF40
2BDB5196CE76A93F
D730493ACCF92944
7FA9C6F1172D6B40
35F5578EBFE95C6D
$ sed 1,2d <1346633.dat |xxd -p -r |openssl aes-256-cbc -d -K $key -iv $iv -nopad |xxd
0000000: f730 34cc b90f b0b0 6313 9a0f 239c 6e87 .04.....c...#.n.
0000010: 187f ff00 52d1 3e9c 2aef d5cd c07e 15be ....R.>.*....~..
0000020: dee0 aa95 6994 5ce6 768d 1952 ac00 17ba ....i.\.v..R....
Infelizmente, como você pode ver, essa descriptografia é inválida: ela não termina com o preenchimento no estilo TLS e não começa com uma mensagem Concluída, que é a primeira transmissão pós-CCS feita pelo cliente estar. A sua chave derivada está errada ou o seu despejo deste registro é.
Uma sugestão que pode ajudar: faça uma conexão usando (edit) openssl s_client -debug
e registre sua saída em um arquivo. Isso despeja todos os registros em hexadecimais (e ASCII) que você pode usar como dados ou para verificar as várias entradas (incluindo o registro criptografado contendo Finished), E o bloco 'SSL-Session' no final inclui o valor correto do arquivo. segredo mestre que você pode usar como uma verificação cruzada. Você pode adicionar -msg
para também descarregar as mensagens criptografadas; isso é mais volumoso mas um pouco mais conveniente e é o que eu fiz abaixo. Outra possibilidade, um pouco mais de trabalho para configurar, é conectar-se de um programa cliente Java SSL / TLS (JSSE) executado com sysprop javax.net.debug=ssl
e log; que despeja lotes de informações, incluindo o segredo mestre e chaves de trabalho.
Como um exemplo de como isso deve funcionar, eu passei pelo procedimento em uma sessão de amostra registrada (que eu realmente criei no seu primeiro Q há algumas semanas), fazendo manualmente a master e derivações de trabalho e descriptografar e verificar a mensagem Finished do cliente:
$ cat tempc
2f e9 97 3e e4 11 89 81 c5 bc 18 11 7b c9 e9 3d
64 cb 88 6e a4 ac f2 01 95 05 d7
fe 3d 09 f4 13 4a d7 39 77 bf 50 dc f4 7b 9b b8
3c 0b 2f bf 98 5a 9c 4c 2d 28 6c 6a b6 93 a9 29
c5 5f f1 a3 cd
$ # this is the hexdump of from s_client -debug, cleaned up
$
$ echo $key; echo $iv
7d18617e178fc6320019442c6cd071ca4b4f7d2bb83f6194c23681aefd84f120
2fe9973ee4118981c5bc18117bc9e93d
$ # you can see the IV is the first line (16 bytes) of tempc
$ sed 1d tempc |xxd -p -r |openssl aes-256-cbc -d -K $key -iv $iv -nopad |tee tempc! |xxd
0000000: 1400 000c 5bbc 39d8 6c5d dbb1 076b b91b ....[.9.l]...k..
0000010: 9f4e 5c55 fd9e a185 6901 4bc0 6f02 2c0d .N\U....i.K.o.,.
0000020: 5bb0 d8c9 0b0b 0b0b 0b0b 0b0b 0b0b 0b0b [...............
$ # those last 12 bytes are SSL/TLS-style padding
$ # the first 4 bytes are a handshake message header for x14=Finished,
$ # followed by the 12 byte verify_data value, total 16 bytes
$
$ echo $mkey
28a3244d49c644f889b44f2bae54466b6913fb1e
$ { printf '$ echo $key; echo $iv
4bf20108190203c4210ff9df6c4eb6e907ddd1f49646ab4b243c80a6ae9b4808
9A1BF36B786C3B5985617C76AFD985D6
$ sed 1,2d <1346633.dat
8FFDAF6D9F1A25EF
40159702B5ADEF40
2BDB5196CE76A93F
D730493ACCF92944
7FA9C6F1172D6B40
35F5578EBFE95C6D
$ sed 1,2d <1346633.dat |xxd -p -r |openssl aes-256-cbc -d -K $key -iv $iv -nopad |xxd
0000000: f730 34cc b90f b0b0 6313 9a0f 239c 6e87 .04.....c...#.n.
0000010: 187f ff00 52d1 3e9c 2aef d5cd c07e 15be ....R.>.*....~..
0000020: dee0 aa95 6994 5ce6 768d 1952 ac00 17ba ....i.\.v..R....
$ cat tempc
2f e9 97 3e e4 11 89 81 c5 bc 18 11 7b c9 e9 3d
64 cb 88 6e a4 ac f2 01 95 05 d7
fe 3d 09 f4 13 4a d7 39 77 bf 50 dc f4 7b 9b b8
3c 0b 2f bf 98 5a 9c 4c 2d 28 6c 6a b6 93 a9 29
c5 5f f1 a3 cd
$ # this is the hexdump of from s_client -debug, cleaned up
$
$ echo $key; echo $iv
7d18617e178fc6320019442c6cd071ca4b4f7d2bb83f6194c23681aefd84f120
2fe9973ee4118981c5bc18117bc9e93d
$ # you can see the IV is the first line (16 bytes) of tempc
$ sed 1d tempc |xxd -p -r |openssl aes-256-cbc -d -K $key -iv $iv -nopad |tee tempc! |xxd
0000000: 1400 000c 5bbc 39d8 6c5d dbb1 076b b91b ....[.9.l]...k..
0000010: 9f4e 5c55 fd9e a185 6901 4bc0 6f02 2c0d .N\U....i.K.o.,.
0000020: 5bb0 d8c9 0b0b 0b0b 0b0b 0b0b 0b0b 0b0b [...............
$ # those last 12 bytes are SSL/TLS-style padding
$ # the first 4 bytes are a handshake message header for x14=Finished,
$ # followed by the 12 byte verify_data value, total 16 bytes
$
$ echo $mkey
28a3244d49c644f889b44f2bae54466b6913fb1e
$ { printf '%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%\x16\x03\x03%pre%\x10'; head -c16 tempc! ; } \
> |openssl sha1 -mac hmac -macopt hexkey:$mkey -binary |xxd -p
9f4e5c55fd9ea18569014bc06f022c0d5bb0d8c9
$ # the 20 bytes after the 16-byte message and before the padding
$ # correctly match HMAC-SHA1 of the pseudoheader plus the message
%pre%%pre%%pre%%pre%%pre%%pre%\x16\x03\x03%pre%\x10'; head -c16 tempc! ; } \
> |openssl sha1 -mac hmac -macopt hexkey:$mkey -binary |xxd -p
9f4e5c55fd9ea18569014bc06f022c0d5bb0d8c9
$ # the 20 bytes after the 16-byte message and before the padding
$ # correctly match HMAC-SHA1 of the pseudoheader plus the message
Quanto ao 'verify_data' em a mensagem Concluída , sim você precisa obter o hash de todas as mensagens anteriores de handshake, conforme descrito em 7.4.9 (em TLS1.3 isto é denominado hash 'transcrito') e então o PRF (como discutido nos posts anteriores) onde a chave é o segredo mestre e a semente é o rótulo fixo 'cliente terminado' ou 'terminado pelo servidor' (conforme aplicável) mais que o transcript hash. Isso é muito mais trabalho e eu não fiz isso pelo exemplo, embora eu provavelmente possa, se necessário.