https://cryptohack.org/courses/symmetric/aes2/
너무 길어서 링크로 대체한다.
개념 설명
AES의 구조.
키 없이 되돌릴 수 없는 키 순열을 만들어내기 위해, AES는 입력에 많은 수의 애드혹(ad-hoc)혼합 작업을 적용한다. 이는 우아한 개별 수학적 문제를 기반으로 하는 RSA와 같은 공개 키 암호 시스템과 극명한 대조를 이룬다. AES는 훨씬 덜 우아하지만 매우 빠르다.
높은 수준에서 AES-128은 "키 스케줄(key schedule)"로 시작하여 한 상태(state)에 10라운드를 실행한다.(라운드 수는 128 192 256에 따라 10, 12, 14로 구성됨) 시작 상태 배열(state)은 4x4바이트 행렬로 표현되는 우리가 암호화하고자 하는 평문 블록이다.
10라운드 동안, 여러 번의 반전 변환에 의해 상태 배열(state)가 반복적으로 수정된다.
! 각 변환 단계는 1940년대에 클로드 섀년에 의해 확립된 보안 암호의 이론적 특성(혼돈, 확산)에 기초하여 정의된 목적을 가진다. 다음 과제에서 이들 각각을 자세히 살펴볼 것이다.
다음은 AES 암호화 단계에 대한 개요이다. :
1. 키 확장 또는 키 스케줄(KeyExpantion or Key Schedule)
128비트 키에서 11개의 개별 "라운드 키(round key)"가 파생된다.
2. 초기 키 추가(initial key addition)
AddRoundKey - 첫 번째 라운드 키의 바이트는 상태 배열(state)과 XOR 되어있다..?
3. 라운드 (Round)
a) SubBytes - 상태 배열(state)의 각 바이트는 조회 테이블(S-Box)에 따라 다른 바이트로 대체된다.
b) ShiftRows - 상태 행렬의 마지막 세 행이 전치된다. - 1, 2, 3개 열에 걸쳐 이동한다.
c) MixColumns - 각 열의 네 바이트를 결합하여 상태 배열의 열에 대해 행렬 곱셈이 수행된다. 이것은 마지막 라운드에서 건너뛴다.
d) AddRoundKey - 현재 라운드 키는 상태 배열과 xor 된다.
초기 평문 블록을 상태 행렬로 변환하기 위해 byte2matrix 함수가 포함되어 있다. matrix2bytes 함수를 작성하여, 해당 행렬을 바이트로 되돌리고 결과 평문을 플래그로 제출하라.
풀이
AES의 원리는 아직 다 이해하지는 못했으나 문제는 풀 수 있다.
def bytes2matrix(text):
""" Converts a 16-byte array into a 4x4 matrix. """
return [list(text[i:i+4]) for i in range(0, len(text), 4)]
def matrix2bytes(matrix):
""" Converts a 4x4 matrix into a 16-byte array. """
res = b''
for i in range(0, 4):
for j in range(0, 4):
res += chr(matrix[i][j]);
return res;
matrix = [
[99, 114, 121, 112],
[116, 111, 123, 105],
[110, 109, 97, 116],
[114, 105, 120, 125],
]
print(matrix2bytes(matrix))
처음에는 matrix2byte가 비어서 주어지는데 그냥 이차원 리스트를 하나하나 돌면서 문자로 바꾸어서 더해주고 마지막에 반환하였다.
crypto{inmatrix}