개념 설명
Round Keys(라운드 키)
지금은 KeyExpansion(키 확장)단계에 대한 자세한 내용은 건너뛰겠다. 요점은 16byte 키를 가져와서 초기 키에서 파생된 "라운드 키"라고 하는 11개의 4x4행렬을 생성하는 것이다. 이러한 "라운드 키 round key"를 통해 AES는 우리가 제공한 단일 키에서 추가 마일리지를 얻을 수 있다. (추가적인 이점이 있다는 듯)
다음 단계인 초기 키 추가 단계(initial key addition)에는 단일(하나의) AddRoundKey단계가 있다. AddRoundKey단계는 간단하다. 현재 상태 배열(state)과 라운드 키를 XOR한다.
AddRoundKey는 각 라운드의 마지막 부분에서도 발생한다. AddRoundKey는 단순한 순열이라기보다는 "키 순열(Keyed Permutation)"으로 만드는 것이다. AES에서 키가 상태 배열에 혼합되는 유일한 부분이지만 발생하는 순열을 결정하는데 중요하다.
이전 문제에서 본 것처럼, XOR은 키를 알고 있으면 쉽게 복호화 할 수 있는 작업이지만, 모르고 있으면 복호화하기 어렵다.
이제 일련의 치환, 전치암호와 함께 11개의 서로 다른 키로 XOR된 평문을 복구하려고 한다고 상상해보자. 그것이 AES가 하는 일이다.
그리고 우리는 다음 몇 문제에서 뒤섞임(jumbling)이 얼마나 효과적인지 보게 될 것이다.
add_round_key 함수를 완료한 다음, matrix2bytes함수를 사용하여 다음 플래그를 획득하라.
문제 풀이
state = [
[206, 243, 61, 34],
[171, 11, 93, 31],
[16, 200, 91, 108],
[150, 3, 194, 51],
]
round_key = [
[173, 129, 68, 82],
[223, 100, 38, 109],
[32, 189, 53, 8],
[253, 48, 187, 78],
]
def add_round_key(s, k):
for i in range(4):
for j in range (4):
s[i][j] ^= k[i][j]
return s;
def matrix2bytes(matrix):
res = ''
for i in range(4):
for j in range(4):
res += chr(matrix[i][j])
return res
print(matrix2bytes(add_round_key(state, round_key)))
상태 배열과 round key를 xor하고 해당 행렬을 문자열로 변환한다.