Python cryptographic 라이브러리 알아보기

오늘은 Python으로 문자열을 암호화할 수 있는 cryptographic 패키지에 대하여 알아보려 합니다.

개요

암호화 알고리즘이 구현된 패키지입니다.

cryptography 설치

우선 virtualenv로 파이썬 환경을 분리해줍니다.

pip3 install virtualenv
virtualenv -mvenv env

env라는 이름의 가상 환경을 생성합니다.

source env/bin/activate

가상환경을 폴더에서 활성화합니다.

pip install cryptography

pip로 cryptography를 설치합니다.

hello, world

from cryptography.fernet import Fernet

암호화와 복호화에 같은 키 값을 쓰는 대칭키 암호화 인증 방식인 Fernet을 가져옵니다.

key = Fernet.generate_key()

키를 생성합니다.

token = Fernet(key).encrypt(b"hello, world")
print(token)

hello, world라는 바이트를 키로 암호화하고, 복호화 토큰을 생성합니다.

decrypt_string = Fernet(key).decrypt(token)
print(decrypt_string)

해당 토큰과 키만 있다면 다시 복호화할 수 있습니다.

AES-GCM

import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

무결성과 기밀성이 존재하는 Galois Counter Mode의 AES인 AES-GCM를 가져옵니다.

data = b"a secret message"

바이트를 정의합니다.

key = AESGCM.generate_key(bit_length=128)

블록 크키가 128에 대한 키에 대해 생성합니다.

os_urandom = os.urandom(12)

임의의 바이트를 생성합니다.

encrypt_string = AESGCM(key).encrypt(os_urandom, data, b"authenticated")
print(encrypt_string)

생성한 키를 가지고 임의의 바이트와 데이터, 그리고 AEAD(인증 값)를 함께 암호화 합니다.

decrypt_string = AESGCM(key).decrypt(os_urandom, encrypt_string, b"authenticated")
print(decrypt_string)

생성한 키를 가지고 임의의 바이트와 데이터, 그리고 AEAD(인증 값)를 함께 복호화 합니다.

Ed25519

import cryptography.exceptions
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey

Ed25519 개인 키를 만들 수 있는 Ed25519PrivateKey를 가져옵니다.

그리고 개인 키가 일치하지 않았을 때에 오류를 막을 수 있는 cryptography.exceptions도 가져옵니다.

private_key = Ed25519PrivateKey.generate()

개인 키를 생성합니다.

signature = private_key.sign(b"example@example.com")

생성된 개인 키에 서명합니다.

public_key = private_key.public_key()

공개 키를 생성합니다.

try:
    verify_result = public_key.verify(signature, b"example@example.com")
except cryptography.exceptions.InvalidSignature:
    print("Wrong key")

try except로 같은 서명이 아닐 시에는 InvalidSignature 오류가 발생합니다.

Written on April 18, 2019