pythonのCryptoでAES暗号を使ってみた

暗号っていいよね。なんかこう、楽しい。 というわけで、pythonで試してみました。

といっても、残念ながら標準ライブラリにはそれっぽいのがない。 hmacとかsslとかはあるんだけどねー。 AESくらいは標準ライブラリに入れといて欲しいよね・・・。ま、仕方がない。 仕方がないので、今回使うのはpycryptoっていうライブラリを使わして頂きます。

インストール

gentooのportageにパッケージがあったので有難く利用。

$ sudo emerge pycrypto

python2.xでもpython3.xでもCryptoって名前のパッケージになります。 小文字じゃないんだね、頭。

gentoo以外を使ってる方はpypiにあるpycryptoのページあたりからどうぞ。

使ってみる

早速AESで遊んでみます。

1つ注意しなきゃいけないのは、AESはブロック暗号だということ。 つまり、鍵長は16バイト、24バイト、32バイトのうちのどれかじゃないといけないし、データも16バイトの倍数じゃなきゃいけない。 めんどくさいけど、まあその分高速・・・なんじゃない? 多分。

from Crypto.Cipher import AES

key = 'this is a key123'      # 鍵。数字とか入れて文字数を稼がなきゃいけない。
message = 'this is message!'  # 暗号化するデータ。これも16バイトの倍数じゃなきゃいけない。

print 'original:', message

cipher = AES.new(key)  # これで暗号化/復号するためのモノを作成。

data = cipher.encrypt(message)  # 戻り値は暗号化されたデータ。
print 'cipher:', repr(data)     # バイナリなのでそのままprintせずにreprに通してます。

print 'decode:', cipher.decrypt(data)  # こうすると復号されたデータが返ってくる。

以上。結構簡単な感じ。

ただ厄介なのは、

import Crypto

obj = Crypto.Cipher.AES.new(key)

みたいな使い方ができないっぽい。 ディレクトリで分けてるみたいね。

必ず

import Crypto.Cipher.AES

とするか、

from Crypto.Cipher import AES

としてください。


参考: PyCryptoで暗号化する - Pythonメモ pycrypto - Python Package Index