RFC1320 日本語訳

1320 The MD4 Message-Digest Algorithm. R. Rivest. April 1992. (Format: TXT=32407 bytes) (Obsoletes RFC1186) (Status: INFORMATIONAL)
プログラムでの自動翻訳です。
RFC一覧
英語原文

Network Working Group                                          R. Rivest
Request for Comments: 1320           MIT Laboratory for Computer Science
Obsoletes: RFC 1186                          and RSA Data Security, Inc.
                                                              April 1992

Rivestがコメントのために要求するワーキンググループR.をネットワークでつないでください: 1320年のMITコンピュータサイエンス研究所は以下を時代遅れにします。 RFC1186とRSA Data Security Inc.1992年4月

                    The MD4 Message-Digest Algorithm

MD4メッセージダイジェストアルゴリズム

Status of thie Memo

thie Memoの状態

   This memo provides information for the Internet community.  It does
   not specify an Internet standard.  Distribution of this memo is
   unlimited.

このメモはインターネットコミュニティのための情報を提供します。 それはインターネット標準を指定しません。 このメモの分配は無制限です。

Acknowlegements

Acknowlegements

   We would like to thank Don Coppersmith, Burt Kaliski, Ralph Merkle,
   and Noam Nisan for numerous helpful comments and suggestions.

頻繁な役に立つコメントと提案についてドンCoppersmith、バートKaliski、ラルフMerkle、およびノーム・ニッサンに感謝申し上げます。

Table of Contents

目次

   1. Executive Summary                                                1
   2. Terminology and Notation                                         2
   3. MD4 Algorithm Description                                        2
   4. Summary                                                          6
   References                                                          6
   APPENDIX A - Reference Implementation                               6
   Security Considerations                                            20
   Author's Address                                                   20

1. 要約1 2。 用語と記法2 3。 MD4アルゴリズム記述2 4。 概要6参照6付録A--リファレンスインプリメンテーション6セキュリティ問題20作者のアドレス20

1. Executive Summary

1. 要約

   This document describes the MD4 message-digest algorithm [1]. The
   algorithm takes as input a message of arbitrary length and produces
   as output a 128-bit "fingerprint" or "message digest" of the input.
   It is conjectured that it is computationally infeasible to produce
   two messages having the same message digest, or to produce any
   message having a given prespecified target message digest. The MD4
   algorithm is intended for digital signature applications, where a
   large file must be "compressed" in a secure manner before being
   encrypted with a private (secret) key under a public-key cryptosystem
   such as RSA.

このドキュメントはMD4メッセージダイジェストアルゴリズム[1]を説明します。 アルゴリズムは、任意の長さに関するメッセージを入力するとき取って、入力の128ビットの「指紋」か「メッセージダイジェスト」を出力するとき、作成されます。 同じメッセージダイジェストを持っている2つのメッセージを出すか、または与えられた前指定された目標メッセージダイジェストを持っているどんなメッセージも出すのが計算上実行不可能であると推測されます。 MD4アルゴリズムはデジタル署名アプリケーションのために意図します。そこでは、RSAなどの公開カギ暗号系の下に個人的な(秘密の)キーがある状態でコード化される前に大きいファイルが安全な方法で「圧縮されなければなりません」。

   The MD4 algorithm is designed to be quite fast on 32-bit machines. In
   addition, the MD4 algorithm does not require any large substitution
   tables; the algorithm can be coded quite compactly.

MD4アルゴリズムは、32ビットのマシンでかなり速くなるように設計されています。 さらに、MD4アルゴリズムはどんな大きい代替テーブルも必要としません。 全くコンパクトにアルゴリズムをコード化できます。

Rivest                                                          [Page 1]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[1ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

   The MD4 algorithm is being placed in the public domain for review and
   possible adoption as a standard.

MD4アルゴリズムはレビューと可能な採用のために規格として公共の場に置くことにされます。

   This document replaces the October 1990 RFC 1186 [2].  The main
   difference is that the reference implementation of MD4 in the
   appendix is more portable.

このドキュメントは1990年10月のRFC1186[2]を取り替えます。 主な違いは付録における、MD4の参照実現が、より携帯用であるということです。

   For OSI-based applications, MD4's object identifier is

OSIベースのアプリケーションのために、MD4の物の識別子はそうです。

   md4 OBJECT IDENTIFIER ::=
     {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 4}

md4 OBJECT IDENTIFIER:、:= iso(1)は(2) 米国(840)rsadsi(113549) digestAlgorithm(2)4をメンバーと同じくらい具体化させます。

   In the X.509 type AlgorithmIdentifier [3], the parameters for MD4
   should have type NULL.

X.509タイプAlgorithmIdentifier[3]では、MD4のためのパラメタはタイプNULLを持つべきです。

2. Terminology and Notation

2. 用語と記法

   In this document a "word" is a 32-bit quantity and a "byte" is an
   eight-bit quantity. A sequence of bits can be interpreted in a
   natural manner as a sequence of bytes, where each consecutive group
   of eight bits is interpreted as a byte with the high-order (most
   significant) bit of each byte listed first. Similarly, a sequence of
   bytes can be interpreted as a sequence of 32-bit words, where each
   consecutive group of four bytes is interpreted as a word with the
   low-order (least significant) byte given first.

本書では「単語」は32ビットの量です、そして、1「バイト」が8ビットの量です。 自然な態度でバイトの系列としてビットの系列を解釈できます、それぞれのバイトの高位(最も重要)のビットがある1バイトが最初に記載したように8ビットのそれぞれの連続したグループが解釈されるところで。 同様に、32ビットの単語の続きとしてバイトの系列を解釈できます。(そこでは、1番目を考えて、4バイトのそれぞれの連続したグループが下位(最も重要でない)のバイトがある単語として解釈されます)。

   Let x_i denote "x sub i". If the subscript is an expression, we
   surround it in braces, as in x_{i+1}. Similarly, we use ^ for
   superscripts (exponentiation), so that x^i denotes x to the i-th
   power.

「x潜水艦i」を指示させてください。 添字が表現であるなら、私たちはx_i+1のように支柱でそれを囲みます。 同様に、私たちが上付き文字(羃法)のための^、x^私がxを指示するそうを使用する、i、-、第パワー。

   Let the symbol "+" denote addition of words (i.e., modulo-2^32
   addition). Let X <<< s denote the 32-bit value obtained by circularly
   shifting (rotating) X left by s bit positions. Let not(X) denote the
   bit-wise complement of X, and let X v Y denote the bit-wise OR of X
   and Y. Let X xor Y denote the bit-wise XOR of X and Y, and let XY
   denote the bit-wise AND of X and Y.

「+」というシンボルに単語(すなわち、法-2^32添加)の添加を指示させてください。 X<<<sにsビット位置で残っている(回転すること)のXを回覧に移行させることによって得られた32ビットの値を指示させてください。 どんな(X)にもXのビット的な補数を指示させないでください、Yに対するXにXのビット的なORを指示させてください、Y.Let X xor YはXとYのビット的なXORを指示し、XYにXとYのビット的なANDを指示させます。

3. MD4 Algorithm Description

3. MD4アルゴリズム記述

   We begin by supposing that we have a b-bit message as input, and that
   we wish to find its message digest. Here b is an arbitrary
   nonnegative integer; b may be zero, it need not be a multiple of
   eight, and it may be arbitrarily large. We imagine the bits of the
   message written down as follows:

私たちにはb-ビットメッセージが入力されるようにあって、メッセージダイジェストを見つけたいと思うと思うことによって、私たちは始めます。 ここで、bは任意の非負整数です。 bはゼロであるかもしれません、そして、8の倍数である必要はありません、そして、それは任意に大きいかもしれません。 私たちは以下の通り書き留められたメッセージのビットを想像します:

                 m_0 m_1 ... m_{b-1}

_1…mのm_0mの_b-1

Rivest                                                          [Page 2]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[2ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

   The following five steps are performed to compute the message digest
   of the message.

以下の5ステップは、メッセージのメッセージダイジェストを計算するために実行されます。

3.1 Step 1. Append Padding Bits

3.1 ステップ1。 詰め物ビットを追加してください。

   The message is "padded" (extended) so that its length (in bits) is
   congruent to 448, modulo 512. That is, the message is extended so
   that it is just 64 bits shy of being a multiple of 512 bits long.
   Padding is always performed, even if the length of the message is
   already congruent to 448, modulo 512.

メッセージが「そっと歩いている」ので(拡張)、長さ(ビットの)は448、法512に一致しています。 すなわち、メッセージが拡張されているので、それは512ビットの倍数であるのに不足した長さちょうど64ビットです。 詰め物はメッセージの長さが既に448に一致していてもいつも実行された法512です。

   Padding is performed as follows: a single "1" bit is appended to the
   message, and then "0" bits are appended so that the length in bits of
   the padded message becomes congruent to 448, modulo 512. In all, at
   least one bit and at most 512 bits are appended.

詰め物は以下の通り実行されます: シングル、「1インチのビットをメッセージに追加します、そして、次に、「0インチのビットを追加するので、そっと歩いているメッセージのビットの長さは512に448、法に一致するようになります」。 全部で、少なくとも1ビットと高々512ビットしか追加されません。

3.2 Step 2. Append Length

3.2 ステップ2。 長さを追加してください。

   A 64-bit representation of b (the length of the message before the
   padding bits were added) is appended to the result of the previous
   step. In the unlikely event that b is greater than 2^64, then only
   the low-order 64 bits of b are used. (These bits are appended as two
   32-bit words and appended low-order word first in accordance with the
   previous conventions.)

b(詰め物ビットの前のメッセージの長さは加えられた)の64ビットの表現を前のステップの結果に追加します。 ありそうもない出来事では、そのbが2以上^64である、その時、bの下位の64ビットだけが使用されています。 (前のコンベンションに従って2つの32ビットの単語と追加された下位が1番目を言い表すとき、これらのビットを追加します。)

   At this point the resulting message (after padding with bits and with
   b) has a length that is an exact multiple of 512 bits. Equivalently,
   this message has a length that is an exact multiple of 16 (32-bit)
   words. Let M[0 ... N-1] denote the words of the resulting message,
   where N is a multiple of 16.

ここに、結果として起こるメッセージ(ビットとbでそっと歩いた後の)には、512ビットの正確な倍数である長さがあります。 同等に、このメッセージには、16(32ビット)の単語の正確な倍数である長さがあります。 M[0…N-1]に結果として起こるメッセージの単語を指示させてください。(そこでは、Nが16の倍数です)。

3.3 Step 3. Initialize MD Buffer

3.3 ステップ3。 MDバッファを初期化してください。

   A four-word buffer (A,B,C,D) is used to compute the message digest.
   Here each of A, B, C, D is a 32-bit register. These registers are
   initialized to the following values in hexadecimal, low-order bytes
   first):

4単語のバッファ(A、B、C、D)は、メッセージダイジェストを計算するのに使用されます。 ここで、A、B、C、それぞれのDは32ビットのレジスタです。 これらのレジスタが最初に16進の以下の値、下位バイトに初期化される、)、:

        word A: 01 23 45 67
        word B: 89 ab cd ef
        word C: fe dc ba 98
        word D: 76 54 32 10

