.\" FreeSec: libcrypt for NetBSD .\" .\" Copyright (c) 1994 David Burren .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 4. Neither the name of the author nor the names of other contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. .\" .\" %Id: crypt.3,v 1.6 1997/02/22 14:40:30 peter Exp % .\" .\" Manual page, using -mandoc macros .\" .Dd March 9, 1994 .Dt CRYPT 3 .Os .Sh 名称 .Nm crypt , .Nm setkey , .Nm encrypt , .Nm des_setkey , .Nm des_cipher .Nd DES 暗号化 .Sh 書式 .Fd #include .Ft char * .Fn crypt "const char *key" "const char *setting" .Ft int .Fn setkey "const char *key" .Ft int .Fn encrypt "char *block" "int flag" .Ft int .Fn des_setkey "const char *key" .Ft int .Fn des_cipher "const char *in" "char *out" "long salt" "int count" .Sh 解説 .Fn crypt 関数は、パスワードの暗号化を行います。これは .Tn NBS データ暗号化規格 (NBS Data Encryption Standard) に由来するものです。キー検索の試みを 防止するために、その他のコードが追加されています。 .Nm crypt の最初の引数は .Dv NUL で終了するストリングです ( 通常は、ユーザが入力したパスワード ) 。 2 番めの 引数は、長さが 9 バイトのキャラクタ配列であり、アンダースコア (``_'') に、 4 バイトの反復カウントと 4 バイトの salt が続いたもので構成されます。反復 .Fa count と .Fa salt の両方が、キャラクタ当たり 6 ビットでエンコードされます。 最下位ビットが最初です。それぞれ 0 から 63 の値が、 ``./0-9A- Za-z'' キャラクタによってエンコードされます。 .Pp .Fa salt を使用して、 16777216 個の可能な方法の 1 つで、 .Tn DES アルゴリズム内に 無秩序を引き起こします ( 特に、 .Ar salt のビット .Em i が設定されており、 .Em i ビットと .Em i+24 ビットが .Tn DES "E" ボックス出力でスワップされる場合です ) 。 .Ar key は 8 キャラクタのグループに分けられ ( 最後の短いグループは NULL でパッドされます ) 、各キャラクタの下位の 7 ビット ( グループごとに 56 個 ) が、以降のように DES キーを形成するのに使用されます。 56 ビットの最初のグループが、初期 DES キーになります。その他の各グループについては、グループビットおよび DES キー自体の暗号化の排他的論理和 (XOR) が次の DES キーになります。最後に、 最終的な DES キーが使用されて 64 ビット定数の .Ar count 累積暗号化が 実行されます。返される値は、 .Dv NUL で終了するストリングで、長さは 20 バイト、 .Ar setting にエンコードされた 64 ビットの暗号化が続いたもので構成されます。 .Pp .Xr crypt 3 の過去のバージョンとの互換性のために、 .Ar setting は、上記のように エンコードされた 2 バイトの salt で構成できます。この場合、反復 .Ar count 25 が 使用され、摂動の少ない .Tn DES が利用でき、最長 8 キャラクタの .Ar key が 使用されます。返される値は .Dv NUL で終了する長さが 13 バイトのストリング です。 .Pp 関数 .Fn encrypt 、 .Fn setkey 、 .Fn des_setkey 、および .Fn des_cipher では、 .Tn DES アルゴリズムに、制限されたアクセスができます。 .Fn setkey へのキー .Ar key 引数は、 64 キャラクタのバイナリ値 ( 数字の 0 または 1) の配列です。 56 ビットの キーはこの配列から導出されます。そのためには、配列を 8 つのグループに 分割し、各グループ内の最後のビットを無視します。 .Pp .Fn encrypt の引数 .Fa block も、バイナリ値の 64 キャラクタ配列です。 .Fa flag の値が 0 の場合、引数 .Fa block は暗号化されます。そうでない場合は、 暗号解除されます。暗号化または暗号解除は、それを処理するために .Fn setkey が 指定したキーを使用した後、オリジナルの配列 .Fa block 内に返されます。 .Pp .Fn des_setkey 関数と .Fn des_cipher 関数は高速ですが、 .Fn setkey および .Fn encrypt より移植性は劣ります。 .Fn des_setkey への引数は、長さが 8 の キャラクタ配列です。各キャラクタの .Em 最下位 ビットは無視され、各キャラクタの 次の 7 ビットが連結されて 56 ビットのキーを生成します。関数 .Fn des_cipher は、 .Tn DES の .Fa count 反復の .Xr abs 3 を使用して .Fa in で 8 キャラクタ内に保存された 64 ビットを暗号化 ( または .Fa count が負の場合は暗号解除 ) し、 64 ビットの結果を 8 キャラクタで .Fa out に保存します。 .Fa salt は、前記のように .Tn DES の摂動を 指定します。 .Pp 関数 .Fn crypt は、処理が成功した場合は暗号化された値を指すポインタを返し、 処理が失敗した場合は NULL を返します。関数 .Fn setkey 、 .Fn encrypt 、 .Fn des_setkey 、および .Fn des_cipher は、処理が成功した場合は 0 を返し、処理が 失敗した場合は 1 を返します。歴史的には、関数 .Fn setkey と .Fn encrypt はどのような値も返しませんでした。これらの関数が戻り値を指定されたのは、 主にハードウェアサポートが備わっているものの使用はできない場合、または 通常の方針の愚かさのために DES が利用できない場合に、システムを 区別するためです。 .Pp .Fn crypt を使用するには、 .Nm libcrypt ライブラリとのリンクが必要です。 .Fn setkey 、 .Fn encrypt 、 .Fn des_setkey 、および .Fn des_cipher は、 .Nm libcipher ライブラリ内に 見つかります。 ( 標準の C ライブラリ、 .Nm libc にはこれらのルーチンへのかけらしか 入っていません ) 。 .Sh 関連項目 .Xr login 1 , .Xr passwd 1 , .Xr getpass 3 , .Xr passwd 5 .Rs .%T "Mathematical Cryptology for Computer Scientists and Mathematicians" .%A Wayne Patterson .%D 1987 .%N ISBN 0-8476-7438-X .Re .Rs .%T "Password Security: A Case History" .%A R. Morris .%A Ken Thompson .%J "Communications of the ACM" .%V vol. 22 .%P pp. 594-597 .%D Nov. 1979 .Re .Rs .%T "DES will be Totally Insecure within Ten Years" .%A M.E. Hellman .%J "IEEE Spectrum" .%V vol. 16 .%P pp. 32-39 .%D July 1979 .Re .Sh 歴史 ローターを採用した .Fn crypt 関数は、 .At v6 で現れました。現在の スタイルの .Fn crypt は、最初に .At v7 に現れました。 .Sh バグ .Fn des_setkey への引数の各キャラクタの .Em 最下位 ビットを 落とすのはとんでもないことです。 .Pp .Fn crypt 関数は、結果を内部の静的オブジェクトに残し、そのオブジェクトを指す ポインタを返します。後で .Fn crypt を呼び出すと、同じオブジェクトが 修正されます。