BDES(1)

名称
bdes - Data Encryption Standard による暗号化 / 復号化

書式
bdes [-abdp] [-F N] [-f N] [-k key] [-m N] [-o N] [-v vector]

解説
bdes は で規定されるすべての DES モード処理を実装しています。 新しい暗号化フィードバックモード (alternative cipher feedback mode (CFB)) と両方の認証モードも含まれます。 bdes は標準入力を読んで標準出力へ書き出します。 オプションを指定しなければ、 入力は暗号化ブロック連鎖モード (cipher block chaining mode (CBC)) で 暗号化されます。 暗号化と復号化に同一の鍵を使うことで平文を復元します。

電子暗号表モード (electronic code book mode (ECB)) 以外のすべてのモードは 初期化ベクトル (initialization vector) を必要とし、 指定されない場合はゼロベクトルが使われます。 コマンドラインに key (鍵) を指定しない場合は、対話的に入力を求めます (詳しくは getpass(3) を参照して下さい)。

オプションは次の通りです:

-a  鍵と初期化ベクトル文字列は ASCII 文字列として扱われ、 “0X”, “0x”, “0B”, “0b” ではじまる文字列に対する特別の変換はされません。 このフラグは、鍵と初期化ベクトルの 両方 に作用します。

-b  電子暗号表モード (ECB) で動作します。

-d  入力を復号化します。

-F N
    N ビット の新しい暗号化フィードバックモード (CFB) で動作します。 現状では N は 7 以上 56 以下の 7 の倍数であることが必要です (この制限は新しい暗号化フィードバックモード (CFB) の仕様には 適合しません)。

-f N
    N ビット の暗号化フィードバックモード (CFB) で動作します。 現状では N は 8 以上 64 以下の 8 の倍数であることが必要です (この制限は標準の暗号化フィードバックモード (CFB) の仕様には適合しません)。

-k key
    key を暗号化方式の鍵とします。

-m N
    入力を N ビットのメッセージ認証コード (message authentication code (MAC)) で処理します。 N は 1 以上 64 以下であることが必要です。 N が 8 の倍数でないとき、 MAC のビット長が 8 の倍数になるまで 0 のビットが付け加えられます。 出力は必ず MAC になります。 MAC は暗号化ブロック連鎖モード (CBC) あるいは 暗号化フィードバックモード (CFB) でのみ有効です。

-o N
    N ビット の出力フィードバックモード (output feedback mode (OFB)) で動作します。 現状では N は 8 以上 64 以下の 8 の倍数であることが必要です (この制限は OFB モードの仕様には適合しません)。

-p  パリティビットのリセットをしません。 このフラグにより鍵のパリティビットは入力された通りに解釈され、 それぞれの文字を奇数パリティに直すことはしません。 鍵が ASCII 文字列の場合にのみ使用されます。

-v vector
    初期化ベクトルとして vector を使用します。 vector は鍵と同じ方式で解釈されます。 vector は電子暗号表モード (ECB) では無効です。

鍵と初期化ベクトルは ASCII 文字列として与えられ、 そのままのビット並びとして扱われます。 “0X” あるいは “0x” ではじまっている場合、ビット並びを表す 16 進数値 として扱われます。 “0B” あるいは “0b” ではじまっている場合は、ビット並びを表す 2 進数値 として扱われます。 どちらの場合でも、 最初の 64 ビットまでが鍵あるいは初期化ベクトルとして使われ、 64 ビットに満たない場合は 64 ビットになるまで 0 のビットが追加されます。

DES 標準に従い、鍵文字列の各文字の最下位ビットは削られます。 ほとんどの ASCII 文字の最上位ビットは 0 なので、 単純に下位ビットを削ると、 有効な鍵空間の大きさは 2^56 個から 2^48 個まで縮小します。 これを防ぐため、 最上位ビットは最下位ビットに部分的に依存する関数であることが必要です。 例えば、最上位ビットは奇数パリティを満たすような値になるように 設定されるようにする方法があります。 これで鍵空間の大きさが保持されます。 このパリティビットの再設定は、鍵が 2 進数あるいは 16 進数で 与えられた場合には 行なわれません。 さらに、 ASCII の鍵であっても再設定しないようにできることを注意しておきます。

DES は非常に強固な暗号法とされており、 table lookup attacks, key search attacks, および Hellman's time-memory tradeoff (これらはすべてたいへんな手間と時間を要します) を除けば、 公の文献に関する限り DES を突破する解析法は知られていません。 鍵の選択と鍵そのものの保安が bdes の信頼性を決定するものと信じて間違いありません。

