Pythonでpycryptodomeを用いてAESによるデータ暗号化を行ってみます。
今回はpycryptodomeを用います。このライブラリ・モジュールはPythonの標準ライブラリではありませんので、事前にインストールする必要があります。
■Python
今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)
■pycryptodomeを用いてAESによるデータ暗号化
では、早速pycryptodomeを用いてAESによるデータ暗号化のスクリプトを書いていきます。
■コード
from Crypto.Cipher import AES from Crypto.Util.Padding import pad from Crypto.Random import get_random_bytes key = get_random_bytes(16) cipher = AES.new(key, AES.MODE_EAX) plaintest = b'hello world! new world' ciphertext =cipher.encrypt(pad(plaintest,AES.block_size)) print(ciphertext)
Crypto.Cipher.AES.new()を用いて、新しいAES暗号を作成する。括弧内の引数,パラメータには、第1の引数,パラメータとして、keyを渡す。このkeyは対称暗号で使用する秘密鍵です。この秘密鍵の条件として長さが16、24、または32 バイトでないと「ValueError: Incorrect AES key length (10 bytes)」といったエラーが出力され、暗号化に失敗する。そのため、今回はkey変数を定義する際に、Crypto.Random.get_random_bytes()を用いている。これで括弧内に引数,パラメータとして、Nと値となる数値を渡す。今回は「16」とする。これで、長さ”N”のランダムなバイト文字列が返される。これを秘密鍵とすることができる。
暗号化する際はencrypt()を用いて行うが、この時にCrypto.Util.Padding.pad()を用いる。これで標準パディング(padding)を適用する。パディング(padding)は、IT用語では、何かを詰める,長さを合わせる処理という意味。括弧内の引数,パラメータには、第1の引数,パラメータとして、plaintest変数を渡します。第2の引数,パラメータとしてパディング(padding)に使用するブロック境界(AES)を渡します。これで暗号化されたものが、ciphertext変数に格納されます。
最後にprint()でciphertext変数の情報を出力します。
■実行・検証
コードを記述後、スクリプトを「aes_encrypt_test.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
実行してみると、pycryptodomeを用いて指定した文字列をAESによる暗号化で暗号化させることができ、暗号化した文字列を出力させることができました。
■Crypto.Util.Padding.pad()を用いない場合はどうなるのか
■コード
from Crypto.Cipher import AES from Crypto.Util.Padding import pad from Crypto.Random import get_random_bytes key = get_random_bytes(16) cipher = AES.new(key, AES.MODE_EAX) plaintest = b'hello world! new world' ciphertext =cipher.encrypt(plaintest) print(ciphertext)
出力後、Crypto.Util.Padding.pad()を用いない場合はどうなるのかを検証する。
■実行・検証
コードを記述後、スクリプトを「aes_encrypt_test2.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
実行してみると、上記の暗号化された文字列が出力されました。Crypto.Util.Padding.pad()を用いた時と比較すると、長さが異なる。このことから、Crypto.Util.Padding.pad()を用いると、AES.block_sizeの長さで長さを合わせる処理が行われていることがわかりました。
コメント