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でデコードしてバイト列を返す

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Python

前の記事

Python(会員制Webサイト)
Python

次の記事

Python(機械学習)