Trfcrypt

Trfcryptとは?
 Trfcryptは、各種の暗号化・復号化ルーチンをTclコマンドとしてTcl処理系に追加する拡張ライブラリです。 先に出てきたTrfと同じ方が開発されたものですが、 軍事転用可能なソフトウェア技術ということで、 一部のルーチンが米国輸出規制に引っかかる(*1)ために、 Trfのほかのルーチンとは別配布になったという経緯があります。

 Trfcryptがサポートする暗号化ルーチンは次の通りです。

  • DES *
  • IDEA (International Data Encryption Algorithm) (*2)
  • Blowfish
  • RC2 *
  • RC4
  • ROT (いわゆるシーザー暗号)
  • SAFER (Secure And Fast Encryption Routine)
DESとRC2については、 Eric Youngさんが開発されているSSLeayというSSL暗号化ルーチンライブラリが別途必要になります。 詳しくは配布ドキュメントを当ってください。 他の5つのルーチンは特に外部ライブラリは不要です。

 ここでは、Trf 2.0p5とTrfcrypt 2.0p2(2000/06/26公開)を、 Linux 2.2.14 (RedHat Linux 6.2J)上のTcl/Tk 8.4a1でインストールして使ったときの経緯を中心にまとめています。

(*1) Trfcryptを米国や一部の欧州の国以外、 特に日本で使うことには制限はないようですが、 詳しくはSSLやPGPなど暗号化技術に関するソフトウェアのページをご覧ください。 私も勉強しないと、ですね。
(*2) 私個人的にこの「IDEA」という名前大好きです。 アイデアではなくやっぱりイデアと呼んでほしかったり。(閑話休題) ちなみにPGP(Pretty Good Privacy)で使われるアルゴリズムがこれだそうです。

インストールしよう!
 Trfはこちら、 Trfcryptはこちらが総本山になっていて、 それぞれソース配布やバイナリ配布が入手できます。 Trfcryptをビルドするには、 Trfを先にスタブ対応でコンパイルしてインストールしていないといけませんが、 どうもconfigureがうまくスタブ対応のフラグをつけてくれないので、 configureをテキストエディタで書き換えて強引に通す必要がありました。 TrfもTrfcryptも基本は「sh configure; make; make install」 でよいのですが、configureが一部混乱しているようで、 マイLinuxではリンカーがエラーを起こすなどちょっともめました。 Makefileが直書きできる方でないとインストールはちょっと難しいかもしれません。
 Windows用にはバイナリアーカイブも配布されていますが、 どうもうまく動きません。 バイナリ配布はTcl/Tk 8.2で作られているようですが、 スタブ対応版を使ってもTcl/Tk 8.3以降では使うと異常終了します。 Windows版のソースからのビルドをいずれ試す予定です。
 Trfをデフォルトのパスでインストールすると、 /usr/local/lib/Trf2.0 というディレクトリが作られ、 次のファイルが置かれているはずです。

  • pkgIndex.tcl
  • libtrf.so
  • libmd5crypt.so
  • libtrfstub.a
「libtrfstub.a」が作られていない場合は、スタブ対応でコンパイルされていません。 configureかMakefileを強引に書き換えて何とかスタブつきにする必要があります。

 Trfcryptをデフォルトのパスでインストールすると、 /usr/local/lib/Trfcrypt2.0 というディレクトリが作られ、 次のファイルが置かれているはずです。

  • pkgIndex.tcl
  • libtrfcrypt.so

ロードしてみよう
 Tclスクリプトからロードするときには、 まずTrfをロードし、次にTrfcryptをロードする必要があります。

load /usr/local/lib/Trf2.0/libtrf.so
load /usr/local/lib/Trfcrypt2.0/libtrfcrypt.so
info commands
「info commands」が返すコマンドの中に「des」や「idea」 が含まれていればまずはOKです。

使い方
 ここでは私がいまだかつて避け得ない諸般の事情により (まだSSLeayを持ってないとはっきり言えや)、DESとRC2はおいときまして、 IDEA、Blowfish、SAFER、RC4、ROTの各アルゴリズムの圧縮・復号コマンドの使い方を紹介します。
 コマンドの名前は、

  • safer
  • idea
  • rot
  • blowfish
  • rc4
です。あ、これではどのコマンドがどのアルゴリズムなのか分かりませんね。 線でつないでみようー。

アルゴリズム コマンドの名前
RC4・   ・blowfish
SAFER・   ・idea
IDEA・   ・rc4
ROT・   ・safer
BLOWFISH・   ・rot

あ、あたま悪すぎる(浦)
黙らっしゃい!!(池)
あー関係ないネタはこのくらいにして、さっそく使ってみます。


IDEA

load /usr/local/lib/Trf2.0/libtrf.so
load /usr/local/lib/Trfcrypt2.0/libtrfcrypt.so

set key "Hello, Trf World."
set s "aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffff"
set iv "\x00\x00\x00\x00\x00\x00\x00\x01"

puts "****** checking IDEA -mode ecb *******"
set a1 [idea -dir encrypt -mode ecb -key $key $s]
puts "------ encode ------"
puts [hex -mode e $a1]
set a2 [idea -dir decrypt -mode ecb -key $key $a1]
puts "------ decode ------"
puts $a2

puts "****** checking IDEA -mode cbc *******"
set a1 [idea -dir encrypt -mode cbc -key $key -iv $iv $s]
puts "------ encode ------"
puts [hex -mode e $a1]
set a2 [idea -dir decrypt -mode cbc -key $key -iv $iv $a1]
puts "------ decode ------"
puts $a2
    
