[python] AES 암호화

2019. 12. 2. 14:12카테고리 없음

AES는 대표적인 대칭키 알고리즘이다.

대칭키(Symmetric) 알고리즘이란, 암호화에 사용하는 키복호화에 사용하는 키

같은 경우를 말한다.

 

현재 실무에서 가장 많이 쓰이는 것이 AES이다.

 

파이썬을 사용하여 파일을 AES 알고리즘으로 암호화/복호화 수행하는

코드를 짜보자.

 

먼저 암호화에 사용할 키는 어렵고 복잡하게 설정하는 것이 좋다.

하지만 키가 어렵다면 사람은 그것을 기억할 때 한계가 있으므로 이를 극복하기 위해 

Hash를 사용하였다.

즉, 사람은 짧은 수준의 복잡도로 패스워드를 설정하더라도, 그것을 내부적으로 hash처리를 

수행하여, 적당히 길고 복잡한 값으로 변경하는 것이다.

여기에서는 편의를 위해 운영체제의 시간정보인 타임스탬프 값(time.time())을

 

복호화를 수행하는 decrypt_file() 함수에서는, 암호화에 사용하였던 것과 같은 Key를

통해서만 정상적으로 복호화가 수행된다.

 


AES란 표준 대칭키 알고리즘 중 하나이다. 암호문을 생성(암호화)할 때 사용하는 키와 암호문으로부터

평문으로 복원(decryption)할 때 사용하는 키가 동일한 암호 시스템이다.

 

대칭키의 대표적인 알고리즘은 DES(Data Encryption Standard)였다. 하지만 DES는 54bit의 키를 사용하여 현재 컴퓨팅 기술에 보안에 취약하였다. 이에 미국의 표준기술연구소(NIST)는 1998년 DES를 대체할 최고 보안 규격의 알고리즘을 공모하였고 2001년 Rijndael(Submitted by Joan Daeman and Vincent Rijman)이 선정되어 AES알고리즘이 탄생하게 된다.

 

DES가 안전하지 않은 이유는 56bit의 짧은 key size 때무니다. 1999년 초 DES challenge에서 brute force attack으로 

해독 되는데 22시간 밖에 걸리지 않았다.

 

AES의 주요 강점은 DES보다 훨씬 긴 key 사이즈를 가진다는 것인데 AES는 128bit, 192bit, 256bit의

키를 가질 수 있고 이것은 DES의 56bit key 보다 기하급수적으로 더 강력하다.

 

또한, AES는 DES보다 암호화 속도가 빠르므로 SSL/TSL과 같은 프로토콜과 방화벽이나 라우터에도 사용되고 있다.

 


대칭키 암호 시스템은 알고리즘이 상대적으로 단순한 장점이 있지만 키 관리에 어려움이 많다.

따라서 RAS와 같은 암호화 방식도 많이 쓴다.


1. 모듈 로드

 

콘솔에서 아래 명령을 통해 라이브러리를 설치한다.

더보기

pip install pycryptodome

 

import base64

from Crypto import Random

from Crypto.Cipher import AES

2. 블럭사이즈에 대한 패딩로직

문자열을 encrypt 인자로 전달시 입력 받은 데이터의 길이가

BLOCK_SIZE의 배수가 아닐 때 패딩이 필요하다.

AES에서는 BLOCK_SIZE가 128bit 즉 16byte로 고정되는데,

아래 코드를 통해 자동 패딩처리한다. 한글에 대한 처리를 위해 pad시에 len(s.encode('utf-8'))

처리가 반드시 필요하다.

영문과 기호는 문자당 1바이트지만 한글은 문자당 2바이트이기 때문이다

.len() 함수를 활용해 길이를 통해 바이트 계산을 하는 방식이므로

'urf-8' 변환하지 않을 경우 오류가 발생하게 된다.

 

더보기

BS=16 #blocksize

pad=lambda s: s+(BS-len(s.encode('utf-8'))BS)*chr(BS-len(s.encode('utf-8'))%BS) #16으로 패딩

unpad = lambda s : s[:-ord(s[len(s)-1:])]

3. 암호화알고리즘 클래스 생성

더보기

class AESCipher:

    def __init__( self, key ):

        self.key = key

    def encrypt( self, raw ):

        raw = pad(raw)

        iv = Random.new().read( AES.block_size )

        cipher = AES.new( self.key, AES.MODE_CBC, iv )

        return base64.b64encode( iv + cipher.encrypt( raw.encode('utf-8') ) )

    def decrypt( self, enc ):

        enc = base64.b64decode(enc)

        iv = enc[:16] cipher = AES.new(self.key, AES.MODE_CBC, iv )

        return unpad(cipher.decrypt( enc[16:] ))

 

글 출처

https://mkjjo.github.io/python/2019/08/04/crypto.html

 

[Python] 파이썬 모듈을 활용한 암호화/복호화

* 본 포스트는 개인연구/학습 기록 용도로 작성되고 있습니다. [Python] 파이썬 모듈을 활용한 암호화/복호화 업무를 하다보면 민감한 문서를 다뤄야할 때가 있다. 이럴때 암호화/복호화 기술을 활용하면 용이하다. 파이썬 모듈을 활용해 쉽게 적용할 수 있다. 우선 암호화 기술에 대해 알아보자. 암호블록체인(Cipher-block chainingm CBC) 방식은 1976년 IBM에 의해 개발되었다. 각 블록은 암호화되기 전에 이전 블록의 암호화 결과와 X

mkjjo.github.io

 

 

[Python] 파이썬 모듈을 활용한 암호화/복호화

* 본 포스트는 개인연구/학습 기록 용도로 작성되고 있습니다. [Python] 파이썬 모듈을 활용한 암호화/복호화 업무를 하다보면 민감한 문서를 다뤄야할 때가 있다. 이럴때 암호화/복호화 기술을 활용하면 용이하다. 파이썬 모듈을 활용해 쉽게 적용할 수 있다. 우선 암호화 기술에 대해 알아보자. 암호블록체인(Cipher-block chainingm CBC) 방식은 1976년 IBM에 의해 개발되었다. 각 블록은 암호화되기 전에 이전 블록의 암호화 결과와 X

mkjjo.github.io