RFC1321 日本語訳

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

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

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

                     The MD5 Message-Digest Algorithm

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

Status of this Memo

この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,
   David Chaum, and Noam Nisan for numerous helpful comments and
   suggestions.

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

Table of Contents

目次

   1. Executive Summary                                                1
   2. Terminology and Notation                                         2
   3. MD5 Algorithm Description                                        3
   4. Summary                                                          6
   5. Differences Between MD4 and MD5                                  6
   References                                                          7
   APPENDIX A - Reference Implementation                               7
   Security Considerations                                            21
   Author's Address                                                   21

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

1. Executive Summary

1. 要約

   This document describes the MD5 message-digest algorithm. 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 MD5
   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.

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

Rivest                                                          [Page 1]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

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

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

   The MD5 algorithm is an extension of the MD4 message-digest algorithm
   1,2]. MD5 is slightly slower than MD4, but is more "conservative" in
   design. MD5 was designed because it was felt that MD4 was perhaps
   being adopted for use more quickly than justified by the existing
   critical review; because MD4 was designed to be exceptionally fast,
   it is "at the edge" in terms of risking successful cryptanalytic
   attack. MD5 backs off a bit, giving up a little in speed for a much
   greater likelihood of ultimate security. It incorporates some
   suggestions made by various reviewers, and contains additional
   optimizations. The MD5 algorithm is being placed in the public domain
   for review and possible adoption as a standard.

MD5アルゴリズムはMD4メッセージダイジェストアルゴリズム1、2]の拡大です。 MD5はわずかに遅いのですが、デザインではMD4より「保守的です」。 MD4が使用のために恐らく既存の批判的なレビューで正当化されるよりはやく採用されていたと感じられたので、MD5は設計されました。 MD4が例外的に速くなるように設計されたので、うまくいっているcryptanalytic攻撃を危険にさらすことに関してそれは「縁」にあります。 究極のセキュリティのはるかにすばらしい見込みのために速度で少しあきらめて、MD5は少し引き返します。 それは、様々な評論家によってされたいくつかの提案を取り入れて、追加最適化を含んでいます。 MD5アルゴリズムはレビューと可能な採用のために規格として公共の場に置くことにされます。

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

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

   md5 OBJECT IDENTIFIER ::=
     iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5}

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

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

X.509タイプAlgorithmIdentifier[3]では、MD5のためのパラメタはタイプ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を指示させます。

Rivest                                                          [Page 2]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

3. MD5 Algorithm Description

3. MD5アルゴリズム記述

   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

   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進の以下の値、下位バイトに初期化される、)、:

Rivest                                                          [Page 3]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

          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

3.4 Step 4. Process Message in 16-Word Blocks

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

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

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

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

(X) F(X、Y、Z)=XY対どんなZ G(X、Y、Z)もXZ対Y(Z) H(X、Y、Z)=X xor Y xor Z Y私(X、Y、Z)=xorでないのと等しくはありません。((Z))でないことに対するX

   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's in the same bit position.) 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.

中では、各ビット位置Fはaとして条件付きに機能します: X当時のYほかのZ.であるなら、機能Fは(X)Zではなく、XYが同じビット位置に1を決して持たないのでvの代わりに+を使用することで定義されたかもしれません。) X、Y、およびZのビットが独立していて不遍であるなら、F(X、Y、Z)についてそれぞれ噛み付かれるのが独立していて不遍になることに注意するのはおもしろいです。

   The functions G, H, and I are similar to the function F, in that they
   act in "bitwise parallel" to produce their output from the bits of X,
   Y, and Z, in such a manner that if the corresponding bits of X, Y,
   and Z are independent and unbiased, then each bit of G(X,Y,Z),
   H(X,Y,Z), and I(X,Y,Z) will be independent and unbiased. Note that
   the function H is the bit-wise "xor" or "parity" function of its
   inputs.