単語A: 01 23 45 67はBを言い表します: 89 腹筋cd ef単語C: fe dc Ba98はDを言い表します: 76 54 32 10

Rivest                                                          [Page 3]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[3ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

3.4 Step 4. Process Message in 16-Word Blocks

3.4 ステップ4。 16Wordのブロックの過程メッセージ

   We first define three auxiliary functions that each take as input
   three 32-bit words and produce as output one 32-bit word.

私たちは最初に、入力の3 32ビットの単語としてそれぞれ取って、1つの32ビットの単語を出力するとき作り出される3つの補助の機能を定義します。

        F(X,Y,Z) = XY v not(X) Z
        G(X,Y,Z) = XY v XZ v YZ
        H(X,Y,Z) = X xor Y xor Z

(X) F(X、Y、Z)=XY対どんなZ G(X、Y、Z)もXY対X xor Y XZ対YZ H(X、Y、Z)=xor Zと等しくはありません。

   In each bit position F acts as a conditional: if X then Y else Z.
   The function F could have been defined using + instead of v since XY
   and not(X)Z will never have "1" bits in the same bit position.)  In
   each bit position G acts as a majority function: if at least two of
   X, Y, Z are on, then G has a "1" bit in that bit position, else G has
   a "0" bit. It is interesting to note that if the bits of X, Y, and Z
   are independent and unbiased, the each bit of f(X,Y,Z) will be
   independent and unbiased, and similarly each bit of g(X,Y,Z) will be
   independent and unbiased. The function H is the bit-wise XOR or
   parity" function; it has properties similar to those of F and G.

中では、各ビット位置Fはaとして条件付きに機能します: 機能FがX当時のYほかのZ.であるならZが決して持っていない(X)ではなく、XY以来のvの代わりに+を使用することで定義されたかもしれない、「同じビット位置の1インチのビット)。」 各ビット位置では、大部分が機能するとき、Gは行動します: 少なくとも2X、Y、ZがオンであるならGにはaがある、「そのビット位置で噛み付かれた1インチ、Gでは、「0インチのビット」があります。 g(X、Y、Z)のそれぞれのビットが同様に、X、Y、およびZのビットが独立していて不遍であるなら、f(X、Y、Z)についてそれぞれ噛み付かれるのが独立していて不遍になって、独立していて不遍になることに注意するのはおもしろいです。 「機能Hは、ビット的なXORか同等です」という機能。 それには、FとGのものと同様の特性があります。

   Do the following:

以下をしてください:

      Process each 16-word block. */
      For i = 0 to N/16-1 do

それぞれの16単語のブロックを処理してください。 *0〜N/16-1がするi=のための/

        /* Copy block i into X. */
        For j = 0 to 15 do
          Set X[j] to M[i*16+j].
        end /* of loop on j */

0〜jのためのX.*/への/*コピーブロックi=15はj*/でM[i*16+j]輪の終わり/*にSet X[j]をします。

        /* Save A as AA, B as BB, C as CC, and D as DD. */
        AA = A
        BB = B
        CC = C
        DD = D

AAとしてのA、掲示板としてのB、CCとしてのC、およびDDとしてのDを除いた/*。 *掲示板=B CC=C/AA=DDはDと等しいです。

        /* Round 1. */
        /* Let [abcd k s] denote the operation
             a = (a + F(b,c,d) + X[k]) <<< s. */
        /* Do the following 16 operations. */
        [ABCD  0  3]  [DABC  1  7]  [CDAB  2 11]  [BCDA  3 19]
        [ABCD  4  3]  [DABC  5  7]  [CDAB  6 11]  [BCDA  7 19]
        [ABCD  8  3]  [DABC  9  7]  [CDAB 10 11]  [BCDA 11 19]
        [ABCD 12  3]  [DABC 13  7]  [CDAB 14 11]  [BCDA 15 19]

/*ラウンド1。 *[abcd k s]は//*で操作a=を指示しました。(a+F(b、c、d)+X[k])<<<s。 *//*は以下の16の操作をします。 */ [ABCD 0 3] [DABC 1 7] [CDAB 2 11] [BCDA 3 19] [ABCD 4 3] [DABC 5 7] [CDAB 6 11] [BCDA 7 19] [ABCD 8 3] [DABC 9 7] [CDAB 10 11] [BCDA 11 19] [ABCD 12 3] [DABC 13 7] [CDAB 14 11] [BCDA15 19]

        /* Round 2. */
        /* Let [abcd k s] denote the operation
             a = (a + G(b,c,d) + X[k] + 5A827999) <<< s. */

/*ラウンド2。 *//*で、[abcd k s]は操作a=(+ a+G(b、c、d)X[k]+5A827999)<<<sを指示します。 */

