AES는 대표적인 대칭키 블록암호 알고리즘입니다.

먼저, 대칭키(Symmetric) 암호라함은, 암호화에 사용하는 키와 복호화에 사용하는 키가 같은 경우를 말합니다.

위의 그림과 같은 구조를 대칭키 구조라고 합니다.


역사적으로 DES(Data Encryption Standard)라는 알고리즘이 1970년대에 개발되어 사용되고 있었습니다. 하지만 보안 취약점이 발견되었고, 3-DES라는 방법을 사용해서 막아보려고 했으나.. 결국에는 새로운 블록암호 알고리즘을 고안하는 쪽으로 귀결됩니다. Serpent, Baseking, BATON, .. 등등 많은 블록암호 알고리즘이 있고, 한국에서도 SEED, ARIA, HIGHT 등을 개발하였습니다. 


현재 실무에서 가장 많이 쓰이는 것은 아무래도 AES(Rijndael)일 것입니다. AES는 미국NIST가 1997년에 제안한 일종의 공모전으로, 3-DES보다 강력하고 효율적인 알고리즘을 공모한 것입니다. 몇 차례의 토너먼트 끝에 결국 Rijndael이 최종 Finalist로 선정되었으며 그때 이후로 AES(Advanced Encryption Standard)라고 불리우게 되었습니다.


AES 알고리즘에 대한 자세한 설명은 추후에 다루도록 하고, 본 포스팅에서는 파이썬을 사용하여 파일을 AES 알고리즘으로 암호화 / 복호화 수행하는 코드를 소개합니다.


먼저 암호화에 사용할 키는 어렵고 복잡하게 설정하는 것이 좋습니다. 하지만 키가 어렵다면 사람은 그것을 기억할 때 한계가 있습니다. 여기에서는 이를 극복하기위해 Hash를 사용하였습니다. 즉, 사람은 짧은 수준의 복잡도로 패스워드를 설정하더라도, 그것을 내부적으로 hash 처리를 수행하여서, 적당히 길고 복잡한 값으로 변경하는 것입니다. 여기에서는 편의를 위해 운영체제의 시간정보인 타임스탬프 값(time.time())을 가져와서, SHA-256 해시를 사용하는 것을 예제로 설정하였습니다.


이 프로그램의 encrypt_file() 함수에서는, 암호화에 사용할 key와 암호화하려는 파일이름을 입력값으로 사용합니다. 이때 iv라는 초기화벡터가 필요하며, 고정된 값으로 할당해 주었습니다. iv 값은 복호화를 수행할 때 반드시 필요하므로, 보유하고 있어야 합니다. 프로그래머가 정의하기에 따라 다르겠지만, 여기에서는 파일의 맨 앞부분에 iv를 삽입하는 방식을 취하였습니다. 


AES알고리즘에 몇가지의 모드(ECB, CBC, CFB, OFB, CTR 등)가 존재합니다. 여기에서는 MODE_CBC를 선택하였습니다. 이렇게 암호화된 파일은 output이라는 파일로 저장됩니다.


이제 복호화를 수행하는 decrypt_file() 함수에서는, 암호화에 사용하였던 것과 같은 key를 통해서만 정상적으로 복호화가 수행됩니다. input으로 사용하는 파일은 위에서 암호화의 결과물인 output 파일을 대상으로 하겠습니다. 먼저 파일의 가장 첫부분(일명 헤더)에서 iv를 가져옵니다. 이 사항은 미리 약속에 의한것이며, 프로그래머의 재량에 따라(맨뒤나 특정 위치 등) 변경할 수 있습니다. 이후 MODE_CBC에 대한 복호화 과정을 수행합니다. 복호화 결과물은 decrypt 라는 파일로 지정하겠습니다.


최종적으로 결과가 정상적으로 수행되었는지를 확인할 필요가 있습니다. 여기에서는 파일의 시그니쳐(Magic number)가 원본의 것과 같은지를 비교하는 방법을 사용했습니다. 그외에 원본파일의 해시값을 보관하였다가 무결성을 확인하는 것도 좋은 방법이 될 것입니다.


코드 참고 :
http://eli.thegreenplace.net/2010/06/25/aes-encryption-of-files-in-python-with-pycrypto

CPUU님의 창작활동을 응원하고 싶으세요?