파이썬 DES 암호화 알고리즘

DES(Data Encryption Standard) 암호화

DES알고리즘은 대칭형 암호이다 이는 암호화와 복호화 시 해독키가 동일함을 의미하며 외부로 노출될 경우 데이터가 유출될 수 있는 우려가 있다 때문에 외부에 유출되지 않도록 비밀키(Secret Key)를 잘 보관해야 합니다

1970년대에 IBM에 의해 개발되었으며 꽤 오랜 역사가있다 현재는 하드웨어의 발전으로 인해 키 길이가 짧기 때문에 무차별 대입공격이 가능합니다 현대에는 보안상 AES알고리즘을 권장하며 DES는 교육목적으로 사용합니다

 

 

필요 준비물

기본적으로 파이썬이 설치되어있어야 합니다

 

추가적으로 DES암호화를 위해서 PyCryptodome 패키지를 사용합니다

pycypto모듈을 보완하여 기존문법도 사용가능한 

PyCryptodome Python 패키지는 Python 2.7, Python 3.5이상 및 PyPy를 지원합니다

 

터미널에 다음 명령어를 입력하여 crypto 모듈을 설치합니다

명령어 입력 후 Successfully installed pycryptodome-3.16.0 라는 문구가 터미널에 출력되면 정상적으로 설치가 된 겁니다

다시 동일한 설치 명령을 입력하여 Requriement already satisfied라는 문구를 통해서도 설치가 확인되었는지 확인가능합니다

 

pycryptodome에 예제코드를 참고하여 실습을 진행해 보겠습니다

 

 

코드작성

1
from Crypto.Cipher import DES
cs

Crypto 모듈에서 사용할 DES를 import 하여 불러와줍니다

 

 

1
from secrets import token_bytes
cs

이외의 키 생성을 위하여 위의 코드로  secrets모듈을 불러와줍니다 키 생성 시 token_bytes함수를 사용하기 때문에 token_bytes만 불러와줍니다

secrets모듈은 비밀 데이터를 관리하는데 적합한 암호학적으로 강력한 난수를 생성하는 데 사용됩니다

데이터를 관리하거나 암호를 목적으로 사용한다면 모델링이나 시뮬레이션을 위해 설계된 random모듈이 아닌 암호학적 강력한 난수를 생성하는 secrets모듈 사용을 권장합니다 

 

 

1
key = token_bytes(8)
cs

우선 키를 생성해줍니다 DES의 키의 길이는 64비트이며 동일한 8바이트로 키를 생성합니다

 

new함수를 사용하여 클래스 내의 객체에 대해 새로 정의하여 새로운 DES 암호 개체로 인스턴스화합니다 기본적인 형식은 위와 같습니다

 

새로운 DES 개체로 생성하면서 각각 들어갈 매개변수에 대해 설명해 드리겠습니다

 

DES개체 매개변수

key

  • bytes 암호화키 앞서 key변수에 8바이트로 키를 생성했기에 변수를 그대로 입력하면 됩니다

 

mode

  • DES에서 사용가능한 블록모드 아래 이미지를 참고합니다 이번에는 EAX방식을 사용합니다

 

**kwargs 

  • iv(bytes문자열) - CBC,CFB,OFB,OPENPGP 모드에서 암호화 또는 해독에 사용할 초기화백터입니다 CBC,CFB,OFB의 경우 문자열의 길이가 8바이트여야 합니다
  • nonce(bytes문자열) - EAX, CTR모드에서만 적용이 가능합니다 

 

 

pycryptodome문서에 DES로 지원되는 작동모드에 대한 모드가 나와있습니다

이번에 저희는 EAX모드를 사용합니다 2003년 Bellare, Rogaway 및 Wagner가 NIST를 위해 설계한 AEAD 모드입니다 

 

Encryption

1
cipher = DES.new(key, DES.MODE_EAX,nonce=None)
cs

위에서 Crypto에 cipher 모듈을 불러왔기 때문에 바로 인자값만 변경하여 작성해 줍니다

 

 

1
ciphertext,tag=cipher.encrypt_and_digest(text.encode('utf-8'))
cs

tag함수를 사용하여 내용이 손상되지 않았는지 확인합니다 tag의 담기는 내용은 cipher.encrypt_and_digest와 동일합니다

메시지가 bytes로 되어있기에 인코딩을 해줘야 합니다 파이썬의 기본 인코딩은 ascii이지만 한글을 고려하여 ascii가 아닌 utf-8로 인코딩합니다

728x90
1
print(f'암호문:{ciphertext}')
cs

이제 암호문을 출력해 봅시다

 

 

 

Decryption

1
cipher = DES.new(key,DES.MODE_EAX,nonce=nonce)
cs

암호화 때랑 동일하게 DES 개체로 인스턴스화해 줍니다

이때 인자값 nonce는 암호화에서 일회용으로 사용한 nonce변수로 지정해줍니다 nonce변수에는 처음 생성한 임의의 바이트값이 담겨있습니다

올바른 키를 사용하여 복호화가 되도록 키값이 수정되거나 변조가 되면 복호화가 진행되지 않습니다

 

1
2
plaintext = cipher.decrypt(ciphertext).decode('utf-8')
print(f'평문:{plaintext}')
 
cs

위와 같이 암호화와 반대로 cipher.decrpyt로 암호화된 바이트값을 복호화한뒤에 utf-8 디코딩을 진행해 줍니다

그리고 평문을 터미널에 출력해 보면 

 

평문이 정상적으로 출력되는 걸 확인할 수 있습니다

 

 

암호화 때 사용한 키와 다를 경우 위와 같이 오류가 발생하여 복호화가 진행되지 않습니다

 

 

GITHUB

 

GitHub - Blue-B/python-DES-algorithm

Contribute to Blue-B/python-DES-algorithm development by creating an account on GitHub.

github.com

 

Top