pythonで暗号演算 ~AES-ECB編~

python,暗号演算,pycryptodome,python,暗号演算

AES-CMAC編に引き続き、今回はAES-ECBの暗復号をpythonで実施してみようと思います。

AES-ECBとは

まず初めに、AES-CMAC編でも説明したようにAESとは、 Advanced Encryption Standard(高度暗号化標準)の略となり、特定の長さのデータ(ブロック)を単位として処理を行う「ブロック暗号」の一種です。AESには暗号利用モードと呼ばれる複数の暗号化メカニズムがあり、AES-ECBはそのメカニズムのうちの一つとなります。

AES-ECBの特徴として最も単純な暗号利用モードであることが挙げられます。

これは、平文ブロックと暗号文ブロックが必ず一対一の関係になるためです。

WhiteTimberwolf (SVG version) – PNG version, パブリック・ドメイン, https://commons.wikimedia.org/w/index.php?curid=26434116による

AESの暗号利用モードの中でECBモードは最も機密性が低く、一般的には非推奨の暗号利用モードとされております。

もちろん私が業務で扱う機器においても使用はしておりません。

ライブラリ (PyCryptodome)

pipから暗号演算が行えるライブラリをインポート。

pip install pycryptodome

詳細についてはこちらを参照してください。

https://pycryptodome.readthedocs.io/en/latest/src/vs_pycrypto.html

ソースコード

注意点として必ず入力メッセージサイズは16byte単位でなければなりません。

これはAESがブロック暗号方式(ある特定のビット数のまとまりを一度に処理する)のためです。

もし対象のデータが16byte単位とならない場合はパディングと呼ばれる足りないサイズを適当な値を追加することで補う必要があります。

パディング方式についてはいくつか種類があるためそのうち取り上げます。

import Crypto.Cipher.AES as AES

# 鍵値
key = bytes.fromhex("00112233445566778899aabbccddeeff")

# メッセージサイズ16byte単位
data = bytes.fromhex("00112233445566778899aabbccddeeff")
print("平文:" + data.hex())
decipher = AES.new( key, AES.MODE_ECB )
enc = decipher.encrypt(data)
print("暗号文:" + enc.hex())
dec = decipher.decrypt(enc)
print("復号文:" + dec.hex())


# メッセージサイズ48byte単位
data = bytes.fromhex("00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff")
print("平文:" + data.hex())
decipher = AES.new( key, AES.MODE_ECB )
enc = decipher.encrypt(data)
print("暗号文:" + enc.hex())
dec = decipher.decrypt(enc)
print("復号文:" + dec.hex())

出力結果

出力結果は以下の通り。

平文:00112233445566778899aabbccddeeff
暗号文:62f679be2bf0d931641e039ca3401bb2
復号文:00112233445566778899aabbccddeeff
平文:00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff
暗号文:62f679be2bf0d931641e039ca3401bb262f679be2bf0d931641e039ca3401bb262f679be2bf0d931641e039ca3401bb2
復号文:00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff

着目してほしいのは、二つ目の48byteデータの平文と暗号文です。

これは入力データに全く同じ16byteのデータの連結を使用しているのですが、出力結果についても同様に全く同じ16byteのデータの連結となっております。

このように必ず入力と出力が1対1となってしまうことがAES-ECBの使用が非推奨である理由です。

平文:00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff
暗号文:62f679be2bf0d931641e039ca3401bb262f679be2bf0d931641e039ca3401bb262f679be2bf0d931641e039ca3401bb2

以降で取り上げる予定のほかの暗号利用モードでは、アルゴリズムに改良を加えたことによって上記脆弱性を解決しております。