[ Home ]
[ 更新情報 | 日記 | 掲示板 | 著書 | お祈り | 心の健康 | フィードバック | メール | CatLink ]
[ 豊かな人生のための四つの法則 ]

CipherSaber / サイファセイバー

自分で作る暗号プログラム
― あなたのプライバシーを守るために ―

結城浩


CipherSaber

Writing your own strong encryption program

Hiroshi Yuki <hyuki@hyuki.com>

目次



このページをお読みになる方へ


暗号を使うことについて

「私は何も悪いことをしていないから、暗号プログラムなんていらない」

と思っている人は多くいます。 裏返して言えば「暗号プログラムは悪いことをしている人が使うものだ」と思っているのです。 でも、本当にそうなのでしょうか。

夜眠るときや旅行に行くときに家の玄関に鍵を掛けない人はどれだけいますか? キーをさしたままにして車を放置する人は何人いるでしょうか? すべての手紙を封筒にいれず、ハガキで出す人はいますか?

現代のコンピュータ社会において、 暗号プログラムは「鍵」や「封筒」のようなものです。 たとえあなたが悪いことをやっていなくても、 プライバシーというものを持っている限り、 「鍵」や「封筒」は必要です。

私たちが「鍵」や「封筒」を使うのが当たり前であるのと同じように、 暗号プログラムを使うのが当たり前である時代が、将来きっと来ます。

暗号プログラムを、 「何かいかがわしいもの」「犯罪に関連したもの」「アングラなもの」 と考えるのは、あまりにも一面的すぎます。 暗号プログラムは私たちに関係のないものではありません。 暗号プログラムについて、私たちは真面目に考える必要があるのです。


重要な注意(無保証と免責)

このページに書かれている内容は合法的なものである、と結城は考えていますが、 もし何か問題点があるとお気づきの方はどうぞお知らせください。 このページについて、結城は誤りのないように注意をはらっておりますが、 何の保証もいたしませんし、いっさいの責任を負いません。 みなさんの責任でご判断ください。


謝辞

このページは結城浩が作成しました。 作成にあたっては、Arnold G. Reinholdの CipherSaber Home Page 内の情報を数多く 参照させていただきました。感謝します。

このページについてのご意見、ご質問、バグのご指摘は大歓迎します。 メールで結城浩 <hyuki@hyuki.com> までお送り下さい。 表題に [cs] という文字列を含めていただけると管理上とても助かります。



CipherSaberとは何か

CipherSaber(サイファセイバー)というのは、 Arnold G. Reinholdによって作られた、非常にシンプルで、かつ強力な暗号プログラムです。 実際、プログラミング言語を学んだ初心者であっても簡単に作成することができます。

暗号プログラムといえばPGPが有名です。 たしかに、PGPは現代の暗号技術がつぎ込まれている強固なプログラムであり、 しかもソースコードすら入手できます。 しかし、いかんせんPGPは複雑すぎます。 あなたがPGPをゼロから作ることは不可能でしょう。

しかし、暗号の基本的な部分は(強力な暗号であっても)実はとても単純なものなのです。 さまざまな事情により、あなたがPGPを入手できない状態であっても、 あなたは自分の手持ちのプログラミング言語を使って 強力な暗号プログラムを作ることができます。 自分の手で暗号プログラムを作って自分のプライベートな情報を守ったり、 親しい人との電子的な通信が第三者から盗み読みされたりしないようにすることができるのです。 CipherSaberは、そのような目的にぴったりの暗号プログラムです。

ここまで読んできて 「よし、じゃあCipherSaberのホームページにいってソフトをダウンロードしてくればいいんだな」 と思った方はいますか? 残念ながらそれはCipherSaberの精神をまだ理解していない証拠です。 CipherSaberは、どこかのホームページからダウンロードした暗号ソフトをあなたが使う、 という類のものではありません。 あなた自身がCipherSaberという名前のソフトを作るのです。

このページには、CipherSaberを作るために必要な情報が書かれています。 あなた自身のプライバシーを守るために、 あなた自身の手で強力な暗号プログラムを作れるということをご理解ください。



CipherSaberの暗号化/復号化の概要

  1. CipherSaberで使われている暗号アルゴリズムはRC4です。
  2. RC4は、Bruce Schneier の "Applied Cryptography" 第2版 (ISBN 0-471-11709-9, John Wiley & Sons, New York, 1996) の 第17章に記述されています。
  3. 暗号化されたファイルは10バイトの初期化ベクタの後に暗号文を連結したものです。
  4. 暗号化が行われるたびごとに初期化ベクタは異なる値(乱数)になる必要があります。
  5. 暗号化のキーはユーザのパスワード(ASCII文字列)の後に初期化ベクタを連結させたものになります。
