Python(暗号化ライブラリ「pycrypto」)
Windows環境ではpycryptoの環境構築にMicrosoft Visual Studioが必要となり、pipコマンドでライブラリをインストールするだけでは使うことができません。
そこで、機械学習などで必要なライブラリを取り込んでいる「Anaconda」をインストールするとpycryptoも利用でき、今後の学習に役立ちます。
ただし、「Anaconda」は本家のPythonとパスの競合が起きる可能性があるので、本家のPythonをアンインストールしてから入れるほうが安全です。
今の環境を変えずに「Anaconda」を利用したい場合は、仮想マシンのVirtualBoxをインストールし、UbuntuなどのLinux環境を構築して、そちらに「Anaconda」を入れるようにする方法があります。
「Anaconda」インストールについては以下のサイト参照
https://qiita.com/kaizen_nagoya/items/7bfd7ecdc4e8edcbd679
https://qiita.com/january108/items/f4d0b655062a7c52e4fe
https://www.sejuku.net/blog/85373
※ 「Anaconda」導入後、追加ライブラリをインストールする場合は"pip"コマンドではなく"conda"コマンドを用いるようにしましょう。
ただし、ライブラリによってはcondaコマンドに対応していないものもあります。
以前投稿で紹介した「pygame」はcondaコマンドに対応していなかったり、2019/11/09で最新のPythonバージョン(3.8.0)にPygameをインストールしようとしても出来ません。Pygame側が対応していません。
ライブラリのインストールには、関連ライブラリがないと機能しないものや対応しているバージョンの問題などもあることを把握しておきましょう。
「Crypto」パッケージで暗号化、復号化
from Crypto.Cipher import AES
import base64
# 暗号化したいデータとパスワードを指定
message = "自分がして欲しいと思うことを人にもするように"
password = "12345abcd"
iv = "L3f4mlTJtCIPV9af" # 初期化ベクトル(16文字で適当な値を指定)
mode = AES.MODE_CBC # 暗号化モードを指定
# 特定の長さの倍数にするため空白でデータを埋める関数
def mkpad(s,size):
s = s.encode("utf-8") # UTF-8文字列をバイト列に変換する
pad = b' ' * (size - len(s) % size) # 特定の長さの倍数にするための空白を生成
return s + pad
# 暗号化する
def encrypt(password,data):
# 特定の長さに調節する
password = mkpad(password,16) # 16の倍数に揃える
data = mkpad(data,16) # バイト列に変換し16の倍数に揃える
password = password[:16] # ちょうど16文字に揃える
# 暗号化
aes = AES.new(password,mode,iv)
data_cipher = aes.encrypt(data)
return base64.b64encode(data_cipher).decode("utf-8")
# 復号化する
def decrypt(password,encdata):
# パスワードの文字数を調節
password = mkpad(password,16) # 16の倍数に揃える
password = password[:16] # ちょうど16文字に揃える
# 復号化
aes = AES.new(password,mode,iv)
encdata = base64.b64decode(encdata) # 暗号化データをBASE64でデコードしてバイト列に
data = aes.decrypt(encdata) # 復号化
return data.decode("utf-8") # 復号化したデータを文字列にする
# 暗号化する
enc = encrypt(password,message)
# 復号化する
dec = decrypt(password,enc)
# 結果を表示する
print("暗号化:",enc)
print("復号化:",dec)
- 暗号アルゴリズム
- 今回は広く世界中で使われているAESを使って暗号化。他にもBlowfish,RSA,DES,PKCSなどメジャーな方法が利用される。
- AES.MODE_CBC
- ブロック暗号化モードにCBCモードを利用。これは、まず16バイトのデータを初期化ベクトルで暗号化し、その次の16バイトを暗号化した上で、前回暗号化したデータを使って更にデータを暗号化するという強力な方法です。
- AES.new(password,mode,iv)メソッド
- AES暗号化オブジェクトの生成をする。引数にパスワード、ブロック暗号化モード、初期ベクトルの3つを指定。
- 文字列をバイト列に変換
- "文字列".encode("utf-8") 文字列をバイト列に変換
b"バイト列".decode("utf-8") バイト列を文字列に変換
バイト列を表現する場合はb" "のように記述 - base64モジュール
- バイト列をBASE64形式にエンコードして表示することで、扱いが難しいバイト列をただの文字列として扱いやすくします。
base64.b64encode(バイト列) バイト列をBASE64でエンコードして文字列を返す
base64.b64decode(文字列) 文字列をBASE64でデコードしてバイト列を返す