なんちゃって暗号ファイルシステムの実装

昨日は(暗号方式に)DESを使用したら(暗号化の際に)パディングが行われ、実際のファイル
サイズと違うものが書き込まれ、読み出して、復号化したのはいいけど、暗号化された状態での
バイト数分余計なもの(0x00)が返される、という妙な事態になっていました。

なので、気を取り直してRC4に再挑戦。

その前にpyCryptoの挙動を以下に曝しておこう。
(私がおかしいのか?)

>>> from Crypto.Cipher import *
>>> dir(Crypto.Cipher)
['AES', 'ARC2', 'ARC4', 'Blowfish', 'CAST', 'DES', 'DES3', 'IDEA', 'RC5', 'XOR', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__path__', '__revision__']

>>> import md5
>>> rc4=ARC4.new(md5.new("Nobody inspects the spammish repetition").digest())
>>> enc=rc4.encrypt('abc')
>>> enc
'\xdb\x11\x06'
>>> dec=rc4.decrypt(enc)
>>> dec
'\xfek\xcd'
>>> data='abc'
>>> enc=rc4.encrypt(data)
>>> enc
'\x15E3'
>>> dec=rc4.decrypt(enc)
>>> dec
'\xd1\x8e\xa5'

opensslのコマンドラインはしっかり動くじゃないか、と思ってよくよく見ていると、pyCryptoでは
(少なくとも)RC4は自前実装なんですね。
それは結果がおかしくなるかも(いや、それじゃ困るのだけど)

結局、GPLで公開されていたRC4Python実装をここから入手しました

http://nakagami.blog.so-net.ne.jp/2005-12-22

ちなみに、このARC4実装はpyCryptのCソースを参考にしているらしい。
だとしたら、そのラッパーできちんと動いてしかるべき。
期待通り動かないというのは釈然としないのだけど。

おっと、最終結果を

skobayas@localhost ~]$ cp abcd.txt /tmp/fuse
[skobayas@localhost ~]$ md5sum abcd.txt /tmp/fuse/abcd.txt
f5ac8127b3b6b85cdc13f237c6005d80 abcd.txt
f5ac8127b3b6b85cdc13f237c6005d80 /tmp/fuse/abcd.txt
[skobayas@localhost ~]$

なお、memoy.pyのreadメソッドには復号化の細工がしてあります。
(当たり前だけど)
この細工なしだと、暗号化されたデータが5byte書き込まれているのを確認できます。

かなりはしょっているけど、今日のところはこのぐらいで勘弁してやるわ。(おいおい)