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を指定すべき