たそらぼ

日頃思ったこととかメモとか。

PythonでAESの暗号化を試した

PythonでAESの暗号化を学んだのでメモ。

やりたいこと

C#で暗号化されたものをPythonで再現する。
c#の暗号化クラスを使ってみた(AES,RSA) - Qiita

PythonでAESの暗号化を行う

CBCモードで行うAESにより暗号化するサンプルコードは、以下が参考になる。
pycryptodome.readthedocs.io

PyCryptodomeを選択した理由は、Developers.IOから、PyCryptodomeがよさそうだったため。
AES対応のPython暗号化ライブラリを比較検証してみた | Developers.IO

実験

サンプルコードを参考に、鍵とinitialization vectorを指定して、暗号が再現できるか確認する。
※initialization vectorは本当は固定しないが、今回は実験のため固定する。

from base64 import b64encode
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad
import json

data = "Hello, World!".encode('utf-8')
key = "9Fix4L4HB4PKeKWY".encode('utf-8')
iv = "pf69DL6GrWFyZcMK".encode('utf-8') #get_random_bytes(16)

cipher = AES.new(key=key, mode=AES.MODE_CBC, iv=iv)
ct_bytes = cipher.encrypt(pad(data, AES.block_size))
iv = b64encode(iv).decode('utf-8')
ct = b64encode(ct_bytes).decode('utf-8')
result = json.dumps({'iv':iv, 'ciphertext':ct})
print(result)
#{"iv": "cGY2OURMNkdyV0Z5WmNNSw==", "ciphertext": "p8ITppfvm6QnVtL/Ji9/ZQ=="}

確かに暗号化した文が一致している。

参考

C#のAESについて

System.Security.CryptographyにAESのクラス群が定義されている。抽象基底クラスは以下。
docs.microsoft.com
Wikiの記載によると、AESに採用されたのはRijndaelで、これもクラスがある。
ただし、AESとの違いが以下に説明されている。
docs.microsoft.com

AESのパラメータの参考

IPsec 暗号ペイロードにAESを使う際の規定がIPAで発行されている。
特に、今回はinitialization vectorを固定としたが、必ず暗号化ごとに変えることが記載されている。
www.ipa.go.jp

また、initialization vectorの必要性は徳丸先生のnoteが参考になる。
note.com