Rivest                                                          [Page 4]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[4ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

        /* Do the following 16 operations. */
        [ABCD  0  3]  [DABC  4  5]  [CDAB  8  9]  [BCDA 12 13]
        [ABCD  1  3]  [DABC  5  5]  [CDAB  9  9]  [BCDA 13 13]
        [ABCD  2  3]  [DABC  6  5]  [CDAB 10  9]  [BCDA 14 13]
        [ABCD  3  3]  [DABC  7  5]  [CDAB 11  9]  [BCDA 15 13]

/*は以下の16の操作をします。 */[ABCD0 3][DABC4 5][CDAB8 9][BCDA12 13][ABCD1 3][DABC5 5][CDAB9 9][BCDA13 13][ABCD2 3][DABC6 5]、[CDAB、10、9、]、[BCDA14 13][ABCD3 3][DABC7 5]、[CDAB、11、9、][BCDA15 13]

        /* Round 3. */
        /* Let [abcd k s] denote the operation
             a = (a + H(b,c,d) + X[k] + 6ED9EBA1) <<< s. */
        /* Do the following 16 operations. */
        [ABCD  0  3]  [DABC  8  9]  [CDAB  4 11]  [BCDA 12 15]
        [ABCD  2  3]  [DABC 10  9]  [CDAB  6 11]  [BCDA 14 15]
        [ABCD  1  3]  [DABC  9  9]  [CDAB  5 11]  [BCDA 13 15]
        [ABCD  3  3]  [DABC 11  9]  [CDAB  7 11]  [BCDA 15 15]

/*ラウンド3。 *//*で、[abcd k s]は操作a=(+ a+H(b、c、d)X[k]+6ED9EBA1)<<<sを指示します。 *//*は以下の16の操作をします。 */ [ABCD 0 3] [DABC 8 9] [CDAB 4 11] [BCDA 12 15] [ABCD 2 3] [DABC 10 9] [CDAB 6 11] [BCDA 14 15] [ABCD 1 3] [DABC 9 9] [CDAB 5 11] [BCDA 13 15] [ABCD 3 3] [DABC 11 9] [CDAB 7 11] [BCDA15 15]

        /* Then perform the following additions. (That is, increment each
           of the four registers by the value it had before this block
           was started.) */
        A = A + AA
        B = B + BB
        C = C + CC
        D = D + DD

そして、/*は以下の追加を実行します。 (このブロックが始動される前にすなわち、それぞれ4つのものの増分はそれが持っていた値によって示されます。) */は=B+掲示板C=C+cc+ AA B=D=D+DDです。

      end /* of loop on i */

i*/の輪の終わり/*

   Note. The value 5A..99 is a hexadecimal 32-bit constant, written with
   the high-order digit first. This constant represents the square root
   of 2. The octal value of this constant is 013240474631.

注意します。 値の5A.。99は最初に高位の数字で書かれた16進の32ビットの定数です。 この定数は2の平方根を表します。 この定数の8進値は013240474631です。

   The value 6E..A1 is a hexadecimal 32-bit constant, written with the
   high-order digit first.  This constant represents the square root of
   3. The octal value of this constant is 015666365641.

値の6E.。A1は最初に高位の数字で書かれた16進の32ビットの定数です。 この定数は3の平方根を表します。 この定数の8進値は015666365641です。

   See Knuth, The Art of Programming, Volume 2 (Seminumerical
   Algorithms), Second Edition (1981), Addison-Wesley. Table 2, page
    660.

アディソン-ウエスリー、クヌース、プログラミングの芸術、第2巻(Seminumericalアルゴリズム)、第2版(1981)を見てください。 2、660ページを見送ってください。

3.5 Step 5. Output

3.5 ステップ5。 出力

   The message digest produced as output is A, B, C, D. That is, we
   begin with the low-order byte of A, and end with the high-order byte
   of D.

出力がAであるので作成されたメッセージダイジェスト、B、C、D.Thatがあって、私たちは、Aの下位バイトで始まって、Dの高位バイトで終わります。

   This completes the description of MD4. A reference implementation in
   C is given in the appendix.

これはMD4の記述を終了します。 付録でCでの参照実現を与えます。

Rivest                                                          [Page 5]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[5ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

4. Summary

4. 概要

   The MD4 message-digest algorithm is simple to implement, and provides
   a "fingerprint" or message digest of a message of arbitrary length.
   It is conjectured that the difficulty of coming up with two messages
   having the same message digest is on the order of 2^64 operations,
   and that the difficulty of coming up with any message having a given
   message digest is on the order of 2^128 operations. The MD4 algorithm
   has been carefully scrutinized for weaknesses. It is, however, a
   relatively new algorithm and further security analysis is of course
   justified, as is the case with any new proposal of this sort.

MD4メッセージダイジェストアルゴリズムは、実行するのが簡単であり、任意の長さに関するメッセージの「指紋」かメッセージダイジェストを提供します。 2つの^64操作の注文には同じメッセージダイジェストを持っている2つのメッセージを思いつくという困難があって、2つの^128操作の注文に与えられたメッセージダイジェストを持っているどんなメッセージも思いつくという困難があると推測されます。 MD4アルゴリズムは弱点のために慎重に精査されました。 しかしながら、それは比較的新しいアルゴリズムです、そして、さらなる証券分析はもちろん正当化されます、この種類のどんな新規案件があるケースのようにも。

References

参照

   [1] Rivest, R., "The MD4 message digest algorithm", in A.J.  Menezes
       and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO '90
       Proceedings, pages 303-311, Springer-Verlag, 1991.

[1]最もRivestなR.、A.の「MD4メッセージダイジェストアルゴリズム」J.メネゼス、およびS.A.Vanstone、エディタ、CryptologyのAdvances--CRYPTO90年Proceedings、303-311、Springer-Verlag、1991ページ

   [2] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1186, MIT,
       October 1990.

[2] 最もRivest、R.、「MD4メッセージダイジェストアルゴリズム」、RFC1186、MIT、10月1990

   [3] CCITT Recommendation X.509 (1988), "The Directory -
       Authentication Framework".

[3] CCITT推薦X.509(1988)、「ディレクトリ--認証、枠組み、」

   [4] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, MIT and
       RSA Data Security, Inc, April 1992.

[4] 最もRivestなR.、「MD5メッセージダイジェストアルゴリズム」RFC1321とMITとRSA Data Security、Inc、1992年4月。

APPENDIX A - Reference Implementation

付録A--リファレンスインプリメンテーション

   This appendix contains the following files:

この付録は以下のファイルを含んでいます:

        global.h -- global header file

global.h--グローバルなヘッダーファイル

        md4.h -- header file for MD4

md4.h--MD4のためのヘッダーファイル

        md4c.c -- source code for MD4

md4c.c--MD4のためのソースコード

        mddriver.c -- test driver for MD2, MD4 and MD5

mddriver.c--MD2、MD4、およびMD5のためのテスト・ドライバ

   The driver compiles for MD5 by default but can compile for MD2 or MD4
   if the symbol MD is defined on the C compiler command line as 2 or 4.

ドライバーは、MD5のためにデフォルトでコンパイルしますが、シンボルMDがCコンパイラコマンドラインで2か4と定義されるなら、MD2かMD4のためにコンパイルできます。

   The implementation is portable and should work on many different
   plaforms. However, it is not difficult to optimize the implementation
   on particular platforms, an exercise left to the reader. For example,
   on "little-endian" platforms where the lowest-addressed byte in a 32-
   bit word is the least significant and there are no alignment
   restrictions, the call to Decode in MD4Transform can be replaced with

実現は、携帯用であり、多くの異なったplaformsに働くべきです。しかしながら、特定のプラットホームで実現を最適化するのは難しくはありません、読者に任せる運動。 例えば、32の噛み付いている単語による最も低く記述されたバイトがそこで最も重要でないプラットホームは「リトルエンディアン」における、整列制限でなく、Decodeへの呼び出しはMD4Transformを取り替えることができるコネです。

Rivest                                                          [Page 6]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[6ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

   a typecast.

a型にはまります。

A.1 global.h

A.1 global.h

/* GLOBAL.H - RSAREF types and constants
 */

/*GLOBAL.H--RSAREFタイプと定数*/

/* PROTOTYPES should be set to one if and only if the compiler supports
     function argument prototyping.
   The following makes PROTOTYPES default to 0 if it has not already
     been defined with C compiler flags.
 */
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif

そして、/*PROTOTYPESが1つに用意ができるべきである、コンパイラが機能議論プロトタイピングを支持する場合にだけ。 以下で、それがCコンパイラ旗で既に定義されていないなら、PROTOTYPESは0をデフォルトとします。 */#ifndef原型#は原型0#endifを定義します。

/* POINTER defines a generic pointer type */
typedef unsigned char *POINTER;

/*POINTERは一般的なポインター型*/typedefの無記名の炭*POINTERを定義します。

/* UINT2 defines a two byte word */
typedef unsigned short int UINT2;

/*UINT2は2バイトの単語*/typedefの無記名の短いint UINT2を定義します。

/* UINT4 defines a four byte word */
typedef unsigned long int UINT4;

/*UINT4は4バイトの単語*/typedefの無記名の長いint UINT4を定義します。

/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
   If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
     returns an empty list.
 */

PROTOTYPESが上でどう定義されるかによって、/*プロト_LISTは定義されます。 PROTOTYPESを使用するなら、プロト_LISTはリストを返します。さもなければ、それは空のリストを返します。 */

#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif

##PROTOTYPES#がほかにプロト_LIST(リスト)リスト#を定義するなら、プロト_LIST(リスト)()#endifを定義してください。

A.2 md4.h

A.2 md4.h

/* MD4.H - header file for MD4C.C
 */

/*MD4.H--MD4C.C*/のためのヘッダーファイル

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
   rights reserved.

/*著作権(C)1991-2、RSA Data Security Inc.は1991を作成しました。 All rights reserved。

   License to copy and use this software is granted provided that it
   is identified as the "RSA Data Security, Inc. MD4 Message-Digest
   Algorithm" in all material mentioning or referencing this software
   or this function.

「RSA Data Security Inc.MD4メッセージダイジェストアルゴリズム」としてそれを特定すれば、このソフトウェアかこの機能に言及するか、または参照をつけながら、すべての材料の中でこのソフトウェアをコピーして、使用するライセンスを与えます。

Rivest                                                          [Page 7]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[7ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

   License is also granted to make and use derivative works provided
   that such works are identified as "derived from the RSA Data
   Security, Inc. MD4 Message-Digest Algorithm" in all material
   mentioning or referencing the derived work.

また、派生している仕事に言及するか、または参照をつけながらすべての材料の中で「RSA Data Security Inc.MD4 Message-ダイジェストAlgorithmから、派生する」ようにそのような作品を特定すれば、派生している作品を作って、使用するためにライセンスを与えます。

   RSA Data Security, Inc. makes no representations concerning either
   the merchantability of this software or the suitability of this
   software for any particular purpose. It is provided "as is"
   without express or implied warranty of any kind.

RSA Data Security Inc.はこのソフトウェアの市場性かどんな特定の目的のためのこのソフトウェアの適合のどちらかに関しても表現を全くしません。 どんな種類の急行も黙示的な保証なしでもそれを「そのままで」提供します。

   These notices must be retained in any copies of any part of this
   documentation and/or software.
 */

このドキュメンテーション、そして/または、ソフトウェアのどんな部分のどんなコピーでもこれらの通知を保有しなければなりません。 */

/* MD4 context. */
typedef struct {
  UINT4 state[4];                                   /* state (ABCD) */
  UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */
  unsigned char buffer[64];                         /* input buffer */
} MD4_CTX;

/*MD4文脈。 *{UINT4は[4]; /*州(ABCD)の*/UINT4カウント[2]; ビットの/*数を述べます、法の2^64(lsb1番目)の*/無記名の炭のバッファ[64]; /*入力バッファ*/}という/typedef struct MD4_CTX。