もしもあなたが暗号プログラムについて詳しいプログラマなら、 これだけでもCipherSaberを作ることができます。


詳細:CipherSaberの暗号化


暗号化の手順

CipherSaberの暗号化の手順は次のようになります。
  1. パスワード (password)
  2. ユーザから暗号化のためのパスワードを得ます。 パスワードはASCIIコードのバイト列で、最大246バイトでなければなりません。 C言語の文字列の最後を表す '\0' はパスワードに含まれません。 (CipherSaberの作者は、パスワードの長さを54バイト以下にすることを推奨しています。 これは初期化ベクタとパスワードをよく混ぜるためだそうです)
  3. 初期化ベクタ (initialization vector)
  4. 初期化ベクタを生成します。 これはプログラミング言語の擬似乱数を用い、 0〜255の範囲の10バイト長の乱数列です。
  5. RC4の鍵 (RC4 key)
  6. ユーザから得たパスワードと初期化ベクタをバイト列として連結します。 この連結したバイト列をRC4の鍵とします。 したがって、RC4の鍵の長さは10〜256バイトになります。
  7. 平文 (plain text)
  8. 暗号化する前の入力ファイルの内容を平文(ひらぶん)と呼びます。 平文をメモリ上に読み込みます。
  9. 暗号文 (cipher text)
  10. RC4の鍵を使って、RC4アルゴリズムにより、平文を暗号化します。 その結果を暗号文とします。
  11. 出力ファイル (output file)
  12. 初期化ベクタと暗号文を連結し、ファイルに書き出します。 これが出力ファイルとなります。 出力ファイルの長さは入力ファイルの長さよりもきっかり10バイト長くなります。
  13. 完了
  14. 以上がCipherSaberの暗号化です。 簡単でしょう?

暗号化の手順の図式

以下に暗号化の手順を示します。
      USER
        |
        V
    +--------+
    |password|  RANDOM
    +--------+    |
                  V
             +-----------+
             |init vector|
             +-----------+       INPUT FILE
             |<-10bytes->|            |
                                      V
                         +---------------------------+
                         |plain text                 |
                         +---------------------------+
                                      |
    +--------+-----------+            |
    |password|init vector|            |
    +--------+-----------+            |
    |<-- RC4 key ------->|            |
             |                        V
             +---------------> [RC4 encryption]
                                      |
                                      V
                         +---------------------------+
                         |cipher text                |
                         +---------------------------+
                                      |
                                      V
             +-----------+---------------------------+
             |init vector|cipher text                |
             +-----------+---------------------------+
             |<-- This is the CipherSaber file ----->|
                                |
                                V
                            OUTPUT FILE




詳細:CipherSaberの復号化


復号化の手順

CipherSaberの復号化の手順は次のようになります。 暗号化の逆の手順になります。
  1. パスワード (password)
  2. ユーザから復号化のためのパスワードを得ます。 暗号化のときと同じパスワードでなければ正しく復号できません。
  3. 初期化ベクタ (initialization vector)
  4. 入力ファイルのはじめの10バイトを読み、初期化ベクタを得ます。
  5. RC4の鍵 (RC4 key)
  6. ユーザから得たパスワードと初期化ベクタをバイト列として連結します。 この連結したバイト列をRC4の鍵とします。
  7. 暗号文 (cipher text)
  8. 入力ファイルの残り(初期化ベクタを読んだ残り)を暗号文とします。
  9. 復号化 (decryption)
  10. RC4の鍵を使って、RC4アルゴリズムにより、暗号文を復号化します。 その結果は(パスワードが正しければ)平文となります。 RC4アルゴリズムでは暗号化と復号化はまったく同じ計算になります。
  11. 平文 (plain text)
  12. 復号化した後の内容を平文(ひらぶん)と呼びます。
  13. 出力ファイル (output file)
  14. 平文をファイルに書き出します。 これが出力ファイルとなります。 出力ファイルの長さは入力ファイルの長さよりもきっかり10バイト短くなります。
  15. 完了
  16. 以上がCipherSaberの復号化です。

復号化の手順の図式