実装に関する注
このプログラムと互換性のあるソフトウェアを実装したい人は、 以下の点に注意してください。 このソフトウェアは Sun Microsystems, Inc. が公開している data encryption standard の実装と互換であるものとされています。

電子暗号表 (ECB) モードおよび暗号化ブロック連鎖 (CBC) モードでは、 平文が 64 ビット (8 バイト = 1 ブロック) 単位で暗号化されます。 平文のファイルが正しく暗号化されることを保証するために、 bdes は (内部動作として) 1 から 8 バイトを追加し、 そのうちの最後のバイトは、最後のブロックが平文のファイルからの入力として 何バイトを読み込んで暗号化したかを示します。 したがって、復号化のときには最後のブロックは 0 から 7 文字までの 平文データと、末尾のバイトとしてその文字数を含みます。 復号化の際にファイルの最後のバイトが 0 から 7 までの間の整数でなかった場合、 ファイルが破壊されているか間違った鍵が指定されたかのどちらかであることに 注意してください。 同様の機構が OFB と CFB のモードでも利用されていますが、 それらでは入力の長さがモードサイズの倍数であることが必要なだけで、 最後のバイトは、0 か、モードサイズとして使われるバイト数から 1 を減じた数値になります。 (これはモードサイズが 8 の倍数であることが必要な理由の一つです。)

Sun の実装と異なり、最後のブロック内の利用されないバイトは不定ではなく、 一つ前のブロックの対応するバイトと同じになります。 これにより、暗号化の強度を損なうことなく、処理速度と移植性を改善しています。

鍵が ASCII 文字列で入力された場合、 鍵の各文字のパリティビットは奇数パリティとなるように設定されます。 Sun の実装と異なり、 2 進あるいは 16 進の鍵もコマンドラインで指定できますが、 その場合、パリティビットが再設定されることは ありません 。 これにより任意のビットパターンを鍵として試すことができます。

Sun の実装では常に初期化ベクトルを 0 (全部 0) としています。 bdes でも既定動作は同様ですが、コマンドラインから指定して変更できます。

関連項目
crypt(3), getpass(3) Data Encryption Standard, Federal Information Processing Standard #46, National Bureau of Standards, U.S. Department of Commerce, Washington DC, January 1977. DES Modes of Operation, Federal Information Processing Standard #81, National Bureau of Standards, U.S. Department of Commerce, Washington DC, December 1980. Dorothy Denning, Cryptography and Data Security, Addison-Wesley Publishing Co., Reading, MA, 1982. Matt Bishop, Implementation Notes on bdes(1), Technical Report PCS-TR-91-158, Department of Mathematics and Computer Science, Dartmouth College, Hanover, NH 03755, April 1991.

免責条項

    THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

バグ
DES が今後の数年間も安全であるかどうかについて激しい論争がありました。 専用ハードウェアの出現により前述の各種攻撃方法の費用が低減されることは あり得るので、 これらの攻撃方法が計算量の点から非現実的とはもはや言えません。

鍵あるいは鍵の一覧がメモリに納められるので、 メモリを読み出せる場合は暗号化の安全性が損なわれる可能性があります。 さらに、 コマンドラインで鍵や初期化ベクトルを指定したときには、 プログラムの引数を表示するプログラムによって傍受される可能性もあります。 これを回避するために bdes は引数を上書きしますが、 残念ながら、これらが競合することは明らかで、現状では回避できません。

ある種の鍵は潜在的な危険を持ち込むことになるので、 使用を避けるべきです。 これらの鍵は、 弱い鍵 (weak key) と やや弱い鍵 (semiweak key) と呼ばれており、以下のものです (16 進数表記で p を 0 あるいは 1 とし、 P を ‘e’ あるいは ‘f’ とする) :
0x0p0p0p0p0p0p0p0p | 0x0p1P0p1P0p0P0p0P
0x0pep0pep0pfp0pfp | 0x0pfP0pfP0pfP0pfP
0x1P0p1P0p0P0p0P0p | 0x1P1P1P1P0P0P0P0P
0x1Pep1Pep0Pfp0Pfp | 0x1PfP1PfP0PfP0PfP
0xep0pep0pfp0pfp0p | 0xep1Pep1pfp0Pfp0P
0xepepepepepepepep | 0xepfPepfPfpfPfpfP
0xfP0pfP0pfP0pfP0p | 0xfP1PfP1PfP0PfP0P
0xfPepfPepfPepfPep | 0xfPfPfPfPfPfPfPfP

これは DES アルゴリズムに固有の性質です ( Moore, Simmons, Cycle structure of the DES with weak and semi-weak keys, Advances in Cryptology - Crypto '86 Proceedings, Springer-Verlag New York, 1987, pp. 9-32. を参照)。