puts "****** checking IDEA -mode cfb *******"
set a1 [idea -dir encrypt -mode cfb -key $key -iv $iv -shift 1 $s]
puts "------ encode ------"
puts [hex -mode e $a1]
set a2 [idea -dir decrypt -mode cfb -key $key -iv $iv -shift 1 $a1]
puts "------ decode ------"
puts $a2

puts "****** checking IDEA -mode ofb *******"
set a1 [idea -dir encrypt -mode ofb -key $key -iv $iv -shift 1 $s]
puts "------ encode ------"
puts [hex -mode e $a1]
set a2 [idea -dir decrypt -mode ofb -key $key -iv $iv -shift 1 $a1]
puts "------ decode ------"
puts $a2

IDEAのコマンド名は「idea」で、暗号化するときは「-direction encrypt」 復号化するときは「-direction decrypt」と指定します (-directionは-dirと省略できます)。 入力文字列は最後の引数として指定しますが、 その長さ(バイト数)は必ず8の倍数でなければならない点に注意してください。 -key オプションの引数は暗号化・復号化キーで、 IDEAの場合は16バイト必要です (16バイトに満たないとエラーになりますが、 それ以上あっても余るぶんにはエラーになりません)。
残る-mode、-iv、-shiftですが、まずお題目として読み上げますね。 それぞれブロック暗号化の際のブロック方法を表すモード、 初期化ファクターを表す8バイトの文字列、 フィードバックレジスタのシフトバイト数を指定します。 ですが、ありていにいって、私には何が何だかさっぱりわかりません。 暗号化に詳しい方はいいとして、そうでなければ、
  • -modeにはecb、cbc、cfb、ofbの4種類がある
  • -modeがecb以外のとき、-ivオプションで8バイトの文字列を指定する必要がある
  • -modeがcfbまたはofbの場合、-shiftオプションでシフトバイト数を適当に (1とか)を指定する必要がある
とだけ覚えておきましょう(しょうがないんだもん)


Blowfish

load /usr/local/lib/Trf2.0/libtrf.so
load /usr/local/lib/Trfcrypt2.0/libtrfcrypt.so

set key "Hello, This is Blowfish."
set s "aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffff"
set iv "\x00\x00\x00\x00\x00\x00\x00\x01"

puts "****** checking BLOWFISH -mode ecb *******"
set a1 [blowfish -dir encrypt -mode ecb -key $key $s]
puts "------ encode ------"
puts [hex -mode e $a1]
set a2 [blowfish -dir decrypt -mode ecb -key $key $a1]
puts "------ decode ------"
puts $a2

# 他のモードは略ということで

Blowfishのコマンド名は「blowfish」です。 使い方はIDEAとほとんど同じです。 キーの長さを1〜56バイトの間で自由に指定できる点だけでしょうか。


SAFER

load /usr/local/lib/Trf2.0/libtrf.so
load /usr/local/lib/Trfcrypt2.0/libtrfcrypt.so

set key "safer key."
set s "aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffff"
set iv "\x00\x00\x00\x00\x00\x00\x00\x01"

puts "****** checking SAFER -mode ecb *******"
set a1 [safer -dir encrypt -mode ecb -key $key $s]
puts "------ encode ------"
puts [hex -mode e $a1]
set a2 [safer -dir decrypt -mode ecb -key $key $a1]
puts "------ decode ------"
puts $a2

SAFER (Secure And Fast Encryption Routine) のコマンド名は「safer」 です。SAFERも、使い方は IDEA、Blowfishとほとんど同じです。 キーの長さは8〜16バイトで自由に指定できます。


RC4

load /usr/local/lib/Trf2.0/libtrf.so
load /usr/local/lib/Trfcrypt2.0/libtrfcrypt.so

set key "rc4rc4"
set s "example input text of encryption algorithm 'RC4'."

puts "****** checking RC4  *******"
set a1 [rc4 -dir encrypt -key $key $s]
puts "------ encode ------"
puts [hex -mode e $a1]
set a2 [rc4 -dir decrypt -key $key $a1]
puts "------ decode ------"
puts $a2

RC4のコマンド名は「rc4」です。RC4の場合は、-mode、-iv、-shift はありません。指定するのは暗号化・復号化の別、暗号化キー、入力文字列だけです。 入力文字列の長さにも、8の倍数といった制限はありません。 キーの長さも1〜256バイトの間で好きな文字列が指定できます。


ROT

load /usr/local/lib/Trf2.0/libtrf.so
load /usr/local/lib/Trfcrypt2.0/libtrfcrypt.so

set s "example input text for encryption algorithm 'ROT'."
puts "****** checking ROT *******"
puts [hex -mode e $s]
set a1 [rot -dir encrypt -key "U" $s]
puts "------ encode ------"
puts [hex -mode e $a1]
set a2 [rot -dir decrypt -key "U" $a1]
puts "------ decode ------"
puts [hex -mode e $a2]
puts "$a2 "

シーザー暗号の名前で知られる古典的な暗号化アルゴリズムであるROTのコマンド名は 「rot」です。 これもRC4と同様、指定が必要なのは 暗号化復号化の別、キー、入力文字列だけです。 キーは1文字で、入力文字列には文字列長などの制約はありません。

 最後になって今更ですが、どの暗号化アルゴリズムが優れている、 あるいは速い、等の比較については、 私は全く門の外の漢(をとこ)でありまして、正直なんともいえません。 Trfcryptも、半分はルーチンのコレクション、という趣も感じられるわけで、 暗号化技術そのものの専門家でない限り、 「こんな場合にはこのアルゴリズムを使おう!」 という判断はできない、というか不要なのでは、とも思います。 私?IDEAという名前が好きなので、IDEAを使います (こらー!)

拡張レビュー分室 top
(first uploaded 2000/09/17 last updated (not ever), MISUMI URANO - KENICHI USHIRODANI)