私(X、Y、Z)は、機能G、H、および私はそれでのX、Y、およびZのビットでY、およびZがXの対応するビットであるなら、独立していて不遍であるくらいの方法で彼らの出力を起こすために「平行に、bitwiseし」て、次に、G(X、Y、Z)についてそれぞれ噛み付かれて、それらが行動する機能Fと同様です、H(X、Y、Z)、独立していて不遍になるでしょう。 機能Hが入力のビット的な"xor"か「同等」機能であることに注意してください。

   This step uses a 64-element table T[1 ... 64] constructed from the
   sine function. Let T[i] denote the i-th element of the table, which
   is equal to the integer part of 4294967296 times abs(sin(i)), where i
   is in radians. The elements of the table are given in the appendix.

このステップが64要素のテーブルTを使用する、[1、.64、]、正弦機能から、組み立てられます。 テーブルにおいて、どれが4294967296回の腹筋の整数部と等しいか。T[i]に指示させる、i、-、第要素、((i))を犯してください。そこに、ラジアンにはiがあります。 付録でテーブルの要素を与えます。

   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

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

Rivest                                                          [Page 4]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

     CC = C
     DD = D

C CC=DDはDと等しいです。

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

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

     /* Round 2. */
     /* Let [abcd k s i] denote the operation
          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  1  5 17]  [DABC  6  9 18]  [CDAB 11 14 19]  [BCDA  0 20 20]
     [ABCD  5  5 21]  [DABC 10  9 22]  [CDAB 15 14 23]  [BCDA  4 20 24]
     [ABCD  9  5 25]  [DABC 14  9 26]  [CDAB  3 14 27]  [BCDA  8 20 28]
     [ABCD 13  5 29]  [DABC  2  9 30]  [CDAB  7 14 31]  [BCDA 12 20 32]

/*ラウンド2。 *//*で、[abcd k s i]は+ 操作a=b(+ a+G(b、c、d)X[k]+T[i])<<<s)を指示します。 *//*は以下の16の操作をします。 */ [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA12 20 32]

     /* Round 3. */
     /* Let [abcd k s t] denote the operation
          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  5  4 33]  [DABC  8 11 34]  [CDAB 11 16 35]  [BCDA 14 23 36]
     [ABCD  1  4 37]  [DABC  4 11 38]  [CDAB  7 16 39]  [BCDA 10 23 40]
     [ABCD 13  4 41]  [DABC  0 11 42]  [CDAB  3 16 43]  [BCDA  6 23 44]
     [ABCD  9  4 45]  [DABC 12 11 46]  [CDAB 15 16 47]  [BCDA  2 23 48]

/*ラウンド3。 *//*で、[abcd k s t]は+ 操作a=b(+ a+H(b、c、d)X[k]+T[i])<<<s)を指示します。 *//*は以下の16の操作をします。 */ [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA2 23 48]

     /* Round 4. */
     /* Let [abcd k s t] denote the operation
          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
     /* Do the following 16 operations. */
     [ABCD  0  6 49]  [DABC  7 10 50]  [CDAB 14 15 51]  [BCDA  5 21 52]
     [ABCD 12  6 53]  [DABC  3 10 54]  [CDAB 10 15 55]  [BCDA  1 21 56]
     [ABCD  8  6 57]  [DABC 15 10 58]  [CDAB  6 15 59]  [BCDA 13 21 60]
     [ABCD  4  6 61]  [DABC 11 10 62]  [CDAB  2 15 63]  [BCDA  9 21 64]

