PyCryptodome

暗号化モジュールPyCryptodomeを使った暗号化である。

ドキュメント

PyCryptodome

Crypto.Cipher

AES暗号化を行なう。

インストール

pip install pycryptodome

インポート

from Crypto.Cipher import AES

暗号化

平文ファイル全体を読み込んで、一括で暗号化して、nonce, tagと一緒に暗号化ファイルに書き出す。

# Read Input File
with open(filename, 'rb') as file1:
    input_data = file1.read()    # Read Original File as Binary

# Encryption
cipher = AES.new(key, AES.MODE_EAX)
ciphertext, tag = cipher.encrypt_and_digest(input_data)

# Write New File from Encrypted Data 
with open(filename+suffix, 'wb') as file2:
    # nonce and tar are 16 bytes
    [ file2.write(data) for data in (cipher.nonce, tag, ciphertext) ]
  • ファイルに書き出すところはリスト内包表記を使った。
  • nonce, tag, encrypted_dataの順番を読み出す時に間違わないようにすること。

復号化

暗号化ファイル全体を読み込んで、nonce, tag, 暗号化データを抜き出して一括で復号化して、平文ファイルに書き出す。

with open(filename, 'rb') as file1:
    input_data = file1.read()    # Read Original File as Binary
        
# nonce and tar are 16 bytes.
nonce = input_data[0:16]
tag = input_data[16:32]
ciphertext = input_data[32:]

cipher = AES.new(key, AES.MODE_EAX, nonce)
output_data = cipher.decrypt_and_verify(ciphertext, tag)

with open(filename.replace(suffix,''), 'wb') as file2:
    file2.write(output_data)
  • 上記暗号化で作成した暗号化ファイルを読み込んでいる。
  • nonce, tag, encrypted_dataの順番を書き込んだときと一致させること。

Crypto.Random

ランダムなバイト型を生成する。

インポート

from Crypto.Random import get_random_bytes

乱数生成(バイト型)

key = get_random_bytes(16)