[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 라이센스를 따릅니다.