
생일 역설에 기반한 암호화 공격의 간소화된 버전: Sweet32 (CVE-2016-2183)
이것은 Sweet32 공격(CVE-2016-2183)의 데모입니다: https://sweet32.info/
이 공격은 CBC 모드에서 3DES 및 Blowfish와 같이 작은 블록 크기(64비트)를 사용하는 암호화 알고리즘을 악용하는 생일 공격(birthday attack)의 예입니다. 이 공격은 알려진 평문을 포함한 많은 암호화 블록을 생성해야 합니다. 생성 후, 동일한 암호화 블록을 식별하고, 이들을 사용하여 알 수 없는 평문을 가진 블록의 평문 값을 식별할 수 있습니다.
이 구현은 암호화 알고리즘으로 **3DES(Triple DES)**를 사용하며, 64비트(8바이트) 블록 크기를 가집니다. 이는 실제 환경의 3DES가 Sweet32 공격에 취약한 바로 그 블록 크기입니다.
두 개의 암호문 블록이 충돌할 때 (c_i = c_j), 다음을 사용하여 알 수 없는 평문을 복구할 수 있습니다:
p_i = p_j ⊕ c_{i-1} ⊕ c_{j-1}
여기서:
p_i는 알 수 없는 평문입니다 (예: 비밀 쿠키)p_j는 알려진 평문입니다 (예: HTTP 헤더)c_{i-1} 및 c_{j-1}는 이전 암호문 블록입니다이것은 CBC 모드에서 충돌이 블록 암호의 입력값이 동일하다는 것을 의미하므로, 암호화 키를 알지 못해도 XOR 복구가 가능하기 때문에 작동합니다.
보장된 충돌을 이용해 데모를 실행합니다:
# Step 1: Generate encrypted packet with secret cookie
python generate_rigged_packets.py rigged_demo.bin
# Step 2: Execute the attack to recover the cookie
python sweet32.py --block-size 8 rigged_demo.bin
공격은 SECRET COOKIE 값을 표시한 다음, 암호문만을 사용하여 이를 복구합니다!
generate_rigged_packets.py시연 목적으로 보장된 충돌을 가진 패킷을 생성합니다. 쿠키 값은 알려진 평문 블록과 충돌하도록 제작됩니다.
sweet32.py쿠키를 복구하기 위해 Sweet32 생일 공격을 실행합니다.
Sweet32 공격은 생일 역설을 악용합니다. 64비트 블록 암호의 경우:
이로 인해 3DES(및 기타 64비트 블록 암호)는 장기간 유지되는 HTTPS 세션에서 취약해집니다.
실제 3DES(64비트 블록)에 대한 Sweet32 공격의 경우:
| 블록 크기 | 블록 크기 | 패킷 수 | 필요한 데이터 | 블록 수 |
|---|---|---|---|---|
| 8바이트 | 64비트 | ~785GB | ~785GB | ~2^32 블록 |
실제 공격은 동일한 키로 암호화된 ~785GB의 데이터가 필요하므로, 주로 장기간 유지되는 HTTPS 연결에 영향을 미칩니다.