本記事ではPythonで暗号化を行うpycryptodomeの使い方について超わかりやすく解説しています。Pythonは非常に人気なプログラミング言語です。そんなPythonのpycryptodomeの使い方を紹介します。
本記事の目標
本記事は、pycryptodomeを利用してAESの暗号化・復号化を紹介しています。
AESについて理解が曖昧な方は、下の記事で解説していますので御覧ください。
実行環境は「python 3.8.8」です。
pycryptodomeとは?
pycryptodomeはAES対応の暗号化ライブラリです。
暗号化ライブラリとしてはpycryptoが有名ですが、アップデートが当分の間されておらずセキュティの面からpycryptodomeにしておこうという考えです。
どこのサイトを見ても、pycryptoライブラリを今から使うことは少ないようです。
ターミナルで下のコマンドを実行し、pycryptodomeをローカル環境にインストールしておきましょう。
pip install pycryptodome
暗号化
必要なモジュールをインポートしておきます。
import string
import random
from Crypto.Cipher import AES
暗号化を行うためにはkeyとivが必要です。
keyは暗号を解くための鍵で、ivは初期化ベクトルで同じ平文が同じ暗号文にならないように利用します。
今回利用する「pycryptodome」はbyte型でないと実行できないので、encodeすることでこれを可能にしています。
3行目と6行目は文字列を生成しているわけですが、下の記事でランダムな文字列の作成方法を紹介していますので、そちらを見ていただけると意味が理解できるかと思います。
>>【Python】たった1行で文字列を生成する方法
8行目では、生成した「key」と「iv」をもとにcipherオブジェクトを生成しています。
「AES.MODE_CBC」は暗号化のモードを決めるもので、SSL通信などでも利用されているCBCを今回は利用しました。
# keyとivを作成
key = ''.join(
random.choice(string.ascii_letters) for _ in range(AES.block_size)
).encode()
iv = ''.join(
random.choice(string.ascii_letters) for _ in range(AES.block_size)
).encode()
cipher = AES.new(key, AES.MODE_CBC, iv)
ついにテキストを暗号化します。
今回は「seacret data」の文字列の暗号化を行っています。
2行目は、暗号化を行う際に16bitの倍数でなければ処理が実行されないため、AESのブロックサイズを利用してbit数を調節しています。
text = 'seacret data'
reflesh_length = AES.block_size - len(text) % AES.block_size
text += chr(reflesh_length) * reflesh_length
cipher_text = cipher.encrypt(text.encode()) #暗号化
print(cipher_text)
上の処理をすべてまとめて記述して実行を行うと、結果は下のようになります。
暗号っぽい感じになっていることがわかります。
【実行結果】
b'\x87\xbc8Y1R\xa6n&\xde\x86\x83q\xe9\xb8\x06'
復号
keyやivは暗号化したものと同様のものでなければいけないため、暗号化のソースコードの続きに記述しましょう。
復号は比較的簡単です。
先程暗号化したいデータのbit数を調節し、追加したので、複合する場合に削る処理が必要です。それを4行目のスライスで記述しています。
# 復号
cipher2 = AES.new(key, AES.MODE_CBC, iv)
decryption_text = cipher2.decrypt(cipher_text)
print('復号化したデータ :', decryption_text[:-decryption_text[-1]])
実行結果
b'seacret data'
全コード
暗号化とその復号を含めた全コードは以下のようになります。
import string
import random
from Crypto.Cipher import AES
# 初期設定
key = ''.join(
random.choice(string.ascii_letters) for _ in range(AES.block_size)
).encode()
iv = ''.join(
random.choice(string.ascii_letters) for _ in range(AES.block_size)
).encode()
cipher = AES.new(key, AES.MODE_CBC, iv)
# 暗号化したいデータの準備
text = 'seacret data'
reflesh_length = AES.block_size - len(text) % AES.block_size
text += chr(reflesh_length) * reflesh_length
print('暗号化したいデータ :', text)
# 暗号化
cipher_text = cipher.encrypt(text.encode()) #暗号化
print('暗号化されたデータ :', cipher_text)
# 復号
cipher2 = AES.new(key, AES.MODE_CBC, iv)
decryption_text = cipher2.decrypt(cipher_text)
print('復号したデータ :', decryption_text[:-decryption_text[-1]])
【実行結果】
暗号化したいデータ : seacret data
暗号化されたデータ : b'++\x01Ls{/\x8f\xb4O\xa7E\xd9\xe19\x08'
復号したデータ : b'seacret data'
ということで本記事はPythonのpycryptodomeの使い方(AES)を紹介しました。
最後まで読んでいただきありがとうございました\(^o^)/
超オススメのPC用品
PCを操作する上で、トラックボールマウスが非常におすすめです!
僕も感動したこのマウスを、騙されたと思って使ってみてください!(^^)
外部モニターで2倍以上の効率化が見込めます!
安いものだと、たったの1万円前後なのでおすすめですよー!\(^o^)/