void MD4Init PROTO_LIST ((MD4_CTX *));
void MD4Update PROTO_LIST
  ((MD4_CTX *, unsigned char *, unsigned int));
void MD4Final PROTO_LIST ((unsigned char [16], MD4_CTX *));

MD4Initプロト_LIST((MD4_CTX*))を欠如させてください。 MD4Updateプロト_LIST((MD4_CTX*、無記名の炭*、無記名のint))を欠如させてください。 MD4Finalプロト_LIST((無記名の炭[16]、MD4_CTX*))を欠如させてください。

A.3 md4c.c

A.3 md4c.c

/* MD4C.C - RSA Data Security, Inc., MD4 message-digest algorithm
 */

/*MD4C.C--RSA Data Security Inc.、MD4メッセージダイジェストアルゴリズム*/

/* Copyright (C) 1990-2, RSA Data Security, Inc. All rights reserved.

/*著作権(C)1990-2、RSA Data Security Inc.All rights reserved。

   License to copy and use this software is granted provided that it
   is identified as the "RSA Data Security, Inc. MD4 Message-Digest
   Algorithm" in all material mentioning or referencing this software
   or this function.

「RSA Data Security Inc.MD4メッセージダイジェストアルゴリズム」としてそれを特定すれば、このソフトウェアかこの機能に言及するか、または参照をつけながら、すべての材料の中でこのソフトウェアをコピーして、使用するライセンスを与えます。

   License is also granted to make and use derivative works provided
   that such works are identified as "derived from the RSA Data
   Security, Inc. MD4 Message-Digest Algorithm" in all material
   mentioning or referencing the derived work.

また、派生している仕事に言及するか、または参照をつけながらすべての材料の中で「RSA Data Security Inc.MD4 Message-ダイジェストAlgorithmから、派生する」ようにそのような作品を特定すれば、派生している作品を作って、使用するためにライセンスを与えます。

   RSA Data Security, Inc. makes no representations concerning either
   the merchantability of this software or the suitability of this
   software for any particular purpose. It is provided "as is"
   without express or implied warranty of any kind.

RSA Data Security Inc.はこのソフトウェアの市場性かどんな特定の目的のためのこのソフトウェアの適合のどちらかに関しても表現を全くしません。 どんな種類の急行も黙示的な保証なしでもそれを「そのままで」提供します。

Rivest                                                          [Page 8]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[8ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

   These notices must be retained in any copies of any part of this
   documentation and/or software.
 */

このドキュメンテーション、そして/または、ソフトウェアのどんな部分のどんなコピーでもこれらの通知を保有しなければなりません。 */

#include "global.h"
#include "md4.h"

##、が含む"global.h""md4.h"を含めてください。

/* Constants for MD4Transform routine.
 */
#define S11 3
#define S12 7
#define S13 11
#define S14 19
#define S21 3
#define S22 5
#define S23 9
#define S24 13
#define S31 3
#define S32 9
#define S33 11
#define S34 15

MD4Transformルーチンのための/*定数。 */#が定義する、S11 3#、がS12 7#、を定義する、定義、S13 11#が定義する、S14 19#がS21 3#、を定義する、定義、S22 5#、がS23 9#、を定義する、定義、S24 13#が定義する、S31 3#、がS32 9#、を定義する、定義、S33 11#はS34 15を定義します。

static void MD4Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
static void Encode PROTO_LIST
  ((unsigned char *, UINT4 *, unsigned int));
static void Decode PROTO_LIST
  ((UINT4 *, unsigned char *, unsigned int));
static void MD4_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
static void MD4_memset PROTO_LIST ((POINTER, int, unsigned int));

静的な空のMD4Transformプロト_LIST、(UINT4[4]、無記名の炭[64]))。 静的な空のEncodeプロト_LIST((無記名の炭*、UINT4*、無記名のint))。 静的な空のDecodeプロト_LIST((UINT4*、無記名の炭*、無記名のint))。 静的な空のMD4_memcpyプロト_LIST((POINTER、POINTER、無記名のint))。 静的な空のMD4_memsetプロト_LIST((POINTER、int、無記名のint))。

static unsigned char PADDING[64] = {
  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

0×80、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、静的な無記名の炭のPADDING[64]=0。

/* F, G and H are basic MD4 functions.
 */
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))

/*F、G、およびHは基本的なMD4機能です。 */#はF(((x)と(y))(x、y、z)を定義します| (~x)と(z)))#はG(((x)と(y))(x、y、z)を定義します| ((x)と(z))| ((y)と(z)))#はH(x、y、z)を定義します。((x) ^(y)^(z))

/* ROTATE_LEFT rotates x left n bits.
 */
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))

/*ROTATE_LEFTはnビット残っているxを回転させます。 */#はROTATE_LEFT(x、n)を定義します。(((x) <<(n))| ((x) >>、(32-(n))))

/* FF, GG and HH are transformations for rounds 1, 2 and 3 */
/* Rotation is separate from addition to prevent recomputation */

/*FF、GG、およびHHはラウンド1、2のための変化です、そして、3*//*回転は再計算*/を防ぐ添加から別々です。

Rivest                                                          [Page 9]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[9ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

#define FF(a, b, c, d, x, s) { \
    (a) += F ((b), (c), (d)) + (x); \
    (a) = ROTATE_LEFT ((a), (s)); \
  }
#define GG(a, b, c, d, x, s) { \
    (a) += G ((b), (c), (d)) + (x) + (UINT4)0x5a827999; \
    (a) = ROTATE_LEFT ((a), (s)); \
  }
#define HH(a, b, c, d, x, s) { \
    (a) += H ((b), (c), (d)) + (x) + (UINT4)0x6ed9eba1; \
    (a) = ROTATE_LEFT ((a), (s)); \
  }

#定義..等しい..等しい..定義..等しい..定義(d))+(x)+(UINT4)0x6ed9eba1; \(a)+=H((b)、(c)、\(a)=があと_を回転させる、((a)、(s));、\

/* MD4 initialization. Begins an MD4 operation, writing a new context.
 */
