ECB CBC WTF

문제

여기서는 CBC에서 암호화할 수 있지만 ECB에서만 암호를 해독할 수 있습니다.
그건 취약점이 될 수 없어요 왜냐면 그들은 모드가 다르니까요... 그렇죠?

https://aes.cryptohack.org/ecbcbcwtf/

 

풀이

더보기
from Crypto.Cipher import AES


KEY = ?
FLAG = ?


@chal.route('/ecbcbcwtf/decrypt/<ciphertext>/')
def decrypt(ciphertext):
    ciphertext = bytes.fromhex(ciphertext)

    cipher = AES.new(KEY, AES.MODE_ECB)
    try:
        decrypted = cipher.decrypt(ciphertext)
    except ValueError as e:
        return {"error": str(e)}

    return {"plaintext": decrypted.hex()}


@chal.route('/ecbcbcwtf/encrypt_flag/')
def encrypt_flag():
    iv = os.urandom(16)

    cipher = AES.new(KEY, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(FLAG.encode())
    ciphertext = iv.hex() + encrypted.hex()

    return {"ciphertext": ciphertext}

 

먼저 encrypt_flag를 보면 iv를 random으로 16바이트로 설정하여

암호문을 CBC모드로 iv를 이용하여 생성한다.

 

그리고 decrypt를 보면

복호화를 수행할 땐 ECB모드로 수행하게 된다.

 

CBC암호화 과정
CBC 복호화 과정

 

먼저 CBC모드는 각 평문 블록은 이전 블록 암호문와 XOR 연산 후 암호화하는 블록 암호 모드이고,

암호화와 복호화를 보게 되면, 암호화를 역으로 하는게 복호화이다.

 

그리고 ECB모드의 복호화 암호화 블록을 복호화한 것이 그대로 평문 블록이 된다.

이때 xor하는 과정을 생략 한다.

즉, CBC의 암호 해독은 EBC에 XOR하는 과정이 추가 된 것이기에 

CBC에서 얻은 암호문 블럭과, 복호화된 평문 블록을 XOR시키면 된다.

  

from pwn import *

ciphertext='cce45e92158819ddd696d31d47830a129f76621e76b1b722a1e6b8fc8b3c852823c46c6ee3b4008ae5b099b1568540a7'
plaintext='da2a240b7ccdd12f859d9a512df4043caf9627e261e762eeb5f48c2832e06127c042142e47d5e81396b999ddaa1da455'

ciphertext=bytes.fromhex(ciphertext)
plaintext=bytes.fromhex(plaintext)

result=b''


for i in range(0, len(ciphertext), 16):
    result += xor(ciphertext[i : i + 16],  plaintext[i + 16: i + 32])
print(result)

그래서 앞서 코드에서 iv 길이가 16바이트이고, 암호문에선 iv값+암호문 이었기에

한블럭당 16바이트로 잡고 제시된 암호문과 평문을 xor연산을 하였다.

 

플래그 값은 crypto{3cb_5uck5_4v01d_17_!!!!!}이다.

 

 

 

 

복사했습니다!