Changes between Version 2 and Version 3 of PythonCamellia


Ignore:
Timestamp:
05/06/06 16:23:50 (13 years ago)
Author:
sgk
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • PythonCamellia

    v2 v3  
    88 * 鍵長は128、192、256ビット。 
    99 * だいぶ作りを変えましたが、簡単なテストは行ってあります。 
     10 * 対象はPython 2.3および2.4です。 
    1011 
    1112 * オリジナルどおりのAPIなので、単に128ビット(16バイト)ブロックの暗号化復号化ができるだけです。 
     
    1314 * ベンチマークやってません。 
    1415 * 簡単なテストしかやってありません。 
     16 * Python 2.3および2.4対応のため、やむなく長整数の演算を行っています。不効率です。 
    1517 
    1618== ダウンロード == 
     
    3335== ライセンスについて == 
    3436 
    35 BSD風ライセンスです。詳しくはソース自体をご覧下さい。オリジナルはBSD風、GPL、MPL風、OpenSSL風から選べるという贅沢ななものですが、今回はBSD風版のCのソースを見ながら書いたので、BSD風に固定です。オリジナル、なぜかライセンスごとにソースファイルが別々なんですよ。コード自体は同じ物のようなんですが。1つのソースの頭に複数のライセンスを書いておけばいいのに。 
     37BSD風ライセンスです。当社が記述した部分については当社に著作権があります。詳しくはソース自体をご覧下さい。オリジナルはBSD風、GPL、MPL風、OpenSSL風から選べるという贅沢ななものですが、今回はBSD風版のCのソースを見ながら書いたので、BSD風に固定です。オリジナル、なぜかライセンスごとにソースファイルが別々なんですよ。コード自体は同じ物のようなんですが。1つのソースの頭に複数のライセンスを書いておけばいいのに。 
    3638 
    3739== このあとやること == 
     
    4244 * `C`版をそのままネイティブモジュール化してみる 
    4345 
     46== 感想など == 
     47 
     48作業時間は5時間程度。32ビットのシフト、ローテート演算で悩んでしまいました。初歩的…と言われるかもしれませんが、Pythonは32ビットのビット演算が苦手なんです。苦手というか、`int`が32ビットである、あるいは32ビットでの演算が効率的ということを仮定するのはPython流ではない。いろいろ悪あがきをしましたが、結局、わりきって全部長整数で演算するのが一番速かったです。 
     49 
     50Python 2.3では、 
     51{{{ 
     52>>> 0x80000000 
     53<stdin>:1: FutureWarning: hex/oct constants > sys.maxint will return positive va 
     54lues in Python 2.4 and up 
     55-2147483648 
     56>>> 1<<31 
     57__main__:1: FutureWarning: x<<y losing bits or changing sign will return a long  
     58in Python 2.4 and up 
     59-2147483648 
     60>>> 
     61}}} 
     62 
     63Python 2.4では、 
     64{{{ 
     65>>> 0x80000000 
     662147483648L 
     67>>> 1<<31 
     682147483648L 
     69>>> 
     70}}} 
     71 
     72特にこのように、Pythonの2.3と2.4とでは、32ビット整数の場合の`MSB`が`1`であるような整数の取り扱いが異なります。2.4では、小さい整数(32ビット整数)と長整数の区別が無く、必要に応じて使い分けられるそうです。アセンブラとか`C`とかからこの業界に入った者としては、どうも居心地が悪いですが、仕方ありません。ごちゃごちゃ考えてややこしい計算で高速化しようという悪あがきは、Pythonでは無駄というより逆効果です。 
     73 
     74鍵生成(`Ekeygen()`)での、定数表を使ったループ演算は、べた書きに変更しました。この方が見通しが明るい。ただ、タプルの足し算をたくさんやっているのが、効率の点で気になります。たぶん、タプルのオブジェクトを作っては毅を繰り返してるんですよ。鍵生成はそんなにたくさんやることではないから、許してください。 
     75 
     76暗号化、複合化のややこしいループも、べた書きに展開しました。かなりわかりやすくなったはずです。暗号の仕組みがちょっと見えた気がします。`feistel`の「-2オフセット」なんてのは`C`ならではであって、Pythonではできないので、`feistel1()`と`feistel2()`の二つを作って使い分けています。 
     77 
     78開発の過程でJava版も読みましたが、Java版は作りがいまいちな気がします。`C`版を逐語訳した感じです。もう少しJavaらしい書き方があるんじゃないでしょうか。個人的にはJavaは得意ではないので憶測です。ただ、もしかしたら、携帯電話のJavaなど、ライブラリやリソースに制限がある環境で使用することを考えてのことかもしれません。NTTの方は、タブ=4のようです。タブ=8で見ると、タブと空白の混在でインデントが壊れてます。 
     79 
    4480== リンク == 
    4581 
     82 * [http://info.isl.ntt.co.jp/crypt/camellia/ Camelliaのサイト] 
    4683 * [http://blog.livedoor.jp/dankogai/archives/50476417.html Perl版の実装]