void MD4Init (context)
MD4_CTX *context;                                        /* context */
{
  context->count[0] = context->count[1] = 0;

/*MD4初期化。 新しい関係を書いて、MD4操業を開始します。 */空間MD4Init(文脈)MD4_CTX*文脈。 文脈->は数えられます。/*文脈*/、[0] = 文脈->は[1] =0を数えます。

  /* Load magic initialization constants.
   */
  context->state[0] = 0x67452301;
  context->state[1] = 0xefcdab89;
  context->state[2] = 0x98badcfe;
  context->state[3] = 0x10325476;
}

/*は魔法の初期化定数をロードします。 */文脈->は[0] =0x67452301を述べます。 文脈->は、[1]が0xefcdab89と等しいと述べます。 文脈->は、[2]が0x98badcfeと等しいと述べます。 文脈->は[3] =0x10325476を述べます。 }

/* MD4 block update operation. Continues an MD4 message-digest
     operation, processing another message block, and updating the
     context.
 */
void MD4Update (context, input, inputLen)
MD4_CTX *context;                                        /* context */
unsigned char *input;                                /* input block */
unsigned int inputLen;                     /* length of input block */
{
  unsigned int i, index, partLen;

/*MD4はアップデート操作を妨げます。 別のメッセージブロックを処理して、文脈をアップデートして、MD4メッセージダイジェスト操作を続けています。 */空間MD4Update(文脈、入力、inputLen)MD4_CTX*文脈。 *が入力した/*文脈*/無記名の炭。 /*はブロック*/無記名のint inputLenを入力しました。 入力ブロック*/の/*長さ、無記名のint i、インデックス、partLen。

  /* Compute number of bytes mod 64 */
  index = (unsigned int)((context->count[0] >> 3) & 0x3F);
  /* Update number of bits */
  if ((context->count[0] += ((UINT4)inputLen << 3))
      < ((UINT4)inputLen << 3))
    context->count[1]++;
  context->count[1] += ((UINT4)inputLen >> 29);

/*はバイト数モッズ64*/インデックス=(無記名のint)を計算します(文脈->カウント[0]>>3)と0x3F)。 ビット*/の/*更新番号は(文脈->は[0]+=((UINT4)inputLen<<3)を数えます)<((UINT4)inputLen<<3)文脈->であるなら[1] + +を数えます。 文脈->は[1]+=((UINT4)inputLen>>29)を数えます。

  partLen = 64 - index;

partLen=64--索引をつけてください。

Rivest                                                         [Page 10]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[10ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

  /* Transform as many times as possible.
   */
  if (inputLen >= partLen) {
    MD4_memcpy
      ((POINTER)&context->buffer[index], (POINTER)input, partLen);
    MD4Transform (context->state, context->buffer);

可能な同じくらい何回も/*変換。 */、(inputLen>=partLen)である、MD4_memcpy(POINTER)、文脈->がバッファリングする、[インデックス]、(POINTER) 入力、partLen);、MD4Transform、(文脈->が述べる、文脈->がバッファリングする、)、。

    for (i = partLen; i + 63 < inputLen; i += 64)
      MD4Transform (context->state, &input[i]);

(i=partLen; i+63<inputLen; i+=64)MD4Transform、(文脈->が述べる、[i])を入力してください、。

    index = 0;
  }
  else
    i = 0;

=0に索引をつけてください。 ほかのi=0。

  /* Buffer remaining input */
  MD4_memcpy
    ((POINTER)&context->buffer[index], (POINTER)&input[i],
     inputLen-i);
}

/*よりもみ皮製の残りが*/MD4_memcpy(POINTER)を入力した、文脈->がバッファリングする、[インデックス]、(POINTER)と入力[i]、inputLen-i)、。 }

/* MD4 finalization. Ends an MD4 message-digest operation, writing the
     the message digest and zeroizing the context.
 */
void MD4Final (digest, context)
unsigned char digest[16];                         /* message digest */
MD4_CTX *context;                                        /* context */
{
  unsigned char bits[8];
  unsigned int index, padLen;

/*MD4決定。 MD4メッセージダイジェスト操作を終わらせて、メッセージダイジェストを書いて、文脈をゼロ化します。 */空間MD4Final(ダイジェスト、文脈)無記名の炭ダイジェスト[16]。 /*メッセージダイジェスト*/MD4_CTX*文脈。 /*文脈*/、無記名の炭のビット[8](無記名のintインデックス、padLen)

  /* Save number of bits */
  Encode (bits, context->count, 8);

/*はビット*/エンコードの数を節約します。(ビットであり、文脈->が数えられる、8)。

  /* Pad out to 56 mod 64.
   */
  index = (unsigned int)((context->count[0] >> 3) & 0x3f);
  padLen = (index < 56) ? (56 - index) : (120 - index);
  MD4Update (context, PADDING, padLen);

/*は56モッズに64を広げます。 */インデックスは(無記名のint)と等しいです(文脈->カウント[0]>>3)と0x3f)。 padLen=(インデックス<56)?(56--インデックス): (120--索引をつけてください)。 MD4Update(文脈、詰め物、padLen)。

  /* Append length (before padding) */
  MD4Update (context, bits, 8);
  /* Store state in digest */
  Encode (digest, context->state, 16);

/*は長さ(詰め物の前の)の*/MD4Update(文脈、ビット、8)を追加します。 ダイジェスト*/エンコードにおける/*ストア状態、(読みこなしてください、文脈->が述べる、16)。

  /* Zeroize sensitive information.
   */
  MD4_memset ((POINTER)context, 0, sizeof (*context));

/*は機密情報をゼロ化します。 */MD4_memset(POINTER)文脈、0、sizeof(*文脈)。

Rivest                                                         [Page 11]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[11ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

}

}

/* MD4 basic transformation. Transforms state based on block.
 */
static void MD4Transform (state, block)
UINT4 state[4];
unsigned char block[64];
{
  UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];

/*MD4基本的な変化。 州がブロックに基礎づけた変換。 */静的な空のMD4Transform(状態、ブロック)UINT4は[4]を述べます。 無記名の炭のブロック[64]。 UINT4aは状態[0]と等しく、b=状態[1]、c=は、[2] dが状態[3]、x[16]と等しいと述べます。

  Decode (x, block, 64);

(x、ブロック、64)を解読してください。

  /* Round 1 */
  FF (a, b, c, d, x[ 0], S11); /* 1 */
  FF (d, a, b, c, x[ 1], S12); /* 2 */
  FF (c, d, a, b, x[ 2], S13); /* 3 */
  FF (b, c, d, a, x[ 3], S14); /* 4 */
  FF (a, b, c, d, x[ 4], S11); /* 5 */
  FF (d, a, b, c, x[ 5], S12); /* 6 */
  FF (c, d, a, b, x[ 6], S13); /* 7 */
  FF (b, c, d, a, x[ 7], S14); /* 8 */
  FF (a, b, c, d, x[ 8], S11); /* 9 */
  FF (d, a, b, c, x[ 9], S12); /* 10 */
  FF (c, d, a, b, x[10], S13); /* 11 */
  FF (b, c, d, a, x[11], S14); /* 12 */
  FF (a, b, c, d, x[12], S11); /* 13 */
  FF (d, a, b, c, x[13], S12); /* 14 */
  FF (c, d, a, b, x[14], S13); /* 15 */
  FF (b, c, d, a, x[15], S14); /* 16 */

/*ラウンド1*/FF(a、b、c、d、x[ 0]、S11)。 /*1*/FF(d、a、b、c、x[ 1]、S12)。 /*2*/FF(c、d、a、b、x[ 2]、S13)。 /*3*/FF(b、c、d、a、x[ 3]、S14)。 /*4*/FF(a、b、c、d、x[ 4]、S11)。 /*5*/FF(d、a、b、c、x[ 5]、S12)。 /*6*/FF(c、d、a、b、x[ 6]、S13)。 /*7*/FF(b、c、d、a、x[ 7]、S14)。 /*8*/FF(a、b、c、d、x[ 8]、S11)。 /*9*/FF(d、a、b、c、x[ 9]、S12)。 /*10*/FF(c、d、a、b、x[10]、S13)。 /*11*/FF(b、c、d、a、x[11]、S14)。 /*12*/FF(a、b、c、d、x[12]、S11)。 /*13*/FF(d、a、b、c、x[13]、S12)。 /*14*/FF(c、d、a、b、x[14]、S13)。 /*15*/FF(b、c、d、a、x[15]、S14)。 /* 16 */

  /* Round 2 */
  GG (a, b, c, d, x[ 0], S21); /* 17 */
  GG (d, a, b, c, x[ 4], S22); /* 18 */
  GG (c, d, a, b, x[ 8], S23); /* 19 */
  GG (b, c, d, a, x[12], S24); /* 20 */
  GG (a, b, c, d, x[ 1], S21); /* 21 */
  GG (d, a, b, c, x[ 5], S22); /* 22 */
  GG (c, d, a, b, x[ 9], S23); /* 23 */
  GG (b, c, d, a, x[13], S24); /* 24 */
  GG (a, b, c, d, x[ 2], S21); /* 25 */
  GG (d, a, b, c, x[ 6], S22); /* 26 */
  GG (c, d, a, b, x[10], S23); /* 27 */
  GG (b, c, d, a, x[14], S24); /* 28 */
  GG (a, b, c, d, x[ 3], S21); /* 29 */
  GG (d, a, b, c, x[ 7], S22); /* 30 */
  GG (c, d, a, b, x[11], S23); /* 31 */
  GG (b, c, d, a, x[15], S24); /* 32 */