/*ラウンド4。 *//*で、[abcd k s t]は+ 操作a=b(+ a+I(b、c、d)X[k]+T[i])<<<s)を指示します。 *//*は以下の16の操作をします。 */ [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56] [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60] [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA9 21 64]

     /* 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*/の輪の終わり/*

Rivest                                                          [Page 5]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

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 MD5. A reference implementation in
   C is given in the appendix.

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

4. Summary

4. 概要

   The MD5 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 MD5 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.

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

5. Differences Between MD4 and MD5

5. MD4とMD5の違い

     The following are the differences between MD4 and MD5:

↓これはMD4とMD5の違いです:

       1.   A fourth round has been added.

1. 4番目のラウンドは加えられます。

       2.   Each step now has a unique additive constant.

2. 各ステップで、ユニークな添加物は現在、一定になります。

       3.   The function g in round 2 was changed from (XY v XZ v YZ) to
       (XZ v Y not(Z)) to make g less symmetric.

3. 2の周りの中の機能gを変えた、(XY v XZ対YZ)(gで、より左右対称でなくする(Z))ではなく、XZ対Y

       4.   Each step now adds in the result of the previous step.  This
       promotes a faster "avalanche effect".

4. 各ステップは現在、前のステップの結果を加えます。 これは、より速い「アバランシェ効果」を促進します。

       5.   The order in which input words are accessed in rounds 2 and
       3 is changed, to make these patterns less like each other.

5. 互いのようにそれほどこれらのパターンを作らないように、ラウンド2と3で入力単語にアクセスするオーダーを変えます。

       6.   The shift amounts in each round have been approximately
       optimized, to yield a faster "avalanche effect." The shifts in
       different rounds are distinct.

6. 各ラウンドにおけるシフト量は、より速い「アバランシェ効果」をもたらすためにほとんど最適化されました。 異なったラウンドにおけるシフトは異なっています。

Rivest                                                          [Page 6]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

References

参照

   [1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and
       RSA Data Security, Inc., April 1992.

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

   [2] 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.

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

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

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

APPENDIX A - Reference Implementation

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

   This appendix contains the following files taken from RSAREF: A
   Cryptographic Toolkit for Privacy-Enhanced Mail:

この付録はRSAREFから取られた以下のファイルを含んでいます: プライバシーで高められたメールのための暗号のツールキット:

     global.h -- global header file

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

     md5.h -- header file for MD5

md5.h--MD5のためのヘッダーファイル

     md5c.c -- source code for MD5

md5c.c--MD5のためのソースコード

   For more information on RSAREF, send email to <rsaref@rsa.com>.

RSAREFの詳しい情報に関しては、メール to <rsaref@rsa.com を送ってください、gt。

   The appendix also includes the following file:

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

     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 MD5Transform can be replaced with
   a typecast.

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

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

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

Rivest                                                          [Page 7]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 7] RFC 1321 MD5 Message-Digest Algorithm April 1992

  been defined with C compiler flags.
 */
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif

been defined with C compiler flags. */ #ifndef PROTOTYPES #define PROTOTYPES 0 #endif

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

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

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

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

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

/* UINT4 defines a four byte word */ typedef unsigned long 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.
 */
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif

/* 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. */ #if PROTOTYPES #define PROTO_LIST(list) list #else #define PROTO_LIST(list) () #endif

A.2 md5.h

A.2 md5.h

/* MD5.H - header file for MD5C.C
 */

/* MD5.H - header file for MD5C.C */

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

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

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

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

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

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

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. 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.

Rivest                                                          [Page 8]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 8] RFC 1321 MD5 Message-Digest Algorithm April 1992

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

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

/* MD5 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 */
} MD5_CTX;

/* MD5 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 */ } MD5_CTX;

void MD5Init PROTO_LIST ((MD5_CTX *));
void MD5Update PROTO_LIST
  ((MD5_CTX *, unsigned char *, unsigned int));
void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));

void MD5Init PROTO_LIST ((MD5_CTX *)); void MD5Update PROTO_LIST ((MD5_CTX *, unsigned char *, unsigned int)); void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));

A.3 md5c.c

A.3 md5c.c

/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
 */

/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm */

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

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

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

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

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

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

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. 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.

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

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

#include "global.h"
#include "md5.h"

#include "global.h" #include "md5.h"

/* Constants for MD5Transform routine.
 */

/* Constants for MD5Transform routine. */

Rivest                                                          [Page 9]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 9] RFC 1321 MD5 Message-Digest Algorithm April 1992

#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21

#define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21

static void MD5Transform 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 MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));

static void MD5Transform 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 MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); static void MD5_memset PROTO_LIST ((POINTER, int, unsigned 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
};

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 };

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

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

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

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

