
💡 이전 문제 세트는 AES가 데이터 블록에서 키 순열을 수행하는 방법을 보여주었습니다. 실제로는 단일 블록보다 훨씬 긴 메시지를 암호화해야 합니다.
작동 모드는 더 긴 메시지에서 AES와 같은 암호를 사용하는 방법을 설명합니다.
모든 모드는 잘못 사용하면 심각한 약점이 있습니다. 이 범주의 챌린지는 API와 상호 작용하고 이러한 약점을 악용할 수 있는 웹 사이트의 다른 섹션으로 이동합니다. 인터페이스에 익숙해지고 이를 사용하여 다음 플래그를 가져가세요!
이전 단계에서는 AES의 과정에 대해 전반적으로 살펴봤고, 이제는 작동모드와 관련한 문제인 것 같다.
문제를 푸는 특정 사이트를 제공해주고 있다.

들어왔더니 위와 같은 tool들이 제공되어 있다. 아무래도 웹과 직접 통신하기 위해 크립토핵 사이트에서 만들어준 것 같다. SOURCE 부분의 코드를 보고 어떤 것을 입력해야 하는지 생각해보자.
from Crypto.Cipher import AES
KEY = ?
FLAG = ?
@chal.route('/block_cipher_starter/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('/block_cipher_starter/encrypt_flag/')
def encrypt_flag():
cipher = AES.new(KEY, AES.MODE_ECB)
encrypted = cipher.encrypt(FLAG.encode())
return {"ciphertext": encrypted.hex()}
먼저 decrypt에는 암호문을 hex로 입력하면 AES 복호화를 거쳐서 hex 값으로 반환해주는 것 같다.
encrypt_flag에서는 flag를 AES 암호화하여 hex 값으로 보여주나보다.

ENCRYPT_FLAG()를 눌렀더니 암호문을 hex로 보여준다.

아래에 있는 hex encoder/decoder에 돌려봤더니 [unprintable]이 나온다. hex를 byte로 바꾸지 못하면 저게 나온다고 한다. 아마 암호문이어서 byte로 바꾸지 못한 것 같다.
내가 받은 것은 암호화된 것이기에 이를 decrypt에 넣어보자.

암호문을 복호화해서 평문으로 보여주고 있다!

hex tool에 돌렸더니 flag가 나왔다! 이번 문제는 tool 쓰는 방법을 알려주기 위한 만든 것 같다.

🚩 crypto{bl0ck_c1ph3r5_4r3_f457_!}