/*ラウンド2*/GG(a、b、c、d、x[ 0]、S21)。 /*17*/GG(d、a、b、c、x[ 4]、S22)。 /*18*/GG(c、d、a、b、x[ 8]、S23)。 /*19*/GG(b、c、d、a、x[12]、S24)。 /*20*/GG(a、b、c、d、x[ 1]、S21)。 /*21*/GG(d、a、b、c、x[ 5]、S22)。 /*22*/GG(c、d、a、b、x[ 9]、S23)。 /*23*/GG(b、c、d、a、x[13]、S24)。 /*24*/GG(a、b、c、d、x[ 2]、S21)。 /*25*/GG(d、a、b、c、x[ 6]、S22)。 /*26*/GG(c、d、a、b、x[10]、S23)。 /*27*/GG(b、c、d、a、x[14]、S24)。 /*28*/GG(a、b、c、d、x[ 3]、S21)。 /*29*/GG(d、a、b、c、x[ 7]、S22)。 /*30*/GG(c、d、a、b、x[11]、S23)。 /*31*/GG(b、c、d、a、x[15]、S24)。 /* 32 */

Rivest                                                         [Page 12]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[12ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

  /* Round 3 */
  HH (a, b, c, d, x[ 0], S31); /* 33 */
  HH (d, a, b, c, x[ 8], S32); /* 34 */
  HH (c, d, a, b, x[ 4], S33); /* 35 */
  HH (b, c, d, a, x[12], S34); /* 36 */
  HH (a, b, c, d, x[ 2], S31); /* 37 */
  HH (d, a, b, c, x[10], S32); /* 38 */
  HH (c, d, a, b, x[ 6], S33); /* 39 */
  HH (b, c, d, a, x[14], S34); /* 40 */
  HH (a, b, c, d, x[ 1], S31); /* 41 */
  HH (d, a, b, c, x[ 9], S32); /* 42 */
  HH (c, d, a, b, x[ 5], S33); /* 43 */
  HH (b, c, d, a, x[13], S34); /* 44 */
  HH (a, b, c, d, x[ 3], S31); /* 45 */
  HH (d, a, b, c, x[11], S32); /* 46 */
  HH (c, d, a, b, x[ 7], S33); /* 47 */
  HH (b, c, d, a, x[15], S34); /* 48 */

/*ラウンド3*/HH(a、b、c、d、x[ 0]、S31)。 /*33*/HH(d、a、b、c、x[ 8]、S32)。 /*34*/HH(c、d、a、b、x[ 4]、S33)。 /*35*/HH(b、c、d、a、x[12]、S34)。 /*36*/HH(a、b、c、d、x[ 2]、S31)。 /*37*/HH(d、a、b、c、x[10]、S32)。 /*38*/HH(c、d、a、b、x[ 6]、S33)。 /*39*/HH(b、c、d、a、x[14]、S34)。 /*40*/HH(a、b、c、d、x[ 1]、S31)。 /*41*/HH(d、a、b、c、x[ 9]、S32)。 /*42*/HH(c、d、a、b、x[ 5]、S33)。 /*43*/HH(b、c、d、a、x[13]、S34)。 /*44*/HH(a、b、c、d、x[ 3]、S31)。 /*45*/HH(d、a、b、c、x[11]、S32)。 /*46*/HH(c、d、a、b、x[ 7]、S33)。 /*47*/HH(b、c、d、a、x[15]、S34)。 /* 48 */

  state[0] += a;
  state[1] += b;
  state[2] += c;
  state[3] += d;

[0]+=aを述べてください。 [1]+=bを述べてください。 [2]+=cを述べてください。 [3]+=dを述べてください。

  /* Zeroize sensitive information.
   */
  MD4_memset ((POINTER)x, 0, sizeof (x));
}

/*は機密情報をゼロ化します。 */MD4_memset(POINTER)x、0、sizeof(x))。 }

/* Encodes input (UINT4) into output (unsigned char). Assumes len is
     a multiple of 4.
 */
static void Encode (output, input, len)
unsigned char *output;
UINT4 *input;
unsigned int len;
{
  unsigned int i, j;

/*は出力(無記名の炭)に入力(UINT4)をコード化します。 lenが4の倍数であると仮定します。 */静的な空のEncode(出力、入力、len)無記名の炭*出力。 UINT4*入力。 無記名のint len。 無記名のint i、j。

  for (i = 0, j = 0; j < len; i++, j += 4) {
    output[j] = (unsigned char)(input[i] & 0xff);
    output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
    output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
    output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
  }
}

出力..無記名..炭..入力..出力..無記名..炭..入力..出力..無記名..炭..入力..出力..無記名..炭..入力

/* Decodes input (unsigned char) into output (UINT4). Assumes len is
     a multiple of 4.

/*は入力(無記名の炭)を出力(UINT4)に解読します。 lenが4の倍数であると仮定します。

Rivest                                                         [Page 13]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[13ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

 */
static void Decode (output, input, len)

*/静的な空のDecode(出力、入力、len)

UINT4 *output;
unsigned char *input;
unsigned int len;
{
  unsigned int i, j;

UINT4*出力。 *が入力した無記名の炭。 無記名のint len。 無記名のint i、j。

  for (i = 0, j = 0; j < len; i++, j += 4)
    output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
      (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
}

(i=0、j=0; j<len; i++、j+=4)出力[i]=(UINT4)入力[j])のために| ((UINT4)入力[j+1)<<8) | ((UINT4)入力[j+2)<<16) | (UINT4) <<24を入力してください[j+3))。 }

/* Note: Replace "for loop" with standard memcpy if possible.
 */
static void MD4_memcpy (output, input, len)
POINTER output;
POINTER input;
unsigned int len;
{
  unsigned int i;

/*注意: できれば、「輪」を標準のmemcpyに取り替えてください。 */静的な空のMD4_memcpy(出力、入力、len)POINTER出力。 POINTER入力。 無記名のint len。 無記名のint i。

  for (i = 0; i < len; i++)
    output[i] = input[i];
}

(i=0; i<len; i++)に関しては、出力[i]は入力[i]と等しいです。 }

/* Note: Replace "for loop" with standard memset if possible.
 */
static void MD4_memset (output, value, len)
POINTER output;
int value;
unsigned int len;
{
  unsigned int i;

/*注意: できれば、「輪」を標準のmemsetに取り替えてください。 */静的な空のMD4_memset(出力、値、len)POINTER出力。 int値。 無記名のint len。 無記名のint i。

  for (i = 0; i < len; i++)
    ((char *)output)[i] = (char)value;
}

(i++) (炭*)が出力したi=0(i<len))のために、[i]は(炭)値と等しいです。 }

A.4 mddriver.c

A.4 mddriver.c

/* MDDRIVER.C - test driver for MD2, MD4 and MD5
 */

/*MDDRIVER.C--MD2、MD4、およびMD5*/のためのテスト・ドライバ

/* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
   rights reserved.

/*著作権(C)1990-2、RSA Data Security Inc.は1990を作成しました。 All rights reserved。

Rivest                                                         [Page 14]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[14ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

   RSA Data Security, Inc. makes no representations concerning either
   the merchantability of this software or the suitability of this
   software for any particular purpose. It is provided "as is"
   without express or implied warranty of any kind.

RSA Data Security Inc.はこのソフトウェアの市場性かどんな特定の目的のためのこのソフトウェアの適合のどちらかに関しても表現を全くしません。 どんな種類の急行も黙示的な保証なしでもそれを「そのままで」提供します。

   These notices must be retained in any copies of any part of this
   documentation and/or software.

このドキュメンテーション、そして/または、ソフトウェアのどんな部分のどんなコピーでもこれらの通知を保有しなければなりません。

 */

*/

/* The following makes MD default to MD5 if it has not already been
     defined with C compiler flags.
 */
