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