M2Crypto
opensslのpythonラッパーのM2CryptoにはEVPインターフェースというものがありまして、
これを使用すると各種暗号方式を高レベルインターフェースで叩くことできる、
ということになってます。
(正確にはopensslレベルでEVPインターフェース(オブジェクト指向っぽい?)
が用意されていて、これをpythonのオブジェクト指向とマッチングさせたのが
M2CryptoのEVPインターフェース)
ところが、この辺り、きちんと書かれた日本語(英語もか?)のドキュメントがないのですね。
きちんと書いてなくても、せめてサンプルぐらいないものかよ、と。
これで、数日はまっていたわけです。
ようやく、大丈夫っぽい結果が出ましたので、忘れないうちにメモを。
さて、これで次のステップへ進める準備ができた。
#EVPインターフェースの使用例
#その1
#RawKeyを使用せず、パスワードハッシュがmd5(デフォルト)の場合
#この場合、saltはパスワードハッシュを元に勝手に計算してくれる
#EVP.Cipher('des_cbc', 'pass', '', 1)
#引数は最初から
#アルゴリズム
#Key(RawKeyを使う場合は別途、オペレーションが必要)
#salt
#オペレーションモード(1=暗号化,0=復号化)
>>> e=EVP.Cipher('des_cbc', 'pass', '', 1)
>>> e.update('abc')
''
>>> e.final()
'\xc1.d_\xb5\xe0T\xff'
>>> enc=e.final()
>>> len(enc)
8
>>> d=EVP.Cipher('des_cbc', 'pass', '', 0)
>>> d.update(enc)
''
>>> d.final()
'abc'
#その2
#RawKeyとsaltを使用した場合
#ついでにハッシュはsha1使用
#EVP.Cipher('des_cbc','0000000000000000', '12345678', 1,0,d='sha1')
#先ほどと同様に、引数は最初から
#アルゴリズム
#Key(RawKey)
#salt
#オペレーションモード(1=暗号化,0=復号化)
#Key_asByte=0(0以外を指定することでRawKeyを使用しない)
#20090508訂正済み
#d='sha1'(ハッシュでsha1使用?この場合どこで使うんだ??ただ、指定なし(md5)もしくは明示的にmd5を指定した場合だと
#違うものが出てくるところを見るとどこかで使っているんだろう)
#090508補足
#Key_asByte=!0ならば当然ハッシュを使用する
>>> e=EVP.Cipher('des_cbc','0000000000000000', '12345678', 1,1,d='sha1')
>>> e.update('abc')
''
>>> enc=e.final()
>>> enc
'\xf9n\xec\xb3=\x81\xa8\r'
>>> d=EVP.Cipher('des_cbc','0000000000000000', '12345678', 0,1,d='sha1')
>>> d.update(enc)
''
>>> d.final()
'abc'
#その3
#rc4でRawKeyを使用せず、パスワードハッシュがmd5の場合
#EVP.Cipher('rc4', 'pass', '', 1)
>>> e=EVP.Cipher('rc4', 'pass', '', 1)
>>> enc=e.update('abc')
>>> enc
'\x00\x02y'
>>> len(enc)
3
>>> d=EVP.Cipher('rc4', 'pass', '', 0)
>>> d.update(enc)
'abc'
#その4
#RawKeyとsaltを使用した場合
#EVP.Cipher('rc4','00000000000000000000000000000000','12345678',1,1)
>>> e=EVP.Cipher('rc4','00000000000000000000000000000000','12345678',1,1)
>>> enc=e.update('abc')
>>> d=EVP.Cipher('rc4','00000000000000000000000000000000','12345678',0,1)
>>> d.update(enc)
'abc'
090508修正
最後のパラメーターがKey_asByteなので、RawKeyを使用する場合は0を指定すべき