[파이썬] Python 대칭키 암호화 알고리즘(cryptography) 사용법
우리는 오늘 파이썬에서 문자열(텍스트)을 암호화 할 수 있는 방법에 대해 알아봅니다.
cryptography 라이브러리를 사용하여 대칭키를 사용하여 암호화 및 복호화를 예제를 통해 알아봅니다.
대칭키란 암호화 할 때와 복호화 할 때 동일한 키 값을 의미합니다.
대표적인 대칭키 알고리즘으로 DES, AES가 있습니다.
문자열을 암호화할 때 생성한 암호키(대칭키)는 관리를 잘 해야 합니다.
왜냐하면 분실하면 절대로 복호화 할 수 없습니다.
일반 기업에서 ISMS인증 심사할 때도 암호키를 주기적으로 변경하고 있는지 확인하기 위해 관리대장을 요구하고 있습니다.
사실 대칭키를 주기적으로 변경하는 것은 결코 쉬운일이 아닙니다.
왜냐하면 대칭키(암호키)를 변경한다는 것은 해당 대칭키로 암호화한 문자열을 모두 복호화 해야합니다.
그런 다음 다시 새로운 대칭키를 생성해야 암호화 해야한다는 것을 의미하기 때문입니다.
파이썬 cryptography 설치하기
1. 명령프롬프트창(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:\users\ilike\appdata\roaming\python\python39\site-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:\users\ilike\appdata\local\programs\python\python39\python.exe -m pip install --upgrade pip' command. C:\>
암복호화에 사용될 키 생성하는 방법
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/
cryptographycryptography is a package which provides cryptographic recipes and primitives to Python developers.pypi.org