#ifndef MD
#define MD MD5
#endif

それがCコンパイラで既に定義されていないなら、以下がMD5へのMDデフォルトをする/*は弛みます。 */#ifndef MD#はMD MD5#endifを定義します。

#include <stdio.h>
#include <time.h>
#include <string.h>
#include "global.h"
#if MD == 2
#include "md2.h"
#endif
#if MD == 4
#include "md4.h"
#endif
#if MD == 5
#include "md5.h"
#endif

####MD=5#インクルード"md5.h"#がendifするならMD=4#インクルード"md4.h"#がendifするならMD=2#インクルード"md2.h"#がendifするなら、<stdio.h>#インクルード<time.h>#インクルード<string.h>#インクルード"global.h"を含めてください。

/* Length of test block, number of test blocks.
 */
#define TEST_BLOCK_LEN 1000
#define TEST_BLOCK_COUNT 1000

テストブロックの/*長さ、テストブロックの数。 */#が定義する、テスト_ブロック_LEN1000#、はテスト_ブロック_カウント1000を定義します。

static void MDString PROTO_LIST ((char *));
static void MDTimeTrial PROTO_LIST ((void));
static void MDTestSuite PROTO_LIST ((void));
static void MDFile PROTO_LIST ((char *));
static void MDFilter PROTO_LIST ((void));
static void MDPrint PROTO_LIST ((unsigned char [16]));

静的な空のMDStringプロト_LIST((炭*))。 静的な空のMDTimeTrialプロト_LIST((空間))。 静的な空のMDTestSuiteプロト_LIST((空間))。 静的な空のMDFileプロト_LIST((炭*))。 静的な空のMDFilterプロト_LIST((空間))。 静的な空のMDPrintプロト_LIST、(無記名の炭[16]))。

#if MD == 2
#define MD_CTX MD2_CTX
#define MDInit MD2Init
#define MDUpdate MD2Update
#define MDFinal MD2Final

#MD=2#、がCTX#が定義するMD_CTX MD2_を定義するならMDInit MD2Init#がMDUpdate MD2Update#を定義する、MDFinal MD2Finalを定義してください。

Rivest                                                         [Page 15]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[15ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

#endif
#if MD == 4
#define MD_CTX MD4_CTX
#define MDInit MD4Init
#define MDUpdate MD4Update
#define MDFinal MD4Final
#endif
#if MD == 5
#define MD_CTX MD5_CTX
#define MDInit MD5Init
#define MDUpdate MD5Update
#define MDFinal MD5Final
#endif

#endif、#MD=4#、がCTX#が定義するMD_CTX MD4_を定義するならMDInit MD4Init#がMDUpdate MD4Update#を定義する、MDFinal MD4Finalを定義してください、##MD=5#、がCTX#が定義するMD_CTX MD5_を定義するならendifに、MDInit MD5Init#がMDUpdate MD5Update#を定義する、MDFinal MD5Final#endifを定義してください。

/* Main driver.

/*主なドライバー。

   Arguments (may be any combination):
     -sstring - digests string
     -t       - runs time trial
     -x       - runs test script
     filename - digests file
     (none)   - digests standard input
 */
int main (argc, argv)
int argc;
char *argv[];
{
  int i;

主張(どんな組み合わせであるかもしれません): -ダイジェストが-tを結ぶというsstringはタイムトライアル-xを走らせます--走行はスクリプトファイル名をテストします--ダイジェストは(なにも)をファイルします--標準の入力*/intの主な(argc、argv)int argcを読みこなします。 *argv[]を炭にしてください。 int i。

  if (argc > 1)
    for (i = 1; i < argc; i++)
      if (argv[i][0] == '-' && argv[i][1] == 's')
        MDString (argv[i] + 2);
      else if (strcmp (argv[i], "-t") == 0)
        MDTimeTrial ();
      else if (strcmp (argv[i], "-x") == 0)
        MDTestSuite ();
      else
        MDFile (argv[i]);
  else
    MDFilter ();

(i=1; i<argc; i++)のための(argc>1)である、(argv[i][0]=、'--'argv[i][1]='s') MDString(argv[i]+2)。 ほか、(strcmp(argv[i]、"-t")=0)MDTimeTrial()であるなら。 ほか、(strcmp(argv[i]、"-x")=0)MDTestSuite()であるなら。 ほかのMDFile、(argv[i])。 ほかのMDFilter()。

  return (0);
}

リターン(0)。 }

/* Digests a string and prints the result.
 */
static void MDString (string)

/*は、ストリングを消化して、結果を印刷します。 */静的な空のMDString(ストリング)

Rivest                                                         [Page 16]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[16ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

char *string;
{
  MD_CTX context;
  unsigned char digest[16];
  unsigned int len = strlen (string);

*ストリングを炭にしてください。 MD_CTX文脈; 無記名の炭のダイジェスト[16]; 無記名のint lenはstrlen(ストリング)と等しいです。

  MDInit (&context);
  MDUpdate (&context, string, len);
  MDFinal (digest, &context);

MDInit(文脈)。 MDUpdate(文脈、ストリング、len)。 MDFinal(ダイジェスト、および文脈)。

  printf ("MD%d (\"%s\") = ", MD, string);
  MDPrint (digest);
  printf ("\n");
}

「printf、(「MD%d、(\、」 %s、\、」、)、等しさ、」、MD、ストリング)、。 MDPrint(ダイジェスト)。 printf(「\n」)。 }

/* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte
     blocks.
 */
static void MDTimeTrial ()
{
  MD_CTX context;
  time_t endTime, startTime;
  unsigned char block[TEST_BLOCK_LEN], digest[16];
  unsigned int i;

/*はCOUNT TEST_BLOCK_LEN-バイトが妨げるTEST_BLOCK_を読みこなす時間を測定します。 */静的な空のMDTimeTrial()、MD_CTX文脈endTime、startTime; 無記名の炭のブロック[TEST_BLOCK_LEN]、ダイジェスト[16]; (時間_t無記名のint i)

  printf
    ("MD%d time trial. Digesting %d %d-byte blocks ...", MD,
     TEST_BLOCK_LEN, TEST_BLOCK_COUNT);

printf(「MD%dはトライアルを調節します。」 「%dバイトが妨げる%dを読みこなします」…, MD、_ブロック_レンをテストしてください、そして、テスト_ブロック_は数えます。);

  /* Initialize block */
  for (i = 0; i < TEST_BLOCK_LEN; i++)
    block[i] = (unsigned char)(i & 0xff);

/*は(i=0; i<TEST_BLOCK_LEN; i++)ブロック[i]=(無記名の炭)(iと0xff)のためのブロック*/を初期化します。

  /* Start timer */
  time (&startTime);

/*スタートタイマ*/時間(startTime)。

  /* Digest blocks */
  MDInit (&context);
  for (i = 0; i < TEST_BLOCK_COUNT; i++)
    MDUpdate (&context, block, TEST_BLOCK_LEN);
  MDFinal (digest, &context);

/*ダイジェストブロック*/MDInit(文脈)。 (i=0; i<TEST_BLOCK_COUNT; i++)MDUpdate(文脈、ブロック、TEST_BLOCK_LEN)のために。 MDFinal(ダイジェスト、および文脈)。

  /* Stop timer */
  time (&endTime);

/*停止タイマ*/時間(endTime)。

  printf (" done\n");
  printf ("Digest = ");
  MDPrint (digest);

printf(「\nをします」)。 printf(「ダイジェスト=」)。 MDPrint(ダイジェスト)。

Rivest                                                         [Page 17]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[17ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

  printf ("\nTime = %ld seconds\n", (long)(endTime-startTime));
  printf
    ("Speed = %ld bytes/second\n",
     (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime));
}

printf((長い間、)(endTime-startTime)「\nTime=%ldは\nを後援します」)。 printf(「速度は%ldバイト/第2\nと等しい」(長い)のTEST_BLOCK LEN*(長い)のTEST_BLOCK__COUNT/(endTime-startTime))。 }

/* Digests a reference suite of strings and prints the results.
 */
static void MDTestSuite ()
{
  printf ("MD%d test suite:\n", MD);

/*は、ストリングの参照スイートを読みこなして、結果を印刷します。 */静的な空のMDTestSuite()、printf(「MD%dはスイート: \nをテストする」MD)。

  MDString ("");
  MDString ("a");
  MDString ("abc");
  MDString ("message digest");
  MDString ("abcdefghijklmnopqrstuvwxyz");
  MDString
    ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
  MDString

MDString、(「「)、;、」 MDString(“a")。 MDString("abc")。 MDString(「メッセージダイジェスト」)。 MDString("abcdefghijklmnopqrstuvwxyz")。 MDString("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")。 MDString

    ("1234567890123456789012345678901234567890\
1234567890123456789012345678901234567890");
}

("1234567890123456789012345678901234567890\ 1234567890123456789012345678901234567890"); }

