Python

[Python] 파이썬 대칭키 암호화 알고리즘 cryptography 모듈 설치 및 사용방법 알아보기

파이썬에서 간단하게 문자열(텍스트)을 암호화 할 수 있는 방법에 대해 알아봅니다.

cryptography는 대칭키를 사용하여 암호화 및 복호화를 하게 됩니다.

대칭키란 암호화 할 때와 복호화 할 때 동일한 키 값을 의미합니다.

대표적인 대칭키 알고리즘으로 DES, AES가 있으며, 이 알고리즘에 대해서는 나중에 알아보기로 합니다.

문자열을 암호화할 때 생성한 암호키(대칭키)는 관리를 잘 해야 합니다.

분실하면 절대로 복호화 할 수 없습니다. ISMS인증 심사할 때도 암호키를 주기적으로 변경하고 있는지 확인하기 위해 관리대장을 요구하고 있습니다.

사실 대칭키를 주기적으로 변경하는 것은 결코 쉬운일이 아닙니다.

대칭키(암호키)를 변경한다는 것은 해당 대칭키로 암호화한 문자열을 모두 복호화 후 다시 새로운 대칭키를 생성해야 암호화 해야한다는 것을 뜻하기 때문입니다. 키 관리에 어려움이 있는 것이지요. 그래서 암호키 관리 대장을 마치 변경한 것 처럼 작성하기도 합니다.

cryptography 설치하기

명령프롬프트창(cmd)을 열고 pip install cryptography명령어를 실행하여 설치합니다.

C:>
C:>pip install cryptography
Collecting cryptography
  Downloading cryptography-3.3.1-cp36-abi3-win_amd64.whl (1.5 MB)
     |████████████████████████████████| 1.5 MB 6.8 MB/s
Requirement already satisfied: six>=1.4.1 in c:usersilikeappdataroamingpythonpython39site-packages (from cryptography) (1.15.0)
Collecting cffi>=1.12
  Downloading cffi-1.14.4-cp39-cp39-win_amd64.whl (179 kB)
     |████████████████████████████████| 179 kB 6.4 MB/s
Collecting pycparser
  Downloading pycparser-2.20-py2.py3-none-any.whl (112 kB)
     |████████████████████████████████| 112 kB 6.4 MB/s
Installing collected packages: pycparser, cffi, cryptography
Successfully installed cffi-1.14.4 cryptography-3.3.1 pycparser-2.20
WARNING: You are using pip version 20.3.1; however, version 20.3.3 is available.
You should consider upgrading via the 'c:usersilikeappdatalocalprogramspythonpython39python.exe -m pip install --upgrade pip' command.

C:>

파이참 IDE를 사용중인 경우에는 마우스 커서를 올리면 install package cryptography를 클릭하여 설치할 수 있습니다.


 

암복호화에 사용될 키 생성하기

Fernet 클래스의 generate_key()메서드를 사용하여 키를 생성합니다. generate_key()메서드를 호출 할 때 마다 새로운 키 값이 계속 생성됩니다. 암호화 할 때 사용한 키와 복호화 할때 사용한 키가 다르면 복호화 되지 않습니다. 보통 암화화 키는 6개월에서 1년에 한 번씩 변경합니다.

from cryptography.fernet import Fernet

key = Fernet.generate_key()
print(f'대칭키:{key}')


#실행결과
대칭키:b'crNz2jnaPU_OKmA8dj-mLywgFTeMw4WLlICDZMKUuIo='

 

암호화(Encrypt)

“CNN – Breaking News, Latest News and Videos” 문자열을 암호화 합니다. 좀 전에 위에서 생성한 대칭키를 가지고 문자열을 암호화 후 출력하였습니다.

from cryptography.fernet import Fernet

#대칭키
key = b'crNz2jnaPU_OKmA8dj-mLywgFTeMw4WLlICDZMKUuIo='

fernet = Fernet(key)
encrypt_str = fernet.encrypt(b"CNN - Breaking News, Latest News and Videos")

print("암호화된 문자열 : ", encrypt_str)


#실행결과
암호화된 문자열 :  b'gAAAAABf664_mP6UQLId6Vd7VWqwhOMweKzaLtN7rw9gB3QNJuvXuJE6vYu9ebI7pS9nr11r5u5J1eayifIptopODMSrk2B4tLyMEYRrnaNa5wcq0scCV40CiRNoHMji4pcC4tuFibfc'

 

참고로 한글은 암호화 지원을 하지 않습니다. 한글 암호화 시도시 SyntaxError: bytes can only contain ASCII literal characters. 오류가 발생됩니다. 아스키 문자만 지원합니다.

 

복호화(Decrypt)

from cryptography.fernet import Fernet

#대칭키
key = b'crNz2jnaPU_OKmA8dj-mLywgFTeMw4WLlICDZMKUuIo='
encrypt_str = b'gAAAAABf664_mP6UQLId6Vd7VWqwhOMweKzaLtN7rw9gB3QNJuvXuJE6vYu9ebI7pS9nr11r5u5J1eayifIptopODMSrk2B4tLyMEYRrnaNa5wcq0scCV40CiRNoHMji4pcC4tuFibfc'
fernet = Fernet(key)
decrypt_str = fernet.decrypt(encrypt_str)

print("복고화된 문자열 : ", decrypt_str)


#실행결과
복고화된 문자열 :  b'CNN - Breaking News, Latest News and Videos'

 

암호화키가 다르면 아래와 같은 오류가 발생하게 됩니다.

in verify raise InvalidSignature(“Signature did not match digest.”)
cryptography.exceptions.InvalidSignature: Signature did not match digest.

 

 

반대로 암호화된 문자열이 변경된 경우 암호화키가 맞아도 복호화 할 수 없으며, 아래와 같은 오류가 발생하게 됩니다.

in b64decode return binascii.a2b_base64(s)
binascii.Error: Invalid base64-encoded string: number of data characters (125) cannot be 1 more than a multiple of 4

During handling of the above exception, another exception occurred

 

[REFERENCE]

pypi.org/project/cryptography/

 

cryptography

cryptography is a package which provides cryptographic recipes and primitives to Python developers.

pypi.org

 

Leave a Reply

error: Content is protected !!