/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.
 */
#define FF(a, b, c, d, x, s, ac) { \
 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \

/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { \ (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \

Rivest                                                         [Page 10]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 10] RFC 1321 MD5 Message-Digest Algorithm April 1992

 (a) += (b); \
  }
#define GG(a, b, c, d, x, s, ac) { \
 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }
#define HH(a, b, c, d, x, s, ac) { \
 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }
#define II(a, b, c, d, x, s, ac) { \
 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }

(a) += (b); \ } #define GG(a, b, c, d, x, s, ac) { \ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define HH(a, b, c, d, x, s, ac) { \ (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \ (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ }

/* MD5 initialization. Begins an MD5 operation, writing a new context.
 */
void MD5Init (context)
MD5_CTX *context;                                        /* context */
{
  context->count[0] = context->count[1] = 0;
  /* Load magic initialization constants.
*/
  context->state[0] = 0x67452301;
  context->state[1] = 0xefcdab89;
  context->state[2] = 0x98badcfe;
  context->state[3] = 0x10325476;
}

/* MD5 initialization. Begins an MD5 operation, writing a new context. */ void MD5Init (context) MD5_CTX *context; /* context */ { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; }

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

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

  /* Compute number of bytes mod 64 */
  index = (unsigned int)((context->count[0] >> 3) & 0x3F);

/* 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))

/* Update number of bits */ if ((context->count[0] += ((UINT4)inputLen << 3))

Rivest                                                         [Page 11]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 11] RFC 1321 MD5 Message-Digest Algorithm April 1992

   < ((UINT4)inputLen << 3))
 context->count[1]++;
  context->count[1] += ((UINT4)inputLen >> 29);

< ((UINT4)inputLen << 3)) context->count[1]++; context->count[1] += ((UINT4)inputLen >> 29);

  partLen = 64 - index;

partLen = 64 - index;

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

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

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

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

 index = 0;
  }
  else
 i = 0;

index = 0; } else i = 0;

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

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

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

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

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

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

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

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

  /* Append length (before padding) */
  MD5Update (context, bits, 8);

/* Append length (before padding) */ MD5Update (context, bits, 8);

Rivest                                                         [Page 12]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 12] RFC 1321 MD5 Message-Digest Algorithm April 1992

  /* Store state in digest */
  Encode (digest, context->state, 16);

/* Store state in digest */ Encode (digest, context->state, 16);

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

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

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

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

  Decode (x, block, 64);

Decode (x, block, 64);

  /* Round 1 */
  FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
  FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
  FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
  FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
  FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
  FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
  FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
  FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
  FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
  FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
  FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */

/* Round 1 */ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */

 /* Round 2 */
  GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
  GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
  GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
  GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
  GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
  GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
  GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
  GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */

/* Round 2 */ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */

Rivest                                                         [Page 13]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 13] RFC 1321 MD5 Message-Digest Algorithm April 1992

  GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
  GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
  GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
  GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */

GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */

  /* Round 3 */
  HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
  HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
  HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
  HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
  HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
  HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
  HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
  HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
  HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
  HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */

/* Round 3 */ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */

  /* Round 4 */
  II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
  II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
  II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
  II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
  II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
  II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
  II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
  II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
  II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
  II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */

/* Round 4 */ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */

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

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

  /* Zeroize sensitive information.

/* Zeroize sensitive information.

Rivest                                                         [Page 14]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 14] RFC 1321 MD5 Message-Digest Algorithm April 1992

*/
  MD5_memset ((POINTER)x, 0, sizeof (x));
}

*/ MD5_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;

/* 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;

  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);
  }
}

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.
 */
static void Decode (output, input, len)
UINT4 *output;
unsigned char *input;
unsigned int len;
{
  unsigned int i, j;

/* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */ static void Decode (output, input, len) UINT4 *output; unsigned char *input; unsigned int len; { unsigned 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);
}

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); }

/* Note: Replace "for loop" with standard memcpy if possible.
 */

