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ページ]
一覧
スポンサーリンク