/* Digests a file and prints the result.
 */
static void MDFile (filename)
char *filename;
{
  FILE *file;
  MD_CTX context;
  int len;
  unsigned char buffer[1024], digest[16];

/*は、ファイルを読みこなして、結果を印刷します。 */静的な空のMDFile(ファイル名)は*ファイル名を炭にします。 FILE*はファイルします; MD_CTX文脈; int len; 無記名の炭のバッファ[1024]、ダイジェスト[16]

  if ((file = fopen (filename, "rb")) == NULL)
    printf ("%s can't be opened\n", filename);

((ファイル=fopen(ファイル名、"rb"))=NULL)printf(「%sは開かれた\nであるはずがない」、ファイル名)であるなら。

  else {
    MDInit (&context);
    while (len = fread (buffer, 1, 1024, file))
      MDUpdate (&context, buffer, len);
    MDFinal (digest, &context);

ほか、MDInit(文脈); MDUpdate(よりもみ皮製の、そして、lenな関係)をゆったり過ごしてください(len=fread(バッファ、1、1024、ファイル)); MDFinal(ダイジェスト、および文脈)

    fclose (file);

fclose(ファイル)。

    printf ("MD%d (%s) = ", MD, filename);
    MDPrint (digest);

printf(「MD%d(%s)=」、MD、ファイル名)。 MDPrint(ダイジェスト)。

Rivest                                                         [Page 18]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[18ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

    printf ("\n");
  }
}

printf(「\n」)。 } }

/* Digests the standard input and prints the result.
 */
static void MDFilter ()
{
  MD_CTX context;
  int len;
  unsigned char buffer[16], digest[16];

/*は、標準の入力を読みこなして、結果を印刷します。 */静的な空のMDFilter()、MD_CTX文脈; int len; 無記名の炭のバッファ[16]、ダイジェスト[16]。

  MDInit (&context);
  while (len = fread (buffer, 1, 16, stdin))
    MDUpdate (&context, buffer, len);
  MDFinal (digest, &context);

MDInit(文脈)。 (lenはfread(バッファ、1、16、stdin)と等しいです)MDUpdate(文脈、バッファ、len)である間。 MDFinal(ダイジェスト、および文脈)。

  MDPrint (digest);
  printf ("\n");
}

MDPrint(ダイジェスト)。 printf(「\n」)。 }

/* Prints a message digest in hexadecimal.
 */
static void MDPrint (digest)
unsigned char digest[16];

/*は16進でメッセージダイジェストを印刷します。 */静的な空のMDPrint(読みこなす)無記名の炭ダイジェスト[16]。

{
  unsigned int i;

無記名のint i。

  for (i = 0; i < 16; i++)
    printf ("%02x", digest[i]);
}

(i=0; i<16; i++)はprintfされます。(「%02x」は[i])を読みこなします。 }

A.5 Test suite

A.5テストスイート

   The MD4 test suite (driver option "-x") should print the following
   results:

MD4テストスイート(ドライバーオプション"-x")は以下の結果を印刷するはずです:

MD4 test suite:
MD4 ("") = 31d6cfe0d16ae931b73c59d7e0c089c0
MD4 ("a") = bde52cb31de33e46245e05fbdbd6fb24
MD4 ("abc") = a448017aaf21d8525fc10ae87aa6729d
MD4 ("message digest") = d9130a8164549fe818874806e1c7014b
MD4 ("abcdefghijklmnopqrstuvwxyz") = d79e1c308aa5bbcdeea8ed63df412da9
MD4 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
043f8582f241db351ce627e153e7f0e4
MD4 ("123456789012345678901234567890123456789012345678901234567890123456
78901234567890") = e33b4ddc9c38f2199c3e7b164fcc0536

MD4はスイートをテストします: MD4、(「「)、= a448017aaf21d8525fc10ae87aa6729d MD4(「メッセージダイジェスト」)=31d6cfe0d16ae931b73c59d7e0c089c0 MD4(“a")=bde52cb31de33e46245e05fbdbd6fb24 MD4("abc")=d9130a8164549fe818874806e1c7014b MD4("abcdefghijklmnopqrstuvwxyz")=d79e1c308aa5bbcdeea8ed63df412da9 MD4("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")=043f8582f241db351ce627e153e7f0e4 MD4(「123456789012345678901234567890123456789012345678901234567890123456 78901234567890」)がe33b4ddc9c38f2199c3e7b164fcc0536と等しい、」

Rivest                                                         [Page 19]

RFC 1320              MD4 Message-Digest Algorithm            April 1992

[19ページ]最もRivestなRFC1320MD4メッセージダイジェストアルゴリズム1992年4月

Security Considerations

セキュリティ問題

   The level of security discussed in this memo is considered to be
   sufficient for implementing moderate security hybrid digital-
   signature schemes based on MD4 and a public-key cryptosystem. We do
   not know of any reason that MD4 would not be sufficient for
   implementing very high security digital-signature schemes, but
   because MD4 was designed to be exceptionally fast, it is "at the
   edge" in terms of risking successful cryptanalytic attack. After
   further critical review, it may be appropriate to consider MD4 for
   very high security applications. For very high security applications
   before the completion of that review, the MD5 algorithm [4] is
   recommended.

このメモで議論したセキュリティのレベルがMD4に基づくセキュリティの適度のハイブリッドデジタル署名体系と公開カギ暗号系を実行するのに十分であると考えられます。 私たちはMD4が非常に高いセキュリティデジタル署名体系を実行するのに十分でないだろう少しの理由も知りませんが、MD4が例外的に速くなるように設計されたので、うまくいっているcryptanalytic攻撃を危険にさらすことに関してそれは「縁」にあります。 さらなる批判的なレビューの後に、非常に高いセキュリティアプリケーションのためにMD4を考えるのは適切であるかもしれません。 そのレビューの完成の前の非常に高いセキュリティアプリケーションにおいて、MD5アルゴリズム[4]はお勧めです。

Author's Address

作者のアドレス

   Ronald L. Rivest
   Massachusetts Institute of Technology
   Laboratory for Computer Science
   NE43-324
   545 Technology Square
   Cambridge, MA  02139-1986

NE43-324 545の技術の正方形のケンブリッジ、コンピュータサイエンスMA02139-1986へのロナルドL.Rivestマサチューセッツ工科大学研究所

   Phone: (617) 253-5880
   EMail: rivest@theory.lcs.mit.edu

以下に電話をしてください。 (617) 253-5880 メールしてください: rivest@theory.lcs.mit.edu

Rivest                                                         [Page 20]

最もRivestである[20ページ]

一覧

 RFC 1〜100  RFC 1401〜1500  RFC 2801〜2900  RFC 4201〜4300 
 RFC 101〜200  RFC 1501〜1600  RFC 2901〜3000  RFC 4301〜4400 
 RFC 201〜300  RFC 1601〜1700  RFC 3001〜3100  RFC 4401〜4500 
 RFC 301〜400  RFC 1701〜1800  RFC 3101〜3200  RFC 4501〜4600 
 RFC 401〜500  RFC 1801〜1900  RFC 3201〜3300  RFC 4601〜4700 
 RFC 501〜600  RFC 1901〜2000  RFC 3301〜3400  RFC 4701〜4800 
 RFC 601〜700  RFC 2001〜2100  RFC 3401〜3500  RFC 4801〜4900 
 RFC 701〜800  RFC 2101〜2200  RFC 3501〜3600  RFC 4901〜5000 
 RFC 801〜900  RFC 2201〜2300  RFC 3601〜3700  RFC 5001〜5100 
 RFC 901〜1000  RFC 2301〜2400  RFC 3701〜3800  RFC 5101〜5200 
 RFC 1001〜1100  RFC 2401〜2500  RFC 3801〜3900  RFC 5201〜5300 
 RFC 1101〜1200  RFC 2501〜2600  RFC 3901〜4000  RFC 5301〜5400 
 RFC 1201〜1300  RFC 2601〜2700  RFC 4001〜4100  RFC 5401〜5500 
 RFC 1301〜1400  RFC 2701〜2800  RFC 4101〜4200 

スポンサーリンク

$debuggingクラス変数 デバッギングコンソールを表示するかどうか

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る