以下に復号化の手順を示します。
                            INPUT FILE
                                |
                                V
             |<-- This is the CipherSaber file ----->|
             +-----------+---------------------------+
             |init vector|cipher text                |
             +-----------+---------------------------+
      USER        |                   |
        |         |                   |
        V         |                   |
    +--------+    |                   |
    |password|    |                   |
    +--------+    |                   |
                  V                   |
             +-----------+            |
             |init vector|            |
             +-----------+            |
             |<-10bytes->|            |
                                      V
                         +---------------------------+
                         |cipher text                |
                         +---------------------------+
                                      |
    +--------+-----------+            |
    |password|init vector|            |
    +--------+-----------+            |
    |<-- RC4 key ------->|            |
             |                        V
             +---------------> [RC4 decryption (same as encryption)]
                                      |
                                      V
                         +---------------------------+
                         |plain text                 |
                         +---------------------------+
                                      |
                                      V
                                  OUTPUT FILE


詳細:留意点


初期化ベクタの意味

初期化ベクタが乱数であるため、同じパスワード、
同じ平文であっても出力ファイルの内容はまったく異なります。
これで暗号文の解読は困難になります。

初期化ベクタは毎回異なる乱数列にしなければなりません。
乱数の種として時刻、プロセスID、ユーザのキー入力のタイミングなどを使うのがよいでしょう。

ヘッダがない

CipherSaberのファイルには「ヘッダ」のような付加情報はまったくありません。
初期化ベクタも擬似乱数なので、CipherSaberのファイル全体は
一見ただの乱数列のように見えます。

ヘッダがありませんので、
復号化のとき、ユーザに「あなたの入力されたパスワードは誤っています」
といった警告メッセージを出すことはできません。

バイナリモード

CipherSaberのプログラムはファイルを「バイナリモード」で取り扱う必要があります。
いわゆる「テキストモード」で取り扱ってはいけません。
CipherSaberのファイルをFTPなどで送受信する場合も、
必ずバイナリモードでなければなりません。

ファイル形式を「改良」しようと思わないこと

CipherSaberのよさは、シンプルさ・暗号の強固さ・データファイルの互換性にあります。
ですから、ユーザインタフェースなどの改良をするのはかまいませんが、
ファイル形式を変えてはいけません。
少なくともCipherSaberという名前をつけた場合には、
ここで述べているファイル形式を守ってください。

RC4 について (必ずお読み下さい)



ダウンロード


C言語で書かれたCipherSaberのソースコード

CipherSaberは、自分で作る暗号プログラムですが、 読者の便宜をはかるため、結城が書いたCipherSaberのソースコードを 以下からダウンロードできるようにしました。 ただし、暗号アルゴリズムであるRC4の部分はこのソースコードに含まれていません。 ソースコード中のrc4_init()とrc4_cipher()という 二つの関数をあなたが書いてください。 なお、RC4が正しく実装されているかどうかは自動的に判断されます。

Microsoft Visual C++ でコンパイルし、Windows95 で動作確認しました。 DOS プロンプトで、

cl cs1.c

とすればコンパイルできます。


検証用のテストデータ

このZipファイルをWinZipで展開すると、 44バイトのファイル simple.cs が入手できます。 これをパスワード "CipherSaber" (引用符は含まない)で復号化すると、 Write your own encryption program. という文章の入った34バイトのテキストファイルになります。

以下は、simple.csの内容です。

33 3D 48 6C 38 63 49 60 04 4C 1B FE 6F 0B 3C 7B
2D 44 86 59 B0 79 19 AB 8E C1 40 FD 8F A5 F6 EC
06 59 E3 1E 5D DD 82 23 DF FD 4A 56

CipherSaber Home Pageにもダウンロード可能なテストデータがあります。 「あなたが 'CipherKnight' であることの証明書」 というちょっとかっこいいGIFファイルもありますよ。



リンク


CipherSaber関連ページ


結城浩のプライバシー関連ページ



Legal Notices

RC4 is a trademark of the RSA Division of Security Dynamics.

CipherSaber, CS1, CS2, and CipherKnight are trademarks of Arnold G. Reinhold. A free, nonexclusive license is hereby granted to use the marks CipherSaber, CS1 and CS2 on any product that is interoperable with CipherSaber as demonstrated by the ability to decrypt the test samples supplied and to produce files readable by other implementations of CipherSaber. The marks may also be used in supporting material that promotes CipherSaber.



更新履歴


リンクはご自由に。 フィードバックはお気軽に。
Copyright (C) 1999 by Hiroshi Yuki.
All rights reserved.
結城浩 <hyuki@hyuki.com>
http://www.hyuki.com/
http://www.hyuki.com/cs/