Pythonでpycryptodomeを用いてAESによるデータ暗号化

スポンサーリンク

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の長さで長さを合わせる処理が行われていることがわかりました。

コメント

タイトルとURLをコピーしました