/* Note: Replace "for loop" with standard memcpy if possible. */

static void MD5_memcpy (output, input, len)
POINTER output;
POINTER input;
unsigned int len;
{
  unsigned int i;

static void MD5_memcpy (output, input, len) POINTER output; POINTER input; unsigned int len; { unsigned int i;

  for (i = 0; i < len; i++)

for (i = 0; i < len; i++)

Rivest                                                         [Page 15]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

Rivest [Page 15] RFC 1321 MD5 Message-Digest Algorithm April 1992

 output[i] = input[i];
}

output[i] = input[i]; }

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

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

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

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

A.4 mddriver.c

A.4 mddriver.c

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

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

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

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

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. 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.

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

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

/* The following makes MD default to MD5 if it has not already been defined with C compiler flags. */ #ifndef MD #define 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 <stdio.h> #include <time.h> #include <string.h> #include "global.h" #if MD == 2 #include "md2.h" #endif #if MD == 4

Rivest                                                         [Page 16]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

#include "md4.h"
#endif
#if MD == 5
#include "md5.h"
#endif

##MD=5#、が"md5.h"#endifを含んでいるなら、"md4.h"#endifを含めてください。

/* 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
#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

#MD=2#、がCTX#が定義するMD_CTX MD2_を定義するならMDInit MD2Init#がMDUpdate MD2Update#を定義する、MDFinal MD2Finalを定義してください、##MD=4#、がCTX#が定義するMD_CTX MD4_を定義するならendifに、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;

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

Rivest                                                         [Page 17]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

char *argv[];
{
  int i;

*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)
char *string;
{
  MD_CTX context;
  unsigned char digest[16];
  unsigned int len = strlen (string);

/*は、ストリングを消化して、結果を印刷します。 */静的な空のMDString(ストリング)は*ストリングを炭にします。 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)

Rivest                                                         [Page 18]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

  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 ("\nTime = %ld seconds\n", (long)(endTime-startTime));
  printf
 ("Speed = %ld bytes/second\n",
  (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime));
}

printf(「\nをします」)。 printf(「ダイジェスト=」)。 MDPrint(ダイジェスト)。 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
 ("1234567890123456789012345678901234567890\
1234567890123456789012345678901234567890");
}

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

/* Digests a file and prints the result.

/*は、ファイルを読みこなして、結果を印刷します。

Rivest                                                         [Page 19]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

 */
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 ("\n");
  }
}

printf(「MD%d(%s)=」、MD、ファイル名)。 MDPrint(ダイジェスト)。 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]。 {

Rivest                                                         [Page 20]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

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

  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 MD5 test suite (driver option "-x") should print the following
   results:

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

MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("123456789012345678901234567890123456789012345678901234567890123456
78901234567890") = 57edf4a22be3c955ac49da2e2107b67a

MD5はスイートをテストします: MD5、(「「)、= 900150983cd24fb0d6963f7d28e17f72 MD5(「メッセージダイジェスト」)=d41d8cd98f00b204e9800998ecf8427e MD5(“a")=0cc175b9c0f1b6a831c399e269772661 MD5("abc")=f96b697d7cb7938d525a2f31aaf161d0 MD5("abcdefghijklmnopqrstuvwxyz")=c3fcd3d76192e4007dfb496cca67e13b MD5("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")=d174ab98d277d9f5a5611c2c9f419d9f MD5(「123456789012345678901234567890123456789012345678901234567890123456 78901234567890」)が57edf4a22be3c955ac49da2e2107b67aと等しい、」

Security Considerations

セキュリティ問題

   The level of security discussed in this memo is considered to be
   sufficient for implementing very high security hybrid digital-
   signature schemes based on MD5 and a public-key cryptosystem.

このメモで議論したセキュリティのレベルがMD5に基づくセキュリティの非常に高いハイブリッドデジタル署名体系と公開カギ暗号系を実行するのに十分であると考えられます。

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 21]

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

一覧

 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 

スポンサーリンク

ftp FTPサーバーに接続し,ファイル転送を行う

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

上に戻る