Identificar o modo AES
Digamos que eu tenha uma API que aceita Plaintext e IV como parâmetro de entrada e retorna o texto cifrado. Eu sei que a API está usando criptografia AES 128, mas agora preciso identificar qual modo de criptografia (ECB, CBC, OFB, CFB ou CTR) ela está usando. Como posso identificar o modo de criptografia? Qualquer sugestão, sugestão ou orientação seria muito apreciada.
Exemplo:
curl "http://dev/api/v1.0/test?iv=00112233445566778899&text=01234567"
Resposta: 7fcb5212d14de7ddcc334ec31acec6ae
Respostas
Você tem uma caixa preta que criptografa os dados e está trabalhando com a suposição de que essa caixa preta implementa um modo popular (ECB, CBC, CTR, OFB ou CFB) de criptografia (não autenticada) em uma cifra de bloco. Você pode enviar textos simples de entrada para criptografar, bem como um IV de sua escolha.
Primeiro, você pode distinguir facilmente entre modos de transmissão e modos sem transmissão:
- CTR, OFB e CFB são modos de codificação de fluxo. O texto cifrado sempre tem o mesmo comprimento que o texto simples.
- ECB e CBC só podem criptografar blocos inteiros. O comprimento do texto cifrado é sempre um múltiplo do comprimento do bloco (16 bytes para AES, Camellia, ARIA, SM4).
- Existem modos sem fluxo para os quais o texto cifrado tem o mesmo comprimento que o texto simples, por exemplo CTS em cima de um modo como CBC ou XEX. Mas não os considerarei nesta análise.
Portanto, criptografe 1 byte. Se você obtiver 1 byte de texto cifrado, é um modo de streaming. Se você obtiver 16 bytes, é um modo de bloco inteiro com preenchimento. Se você receber um erro, mas criptografar 16 bytes funcionar, é um modo de bloco inteiro sem preenchimento.
Modos de preenchimento e bloqueio
O BCE não usa um IV. Portanto, se você obtiver a mesma saída independentemente do IV, é o ECB, caso contrário, provavelmente não. Mas se for um sistema com um design estranho, o IV poderia ser usado de uma forma não padronizada, por exemplo, um “quase-ECB” poderia usar ECB em IV + texto simples.
Criptografe dois blocos idênticos. Se os dois primeiros blocos de texto cifrado forem idênticos, é o ECB. Caso contrário, por eliminação, é CBC. (Pode ou não haver um terceiro bloco, dependendo do método de preenchimento.)
O preenchimento CBC (ou ECB) normalmente aumenta o tamanho do texto cifrado em 1 a 16 bytes. A razão pela qual o preenchimento é sempre de pelo menos 1 byte é para tornar a descriptografia inequívoca: se houvesse casos de preenchimento vazio, seria impossível dizer olhando para o texto cifrado descriptografado, mas não ainda não preenchido. A maioria dos métodos de preenchimento transmitem o comprimento do preenchimento por meio do valor do último byte do texto criptografado descriptografado, mas não ainda não preenchido. No entanto, é possível permitir o preenchimento vazio se o comprimento do texto simples for transmitido separadamente ou se o texto simples tiver propriedades conhecidas, como terminar com um determinado byte. (Não é uma boa ideia, mas estamos falando sobre analisar um sistema mal projetado aqui.)
Distinguir modos de transmissão
(Notações: $E$ é a função de criptografia de bloco, $||$ é a concatenação de string, $\oplus$ é xor bit a bit, $+$ é a adição nos valores do contador, $\mathbf{0}$ é um bloco zero de todos os bits, $\mathbf{1}$ é um bloco onde todos os bits são zero, exceto que o último bit é 1.)
Como você pode enviar o mesmo IV para criptografia várias vezes, é possível distinguir entre os modos de fluxo. Vejamos como um texto simples de dois blocos$P_1 || P_2$ é criptografado em um texto cifrado de dois blocos $C_1 || C_2$:
- OFB: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(E(\mathrm{IV})) \oplus P_2$
- CFB: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(E(\mathrm{IV}) \oplus P_1) \oplus P_2$
- CTR: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(\mathrm{IV}+1) \oplus P_2$
Vamos usar isso para construir uma maneira de distinguir esses três modos.
- Criptografe um texto simples de um bloco só com bits zero com um IV todo com bits zero. Não importa qual desses três modos a caixa preta implementa, a saída é$E(\mathbf{0})$.
- Criptografe um texto simples de um bloco só com bits zero com o IV $E(\mathbf{0})$. A saída é$E(E(\mathbf{0}))$.
- Criptografe um texto simples de um bloco só com bits zero com o IV $\mathbf{1}$(todos os bits zero, exceto que o último bit é 1). A saída é$E(\mathbf{1})$.
- Criptografe um texto simples de um bloco só com bits zero com o IV $E(\mathbf{0}) \oplus \mathbf{1}$. A saída é$E(E(\mathbf{0}) \oplus \mathbf{1})$.
- Agora criptografe um texto simples de dois blocos: $\mathrm{IV} = \mathbf{0}$, $P_1 = \mathbf{1}$, $P_2 = \mathbf{0}$. Observe o segundo bloco do texto cifrado.
- OFB: $C_2 = E(E(\mathbf{0}))$ (calculado na etapa 2).
- CFB: $C_2 = E(E(\mathbf{0}) \oplus \mathbf{1})$ (calculado na etapa 4).
- CTR: $E(\mathrm{0} + 1)$. Isso geralmente é$E(\mathrm{1})$ (calculado na etapa 3), mas pode ser diferente se a implementação de CTR fizer o incremento do contador de maneira diferente.
Como posso identificar o modo de criptografia?
Você não pode identificar totalmente este modo sem enviar $2^{64}$ish bytes de dados sob a mesma chave, pois somente então os modos de streaming (CFB, OFB, CTR) começam a falhar na segurança de maneiras diferentes.
No entanto, você pode ter certeza de que se vir um texto cifrado que não seja um múltiplo do comprimento do bloco (16 bytes para AES), então você tem um CFB, OFB ou CTR (ou um modo de streaming semelhante ou um construído em cima de qualquer deles).
Agora, se você sempre obtém saídas que são um múltiplo do comprimento do bloco, então é provável que seja o modo CBC ou ECB. Você pode distinguir esses dois com base na vulnerabilidade clássica do ECB que o CBC não possui: Blocos iguais de entradas são processados em blocos iguais de saídas. Na prática, isso significa que você poderia simplesmente enviar 32 bytes totalmente 0 e se receber algo de volta que mostre duas sequências de 16 bytes que são iguais, você terá o ECB, caso contrário, o CBC. Alternativamente, se você especificar IVs diferentes para o mesmo texto simples e ainda obter o mesmo texto cifrado de volta, você também saberá que o ECB é usado (embora os IVs CBC realmente devam ser escolhidos ao acaso e não pelo adversário ...).