スポンサーリンク

CRYPT(3) FreeBSD ライブラリ関数マニュアル CRYPT(3)

名称

crypt − トラップドア暗号化

ライブラリ

暗号ライブラリ (libcrypt, −lcrypt)

書式

#include <unistd.h>

char *

crypt(const char *key, const char *salt);

const char *

crypt_get_format(void);

int

crypt_set_format(const char *string);

解説

crypt() 関数は、パスワードのハッシュ化を行ない、キー検索の試みを思いとど まらせるためのコードを付加します。ハッシュ化には異なるアルゴリズムを使用 することができます。現在含まれるアルゴリズムは、 NBS Data Encryption Standard (DES), MD5, Blowfish です。 DES や Blowfish がインストールされて いるかどうか、また、デフォルトを変更するために crypt_set_format() がすで に呼び出されているかどうかにより、使用されるアルゴリズムは salt (モジュー ル化暗号フォーマット (Modular Crypt Format (MCF)) に従います) のフォー マットに依存します。

crypt の最初の引数はハッシュ化のためのデータ (通常はパスワードです) で、 ヌル文字で終了する文字列です。 2 番めの引数は salt で、次の 3 個のうちの いずれかの形式です。

             Extended

アンダスコア (‘‘_’’) で始まる場合、鍵の解釈も salt の 解釈もともに、次に概要を説明する DES 拡張形式を使用し ます。
Modular
文字列 ‘‘$digit$’’ で始まる場合、次に概要を説明するモ ジュール化暗号フォーマット (MCF) を使用します。
Traditional
上のいずれにも該当しない場合、伝統的なフォーマット (Traditional Format) を想定し、文字列全体 (または最初 の部分) を salt として使用します。

どのルーチンも計算に時間が掛かる設計になっています。 Pentium 166/MMX で簡 単なテストをすると、 DES 暗号化では、1 CPU 秒当たり暗号化を約 2640 回行な い、 MD5 暗号化では、1 CPU 秒当たり暗号化を約 62 回行ないました。

DES 拡張形式:

key は 8 文字からなるグループに分割されます (最後のグループにはナルバ イトが詰められます)。各キャラクタの下位 7 ビット (グループごとに 56 ビッ ト) が、次に説明するようにして、 DES キーを作るために用いられます。最初の グループの 56 ビットは、 DES 鍵の初期値です。その後のグループごとに、現在 の DES 鍵それ自身とそのグループのビットを XOR することで暗号化し、次の DES 鍵とします。

salt は 9 キャラクタの配列であり、アンダスコアの後ろに 4 バイトの反復回数 と 4 バイトの salt からなります。これらは印字可能文字でエンコードされま す。 6 ビットごとに 1 文字を対応させ、最下位キャラクタを最初にして、エン コードされます。 0 から 63 までの値は ‘‘./0-9A-Za-z’’ としてエンコードさ れます。これにより countsalt のそれぞれに 24 ビットを使うことができま す。

salt は DES アルゴリズムに対し、16777216 通りまたは 4096 通り (つまり、24 ビットまたは 12 ビット) 中の 1 通りという不規則性を導入します ( salt の ビット i が設定されている場合、 DES E-Box 出力中のビット i とビット i+24 とが交換されます) 。

DES 鍵を使い、64ビットの定数に count 回 DES を繰り返し適用し暗号化しま す。返される値は、 ヌル文字で終了する文字列で、長さは 20 バイトまたは 13 バイト (にヌル文字が加わります) で、 salt の後に、エンコードされた 64 ビットの暗号化を続いたもので構成されます。

モジュール化暗号:

salt が文字列 $digit$ から始まる場合は、モジュール化暗号フォーマット (MCF) が使用されます。 digit は暗号化の際にどのアルゴリズムが使用されるか を表します。その後ろのトークンが実際の salt として暗号化に用いられます。 salt の長さは 16 キャラクタに制限されています。これは、返す出力の長さも _PASSWORD_LEN で制限されているからです。 salt はヌル文字かドル記号を末尾 に置く必要があります。ドル記号の後ろの文字はなんであれ無視されます。

現在サポートするアルゴリズムは、

1. MD5
2. Blowfish

これ以外の暗号化フォーマットは容易に追加できます。 salt の例として次のも のがあります。

$3$thesalt$rest

Traditional 暗号化:

使用されるアルゴリズムは、 crypt_set_format() がすでに呼び出されているか 否か、グローバルデフォルトフォーマットがすでに指定されているか否かに依存 します。グローバルデフォルトがあらかじめ指定されているか、 crypt_set_format() で何か他のフォーマットを設定されているか、そのどちらで もない場合、組み込みのデフォルトフォーマットが使用されます。現在のとこ ろ、これは、 DES が使えるなら DES に、そうでないなら MD5 になります。

salt をどのように用いるかはハッシュ化のアルゴリズムに依存します。最高の結 果を得るために、少なくとも 2 文字の salt を指定してください。

crypt_get_format() 関数は現在使用しているアルゴリズムを表す定数文字列を返 します。有効な値は、 ‘des’, ‘blf’, ‘md5’ です。

crypt_set_format() 関数は指定する string に従い、デフォルトエンコード フォーマットを設定します。

グローバルデフォルトフォーマットは、 /etc/auth.conf ファイルで、 crypt_default 属性を使い設定することができます。

戻り値

crypt() は、処理が成功した場合、暗号化された値を指すポインタを返します。 処理が失敗した場合、NULL を返します。注意: これは通常の挙動ではありませ ん。 AT&T の crypt() は常に文字列を指すポインタを返します。

crypt_set_format() は、与えられたエンコードフォーマットが正当であれば、1 を返します。それ以外の場合、値 0 が返されます。

関連項目

login(1), passwd(1), auth_getval(3), cipher(3), getpass(3), auth.conf(5), passwd(5)

バグ

crypt() 関数は静的データへのポインタを返します。そして、以後の crypt() の 呼び出しは同じデータを変更します。 crypt_set_format() も同様に静的データ を変更します。

歴史

ローターを採用した crypt() 関数は、 Version 6 AT&T UNIX で登場しました。 現在のスタイルの crypt() は、 Version 7 AT&T UNIX ではじめて登場しまし た。

DES セクションのコード (FreeSec 1.0) は、アメリカ合衆国のみで使える NetBSD libcrypt 暗号化ライブラリに対して、そのような障害のない置き換えと してアメリカ合衆国の外で開発されました。

作者

元は David Burren ⟨davidb@werj.com.au⟩ によって書かれました。その後の追 加、更新は、 Poul-Henning Kamp, Mark R V Murray, Kris Kennaway, Brian Feldman, Paul Herman Niels Provos によって行なわれました。

FreeBSD 10.0 January 19, 1997 FreeBSD 10.0

スポンサーリンク