AES 모드 식별
Plaintext와 IV를 입력 매개 변수로 받아들이고 암호문을 반환하는 API가 있다고 가정 해 보겠습니다. API가 AES 128 암호화를 사용하고 있다는 것을 알고 있지만 이제 사용중인 암호화 모드 (ECB, CBC, OFB, CFB 또는 CTR)를 식별해야합니다. 암호화 모드를 어떻게 식별 할 수 있습니까? 모든 제안, 힌트 또는 안내를 주시면 감사하겠습니다.
예:
curl "http://dev/api/v1.0/test?iv=00112233445566778899&text=01234567"
응답: 7fcb5212d14de7ddcc334ec31acec6ae
답변
데이터를 암호화하는 블랙 박스가 있고이 블랙 박스가 블록 암호를 통해 (인증되지 않은) 암호화의 인기 모드 (ECB, CBC, CTR, OFB 또는 CFB)를 구현한다는 가정하에 작업하고 있습니다. 암호화 할 입력 일반 텍스트와 선택한 IV를 제출할 수 있습니다.
첫째, 스트림 모드와 비 스트림 모드를 쉽게 구분할 수 있습니다.
- CTR, OFB 및 CFB는 스트림 암호 모드입니다. 암호문은 항상 일반 텍스트와 길이가 같습니다.
- ECB 및 CBC는 전체 블록 만 암호화 할 수 있습니다. 암호문의 길이는 항상 블록 길이의 배수입니다 (AES, Camellia, ARIA, SM4의 경우 16 바이트).
- CBC 또는 XEX와 같은 모드 위에있는 CTS 와 같이 암호문이 일반 텍스트와 길이가 같은 비 스트림 모드가 있습니다 . 그러나 나는이 분석에서 그것들을 고려하지 않을 것입니다.
따라서 1 바이트를 암호화하십시오. 1 바이트의 암호문을 받으면 스트리밍 모드입니다. 16 바이트를 얻으면 패딩이있는 전체 블록 모드입니다. 오류가 발생했지만 16 바이트 암호화가 작동하면 패딩이없는 전체 블록 모드입니다.
패딩 및 블록 모드
ECB는 실제로 IV를 사용하지 않습니다. 따라서 IV에 관계없이 동일한 출력을 얻으면 ECB이고 그렇지 않으면 그렇지 않을 것입니다. 그러나 이상하게 설계된 시스템 인 경우 IV는 비표준 방식으로 사용될 수 있습니다. 예를 들어 "준 ECB"는 IV + 일반 텍스트에서 ECB를 사용할 수 있습니다.
두 개의 동일한 블록을 암호화합니다. 처음 두 개의 암호문 블록이 동일하면 ECB입니다. 그렇지 않으면 제한적으로 CBC입니다. (패딩 방법에 따라 세 번째 블록이있을 수도 있고 없을 수도 있습니다.)
CBC (또는 ECB) 패딩은 일반적으로 암호문의 크기를 1 ~ 16 바이트 증가시킵니다. 패딩이 항상 1 바이트 이상인 이유는 복호화를 명확하게하기위한 것입니다. 비어있는 패딩의 경우가 있었다면 복호화되었지만 아직 패딩되지 않은 암호문을 보면 알 수 없습니다. 대부분의 패딩 방법은 복호화되었지만 아직 패딩되지 않은 암호문의 마지막 바이트 값을 통해 패딩 길이를 전달합니다. 그러나 일반 텍스트의 길이가 별도로 전송되거나 일반 텍스트에 특정 바이트로 끝나는 것과 같은 알려진 속성이있는 경우 빈 패딩을 허용 할 수 있습니다. (좋은 생각은 아니지만 여기서는 잘못 설계된 시스템을 분석하는 것에 대해 이야기하고 있습니다.)
구별되는 스트림 모드
(표기 : $E$ 블록 암호화 기능입니다. $||$ 문자열 연결, $\oplus$ 비트 xor, $+$ 카운터 값에 대한 추가입니다. $\mathbf{0}$ 모든 비트 제로 블록입니다. $\mathbf{1}$ 마지막 비트가 1 인 것을 제외하고 모든 비트가 0 인 블록입니다.)
암호화를 위해 동일한 IV를 여러 번 제출할 수 있으므로 스트림 모드를 구분할 수 있습니다. 2 블록 일반 텍스트가 어떻게$P_1 || P_2$ 2 블록 암호문으로 암호화됩니다. $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$
이것을 사용하여이 세 가지 모드를 구별하는 방법을 구성 해 봅시다.
- all-bits-zero IV를 사용하여 1 블록 all-bits-zero 일반 텍스트를 암호화합니다. 블랙 박스가 구현하는이 세 가지 모드에 관계없이 출력은$E(\mathbf{0})$.
- IV를 사용하여 1 블록 all-bits-zero 일반 텍스트 암호화 $E(\mathbf{0})$. 출력은$E(E(\mathbf{0}))$.
- IV를 사용하여 1 블록 all-bits-zero 일반 텍스트 암호화 $\mathbf{1}$(마지막 비트가 1 인 것을 제외하고 모든 비트는 0). 출력은$E(\mathbf{1})$.
- IV를 사용하여 1 블록 all-bits-zero 일반 텍스트 암호화 $E(\mathbf{0}) \oplus \mathbf{1}$. 출력은$E(E(\mathbf{0}) \oplus \mathbf{1})$.
- 이제 2 블록 일반 텍스트를 암호화합니다. $\mathrm{IV} = \mathbf{0}$, $P_1 = \mathbf{1}$, $P_2 = \mathbf{0}$. 암호문의 두 번째 블록을보십시오.
- OFB : $C_2 = E(E(\mathbf{0}))$ (2 단계에서 계산 됨).
- CFB : $C_2 = E(E(\mathbf{0}) \oplus \mathbf{1})$ (4 단계에서 계산 됨).
- CTR : $E(\mathrm{0} + 1)$. 이것은 일반적으로$E(\mathrm{1})$ (3 단계에서 계산 됨) CTR 구현이 카운터 증가를 다르게 수행하는 경우 다를 수 있습니다.
암호화 모드를 어떻게 식별 할 수 있습니까?
보내지 않고는이 모드를 완전히 식별 할 수 없습니다. $2^{64}$스트리밍 모드 (CFB, OFB, CTR)가 보안에서 서로 다른 방식으로 분해되기 시작하기 때문에 동일한 키에있는 데이터의 ish 바이트입니다.
그러나 블록 길이 (AES의 경우 16 바이트)의 배수 가 아닌 암호문이 표시되는 경우 CFB, OFB 또는 CTR (또는 유사한 모드 스트리밍 모드 또는 그 위에 구축 된 것) 중 하나 가 있음을 확신 할 수 있습니다. 그들의).
이제 항상 블록 길이의 배수 인 출력을 얻는다면 CBC 또는 ECB 모드 일 가능성이 높습니다. CBC에없는 고전적인 ECB 취약점을 기반으로이 두 가지를 구분할 수 있습니다. 동일한 입력 블록이 동일한 출력 블록으로 처리됩니다. 실제로 이것은 단순히 32 개의 all-0 바이트를 보낼 수 있다는 것을 의미하며 동일한 두 개의 16 바이트 시퀀스를 보여주는 무언가를 되 찾으면 ECB가 있고 그렇지 않으면 CBC가 있습니다. 또는 동일한 일반 텍스트에 대해 다른 IV를 지정하고 여전히 동일한 암호문을 다시 가져 오는 경우 ECB가 사용 된다는 사실도 알고 있습니다 (하지만 CBC IV는 실제로 공격자가 아닌 무작위로 선택해야합니다 ...).