포스트

[2025 Hacksium Busan 예선] nonsense

[2025 Hacksium Busan 예선] nonsense

카테고리

Crypto

문제 분석 및 풀이

AES CTR 모드를 사용해 메시지를 암호화하는데, 두 번의 암호화 과정에 동일한 key와 nonce를 사용하여 암호화한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
key = get_random_bytes(16)
nonce = get_random_bytes(8)
secret_message = gen_random_string(16).encode()

ctr1 = Counter.new(64, prefix=nonce)
cipher1 = AES.new(key, AES.MODE_CTR, counter=ctr1)
encrypted_message = cipher1.encrypt(secret_message)

print(f"encrypted msg: {base64.b64encode(encrypted_message).decode()}")

user_input = input("Enter Plane Text: ")
ctr2 = Counter.new(64, prefix=nonce)
cipher2 = AES.new(key, AES.MODE_CTR, counter=ctr2)
user_encrypted_message = cipher2.encrypt(user_input.encode())

print(f"encrypted msg: {base64.b64encode(user_encrypted_message).decode()}")

AES CTR 모드에서는 평문 P가 키 K와 논스 N으로 생성된 키 스트림 S와 XOR되어 암호문 C를 생성한다. 여기서

1
2
3
4
5
encrypted_message = cipher1.encrypt(secret_message)
encrypted_message = secret_message ^ S

user_encrypted_message = cipher2.encrypt(user_input)
user_encrypted_message = user_input ^ S 

이다. 이 두 암호문을 XOR 하면,

1
2
3
4
5
6
  encrypted_message ^ user_encrypted_message
= (secret_message ^ S) ^ (user_input ^ S)
= secret_message ^ user_input^ S ^ S 
= secret_message ^ user_input ^ (S ^ S) 
= secret_message ^ user_input ^ 0 
= secret_message ^ user_input

이 된다.
우리는 encrypted_message와 user_encrypted_message를 모두 전달받으므로, secret_message를 알아낼 수 있다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

"2025 Hacksium Busan" 카테고리의 게시물