RFC3174 日本語訳

3174 US Secure Hash Algorithm 1 (SHA1). D. Eastlake 3rd, P. Jones. September 2001. (Format: TXT=35525 bytes) (Updated by RFC4634) (Status: INFORMATIONAL)
プログラムでの自動翻訳です。
英語原文

Network Working Group                                   D. Eastlake, 3rd
Request for Comments: 3174                                      Motorola
Category: Informational                                         P. Jones
                                                           Cisco Systems
                                                          September 2001

ワーキンググループのD.イーストレーク、コメントを求める第3要求をネットワークでつないでください: 3174年のモトローラカテゴリ: 情報のP.ジョーンズシスコシステムズ2001年9月

                   US Secure Hash Algorithm 1 (SHA1)

米国の安全な細切れ肉料理アルゴリズム1(SHA1)

Status of this Memo

このMemoの状態

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

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

Copyright Notice

版権情報

   Copyright (C) The Internet Society (2001).  All Rights Reserved.

Copyright(C)インターネット協会(2001)。 All rights reserved。

Abstract

要約

   The purpose of this document is to make the SHA-1 (Secure Hash
   Algorithm 1) hash algorithm conveniently available to the Internet
   community.  The United States of America has adopted the SHA-1 hash
   algorithm described herein as a Federal Information Processing
   Standard.  Most of the text herein was taken by the authors from FIPS
   180-1.  Only the C code implementation is "original".

このドキュメントの目的はSHA-1(安全なHash Algorithm1)細切れ肉料理アルゴリズムを便利にインターネットコミュニティに利用可能にすることです。 アメリカ合衆国はここに連邦情報処理基準として記述されたSHA-1細切れ肉料理アルゴリズムを採用しました。 テキストの大部分は作者によってFIPS180-1からここに取られました。 Cコード実現だけが「オリジナルです」。

Acknowledgements

承認

   Most of the text herein was taken from [FIPS 180-1].  Only the C code
   implementation is "original" but its style is similar to the
   previously published MD4 and MD5 RFCs [RFCs 1320, 1321].

[FIPS180-1]からテキストの大部分をここに取りました。 Cコード実現だけが「オリジナルです」が、スタイルは以前に発行されたMD4とMD5 RFCs[RFCs1320、1321]と同様です。

   The SHA-1 is based on principles similar to those used by Professor
   Ronald L. Rivest of MIT when designing the MD4 message digest
   algorithm [MD4] and is modeled after that algorithm [RFC 1320].

SHA-1はMD4メッセージダイジェストアルゴリズム[MD4]を設計するときMITのロナルドL.Rivest教授によって使用されたものと同様の原則に基づいていて、そのアルゴリズム[RFC1320]に倣われます。

   Useful comments from the following, which have been incorporated
   herein, are gratefully acknowledged:

ここに法人組織であった以下からの役に立つコメントは感謝して承諾されます:

      Tony Hansen
      Garrett Wollman

トニー・ハンセン・ギャレット・ウォルマン

Eastlake & Jones             Informational                      [Page 1]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[1ページ]のRFC3174米国

Table of Contents

目次

   1. Overview of Contents...........................................  2
   2. Definitions of Bit Strings and Integers........................  3
   3. Operations on Words............................................  3
   4. Message Padding................................................  4
   5. Functions and Constants Used...................................  6
   6. Computing the Message Digest...................................  6
   6.1 Method 1......................................................  6
   6.2 Method 2......................................................  7
   7. C Code.........................................................  8
   7.1 .h file.......................................................  8
   7.2 .c file....................................................... 10
   7.3 Test Driver................................................... 18
   8. Security Considerations........................................ 20
   References........................................................ 21
   Authors' Addresses................................................ 21
   Full Copyright Statement.......................................... 22

1. コンテンツの概観… 2 2. ビット列と整数の定義… 3 3. ワーズにおける操作… 3 4. メッセージ詰め物… 4 5. 機能と使用される定数… 6 6. メッセージダイジェストを計算します… 6 6.1 方法1… 6 6.2 方法2… 7 7. Cコード… 8 7.1.hファイル… 8 7.2.cファイル… 10 7.3 ドライバーをテストしてください… 18 8. セキュリティ問題… 20の参照箇所… 21人の作者のアドレス… 21 完全な著作権宣言文… 22

1. Overview of Contents

1. コンテンツの概観

   NOTE: The text below is mostly taken from [FIPS 180-1] and assertions
   therein of the security of SHA-1 are made by the US Government, the
   author of [FIPS 180-1], and not by the authors of this document.

以下に注意してください。 そこにSHA-1のセキュリティについて[FIPS180-1]と主張から以下のテキストをほとんど取ります。このドキュメントの作者ではなく、米国政府、[FIPS180-1]の作者が作ります。

   This document specifies a Secure Hash Algorithm, SHA-1, for computing
   a condensed representation of a message or a data file.  When a
   message of any length < 2^64 bits is input, the SHA-1 produces a
   160-bit output called a message digest.  The message digest can then,
   for example, be input to a signature algorithm which generates or
   verifies the signature for the message.  Signing the message digest
   rather than the message often improves the efficiency of the process
   because the message digest is usually much smaller in size than the
   message.  The same hash algorithm must be used by the verifier of a
   digital signature as was used by the creator of the digital
   signature.  Any change to the message in transit will, with very high
   probability, result in a different message digest, and the signature
   will fail to verify.

このドキュメントはSecure Hash Algorithm、メッセージの凝縮した表現を計算するためのSHA-1またはデータファイルを指定します。 どんな長さ<2の^に関するメッセージであるときにも、64ビットは入力されて、SHA-1はメッセージダイジェストと呼ばれる160ビットの出力を起こします。 そして、例えば、メッセージのための署名について発生するか、または確かめる署名アルゴリズムにメッセージダイジェストを入力できます。 メッセージよりむしろメッセージダイジェストにサインすると、メッセージダイジェストがメッセージよりはるかにサイズが通常小さいので、過程の効率はしばしば高められます。 デジタル署名の創造者によって使用されたデジタル署名の検証で同じ細切れ肉料理アルゴリズムを使用しなければなりません。 異なったメッセージダイジェスト、および署名における結果は、トランジットにおけるメッセージへのどんな変化もそうするでしょう、非常に高い確率で確かめないでしょう。

   The SHA-1 is called secure because it is computationally infeasible
   to find a message which corresponds to a given message digest, or to
   find two different messages which produce the same message digest.
   Any change to a message in transit will, with very high probability,
   result in a different message digest, and the signature will fail to
   verify.

与えられたメッセージダイジェストに対応するメッセージを見つけるか、または同じメッセージダイジェストを作成する2つの異なったメッセージを見つけるのが計算上実行不可能であるので、SHA-1は安全であると呼ばれます。 異なったメッセージダイジェスト、および署名における結果は、トランジットにおけるメッセージへのどんな変化もそうするでしょう、非常に高い確率で確かめないでしょう。

Eastlake & Jones             Informational                      [Page 2]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[2ページ]のRFC3174米国

   Section 2 below defines the terminology and functions used as
   building blocks to form SHA-1.

以下のセクション2はSHA-1を形成するのにブロックとして使用される用語と機能を定義します。

2. Definitions of Bit Strings and Integers

2. ビット列と整数の定義

   The following terminology related to bit strings and integers will be
   used:

ビット列と整数に関連する以下の用語は使用されるでしょう:

   a. A hex digit is an element of the set {0, 1, ... , 9, A, ... , F}.
      A hex digit is the representation of a 4-bit string.  Examples:  7
      = 0111, A = 1010.

a。 十六進法ケタはセットの要素です。0、1、…、9、A、…、F。 十六進法ケタは4ビット列の表現です。 例: 7 = 0111、=1010。

   b. A word equals a 32-bit string which may be represented as a
      sequence of 8 hex digits.  To convert a word to 8 hex digits each
      4-bit string is converted to its hex equivalent as described in
      (a) above.  Example:

b。 単語は8十六進法ケタの系列として表されるかもしれない32ビット列と等しいです。 8十六進法ケタに単語を変換するために、各4ビット列が上で(a)で説明されるように十六進法同等物に変換されます。 例:

      1010 0001 0000 0011 1111 1110 0010 0011 = A103FE23.

1010 0001 0000 0011 1111 1110 0010 0011はA103FE23と等しいです。

   c. An integer between 0 and 2^32 - 1 inclusive may be represented as
      a word.  The least significant four bits of the integer are
      represented by the right-most hex digit of the word
      representation.  Example: the integer 291 = 2^8+2^5+2^1+2^0 =
      256+32+2+1 is represented by the hex word, 00000123.

c。 0と2の間で^32--1包括的な整数は単語として表されるかもしれません。 整数の最も重要でない4ビットは表現という単語の最も権利十六進法ケタによって表されます。 例: the integer 291 = 2^8+2^5+2^1+2^0 = 256+32+2+1 is represented by the hex word, 00000123.

      If z is an integer, 0 <= z < 2^64, then z = (2^32)x + y where 0 <=
      x < 2^32 and 0 <= y < 2^32.  Since x and y can be represented as
      words X and Y, respectively, z can be represented as the pair of
      words (X,Y).

zが整数であるなら、0<はz<2^64と等しいです、y次に、0<がx<2^32と0<と等しいz=(2^32)x+y=<2^32。 単語XとYとしてxとyを表すことができるので、それぞれ、単語(X、Y)の組としてzを表すことができます。

   d. block = 512-bit string.  A block (e.g., B) may be represented as a
      sequence of 16 words.

d. ブロックは512ビット列と等しいです。 ブロック(例えば、B)は16の単語の続きとして表されるかもしれません。

3. Operations on Words

3. ワーズにおける操作

   The following logical operators will be applied to words:

以下の論理演算子は単語に適用されるでしょう:

   a. Bitwise logical word operations

a。 論理語操作をBitwiseします。

      X AND Y  =  bitwise logical "and" of  X and Y.

XとY=はXとYの論理的な“and"をbitwiseします。

      X OR Y   =  bitwise logical "inclusive-or" of X and Y.

または、X OR Y=が論理的にbitwiseされる、「包括的である、-、」 XとYについて。

      X XOR Y  =  bitwise logical "exclusive-or" of X and Y.

X XOR Y=はXとYの論理的な「排他的論理和」をbitwiseします。

      NOT X    =  bitwise logical "complement" of X.

どんなX=もXの論理的な「補数」をbitwiseしません。

Eastlake & Jones             Informational                      [Page 3]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[3ページ]のRFC3174米国

      Example:

例:

               01101100101110011101001001111011
         XOR   01100101110000010110100110110111
               --------------------------------
           =   00001001011110001011101111001100

01101100101110011101001001111011 XOR01100101110000010110100110110111-------------------------------- = 00001001011110001011101111001100

   b. The operation X + Y is defined as follows:  words X and Y
      represent integers x and y, where 0 <= x < 2^32 and 0 <= y < 2^32.
      For positive integers n and m, let n mod m be the remainder upon
      dividing n by m.  Compute

b。 操作X+Yは以下の通り定義されます: 単語XとYは整数xを表します、そして、y(0<はx<2^32と0<と等しい)はy<2^32と等しいです。 正の整数nとmに関しては、nをm割るとき、nモッズmが残りであることをさせてください。 計算してください。

         z  =  (x + y) mod 2^32.

zはモッズ2^32と等しいです(x+y)。

      Then 0 <= z < 2^32.  Convert z to a word,  Z, and define Z = X +
      Y.

そして、0<はz<2^32と等しいです。 Z、zを単語に変換してください、そして、Z=X+Yを定義してください。

   c. The circular left shift operation S^n(X), where X is a word and n
      is an integer with 0 <= n < 32, is defined by

c。 Xが単語であり、nがn0<がある整数=<32であり、定義されるところのそばの左の円形のシフト操作S^n(X)

         S^n(X)  =  (X << n) OR (X >> 32-n).

S^n(X)はOR(X>>32-n)と等しいです(X<<n)。

      In the above, X << n is obtained as follows: discard the left-most
      n bits of X and then pad the result with n zeroes on the right
      (the result will still be 32 bits).  X >> n is obtained by
      discarding the right-most n bits of X and then padding the result
      with n zeroes on the left.  Thus S^n(X) is equivalent to a
      circular shift of X by n positions to the left.

上記に、以下の通りX<<nを入手します: Xのn最も左のビットを捨ててください、そして、次に、nゼロが右にある状態で、結果を水増ししてください(結果はまだ32ビットになっているでしょう)。 Xのn最も権利ビットを捨てて、次に、nゼロが左にある状態で結果を水増しすることによって、X>>nを入手します。 したがって、S^n(X)は左へのn位置によるXの循環シフトに同等です。

4. Message Padding

4. メッセージ詰め物

   SHA-1 is used to compute a message digest for a message or data file
   that is provided as input.  The message or data file should be
   considered to be a bit string.  The length of the message is the
   number of bits in the message (the empty message has length 0).  If
   the number of bits in a message is a multiple of 8, for compactness
   we can represent the message in hex.  The purpose of message padding
   is to make the total length of a padded message a multiple of 512.
   SHA-1 sequentially processes blocks of 512 bits when computing the
   message digest.  The following specifies how this padding shall be
   performed.  As a summary, a "1" followed by m "0"s followed by a 64-
   bit integer are appended to the end of the message to produce a
   padded message of length 512 * n.  The 64-bit integer is the length
   of the original message.  The padded message is then processed by the
   SHA-1 as n 512-bit blocks.

SHA-1は、入力されるように提供されるメッセージかデータファイルのためにメッセージダイジェストを計算するのに使用されます。 メッセージかデータファイルがしばらくストリングであると考えられるべきです。 メッセージの長さはメッセージのビットの数(空のメッセージには、長さ0がある)です。 メッセージのビットの数が8の倍数であるなら、コンパクト性のために、私たちは十六進法におけるメッセージを表すことができます。 メッセージ詰め物の目的はそっと歩いているメッセージの全長を512の倍数にすることです。 メッセージダイジェストを計算するとき、SHA-1は512ビットのブロックを連続して処理します。 以下はこの詰め物がどう実行されるかを指定します。 1インチはm続きました。概要、a、「「長さ512*nのそっと歩いているメッセージを出すメッセージの終わりまで0"sを追加して、続いて64の噛み付いている整数を追加します」 64ビットの整数はオリジナルのメッセージの長さです。 そして、そっと歩いているメッセージはn512ビットのブロックとしてSHA-1によって処理されます。

Eastlake & Jones             Informational                      [Page 4]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[4ページ]のRFC3174米国

   Suppose a message has length l < 2^64.  Before it is input to the
   SHA-1, the message is padded on the right as follows:

メッセージには長さl<2^64があると仮定してください。 それがSHA-1に入力される前に、メッセージは以下の右で水増しされます:

   a. "1" is appended.  Example: if the original message is "01010000",
      this is padded to "010100001".

a。 「1インチを追加します。」 例: オリジナルのメッセージが「01010000」であるなら、これは「010100001」に水増しされます。

   b. "0"s are appended.  The number of "0"s will depend on the original
      length of the message.  The last 64 bits of the last 512-bit block
      are reserved

b。 「0"sを追加します。」 「0"sをメッセージの原長に依存する」数。 最後の512ビットのブロックの最後の64ビットは予約されています。

      for the length l of the original message.

オリジナルのメッセージの長さlのために。

      Example:  Suppose the original message is the bit string

例: オリジナルのメッセージがビット列であると仮定してください。

         01100001 01100010 01100011 01100100 01100101.

01100001 01100010 01100011 01100100 01100101.

      After step (a) this gives

ステップ(a)のときにこれが与える後

         01100001 01100010 01100011 01100100 01100101 1.

01100001 01100010 01100011 01100100 01100101 1.

      Since l = 40, the number of bits in the above is 41 and 407 "0"s
      are appended, making the total now 448.  This gives (in hex)

l=40以来、上記のビットの数は41であり、407は「0"sを追加します、合計を現在の448にして」です。 これは与えます。(十六進法における)

         61626364 65800000 00000000 00000000
         00000000 00000000 00000000 00000000
         00000000 00000000 00000000 00000000
         00000000 00000000.

61626364 65800000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000.

   c. Obtain the 2-word representation of l, the number of bits in the
      original message.  If l < 2^32 then the first word is all zeroes.
      Append these two words to the padded message.

c。 lの2単語の表現、オリジナルのメッセージのビットの数を得てください。 l<2^32であるなら、最初の単語はすべてゼロです。 これらの2つの単語をそっと歩いているメッセージに追加してください。

      Example: Suppose the original message is as in (b).  Then l = 40
      (note that l is computed before any padding).  The two-word
      representation of 40 is hex 00000000 00000028.  Hence the final
      padded message is hex

例: オリジナルのメッセージが(b)にあると仮定してください。 そして、l=40(lがどんな詰め物の前にも計算されることに注意します)。 40の2単語の表現は十六進法00000000 00000028です。 したがって、最終的なそっと歩いているメッセージは十六進法です。

         61626364 65800000 00000000 00000000
         00000000 00000000 00000000 00000000
         00000000 00000000 00000000 00000000
         00000000 00000000 00000000 00000028.

61626364 65800000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000028.

      The padded message will contain 16 * n words for some n > 0.
      The padded message is regarded as a sequence of n blocks M(1) ,
      M(2), first characters (or bits) of the message.

そっと歩いているメッセージは何らかのn>0に対する16*n単語を含むでしょう。 そっと歩いているメッセージはメッセージのnブロックM(1)、M(2)の最初のキャラクタ(または、ビット)の系列と見なされます。

Eastlake & Jones             Informational                      [Page 5]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[5ページ]のRFC3174米国

5. Functions and Constants Used

5. 機能と使用される定数

   A sequence of logical functions f(0), f(1),..., f(79) is used in
   SHA-1.  Each f(t), 0 <= t <= 79, operates on three 32-bit words B, C,
   D and produces a 32-bit word as output.  f(t;B,C,D) is defined as
   follows: for words B, C, D,

論理関数f(0)、f(1)の系列…, f(79)はSHA-1で使用されます。 各f(t)、0<はt<=79と等しく、3つの32ビットの単語B、C、Dを作動させて、出力されるように32ビットの単語を作り出します。f(t; B、C、D)は以下の通り定義されます: 単語B、C、Dのために

      f(t;B,C,D) = (B AND C) OR ((NOT B) AND D)         ( 0 <= t <= 19)

f(t; BかCか(B AND C)か(NOT B)とD)=D)(t<0<==19)

      f(t;B,C,D) = B XOR C XOR D                        (20 <= t <= 39)

B XOR C f(t; B、C、D)=XOR D(t<20<==39)

      f(t;B,C,D) = (B AND C) OR (B AND D) OR (C AND D)  (40 <= t <= 59)

(B AND C)か(B AND D)かf(t; B、C、D)=(CとD)(t<40<==59)

      f(t;B,C,D) = B XOR C XOR D                        (60 <= t <= 79).

f(t; B、C、D)はB XOR C XOR D(60<はt<=79と等しいです)と等しいです。

   A sequence of constant words K(0), K(1), ... , K(79) is used in the
   SHA-1.  In hex these are given by

定数の系列はK(0)、K(1)を言い表します… , K(79)はSHA-1で使用されます。 これらが与えられる十六進法で

      K(t) = 5A827999         ( 0 <= t <= 19)

K(t)は5A827999と等しいです。(t<0<==19)

      K(t) = 6ED9EBA1         (20 <= t <= 39)

K(t)は6ED9EBA1と等しいです。(t<20<==39)

      K(t) = 8F1BBCDC         (40 <= t <= 59)

K(t)は8F1BBCDCと等しいです。(t<40<==59)

      K(t) = CA62C1D6         (60 <= t <= 79).

K(t)はCA62C1D6と等しいです(60<はt<=79と等しいです)。

6. Computing the Message Digest

6. メッセージダイジェストを計算します。

   The methods given in 6.1 and 6.2 below yield the same message digest.
   Although using method 2 saves sixty-four 32-bit words of storage, it
   is likely to lengthen execution time due to the increased complexity
   of the address computations for the { W[t] } in step (c).  There are
   other computation methods which give identical results.

6.1と6.2で以下に与えられた方法は同じメッセージダイジェストをもたらします。 使用方法2は格納の64の32ビットの単語を保存しますが、それはステップ(c)におけるW[t]のためにアドレス計算の増加する複雑さに実行時間の支払われるべきものを伸しそうです。 同じ結果を与える他の計算方法があります。

6.1 Method 1

6.1 方法1

   The message digest is computed using the message padded as described
   in section 4.  The computation is described using two buffers, each
   consisting of five 32-bit words, and a sequence of eighty 32-bit
   words.  The words of the first 5-word buffer are labeled A,B,C,D,E.
   The words of the second 5-word buffer are labeled H0, H1, H2, H3, H4.
   The words of the 80-word sequence are labeled W(0), W(1),..., W(79).
   A single word buffer TEMP is also employed.

メッセージダイジェストは、セクション4で説明されるように水増しされたメッセージを使用することで計算されます。 5つの32ビットの単語、および80の32ビットの単語の続きからそれぞれ成って、計算は、2つのバッファを使用することで説明されます。 E、最初の5単語のバッファの単語はA、B、C、Dとラベルされます。 2番目の5単語のバッファの単語はH0、H1、H2、H3、H4とラベルされます。 80単語の系列の単語はW(0)、W(1)とラベルされます…, W(79)。 また、一語バッファTEMPは使われます。

   To generate the message digest, the 16-word blocks M(1), M(2),...,
   M(n) defined in section 4 are processed in order.  The processing of
   each M(i) involves 80 steps.

メッセージダイジェストを発生させるように、16単語がM(1)、M(2)を妨げます…, セクション4で定義されたM(n)は整然とした状態で処理されます。 それぞれのM(i)の処理は80ステップにかかわります。

Eastlake & Jones             Informational                      [Page 6]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[6ページ]のRFC3174米国

   Before processing any blocks, the H's are initialized as follows: in
   hex,

どんなブロックも処理する前に、Hのものは以下の通り初期化されます: 十六進法で

      H0 = 67452301

H0=67452301

      H1 = EFCDAB89

H1はEFCDAB89と等しいです。

      H2 = 98BADCFE

H2は98BADCFEと等しいです。

      H3 = 10325476

H3=10325476

      H4 = C3D2E1F0.

H4はC3D2E1F0と等しいです。

   Now M(1), M(2), ... , M(n) are processed.  To process M(i), we
   proceed as follows:

現在のM(1)、M(2)… , M(n)は処理されます。 M(i)を処理するために、私たちは以下の通り続きます:

      a. Divide M(i) into 16 words W(0), W(1), ... , W(15), where W(0)
         is the left-most word.

a。 M(i)を16の単語W(0)、W(1)、…に分割してください。 , W(15)。(そこでは、W(0)が最も左の単語です)。

      b. For t = 16 to 79 let

b。 16〜79がさせるt=のために

         W(t) = S^1(W(t-3) XOR W(t-8) XOR W(t-14) XOR W(t-16)).

W(t)はS^1と等しいです(W(t-3)XOR W(t-8)XOR W(t-14)XOR W(t-16))。

      c. Let A = H0, B = H1, C = H2, D = H3, E = H4.

c。 =H0をさせてください、そして、BはH1と等しく、CはH2と等しく、DはH3と等しく、EはH4と等しいです。

      d. For t = 0 to 79 do

d。 0〜79がするt=のために

         TEMP = S^5(A) + f(t;B,C,D) + E + W(t) + K(t);

臨時はS^5(A)+f(t; B、C、D)+E+W(t)+K(t)と等しいです。

         E = D;  D = C;  C = S^30(B);  B = A; A = TEMP;

EはDと等しいです。 DはCと等しいです。 CはS^30(B)と等しいです。 BはAと等しいです。 =臨時。

      e. Let H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4
         + E.

e。 H0にH1+B、H2=H2+C、H3H0+A、H1==H3+Dと等しくしいさせてください、H4=H4+E。

   After processing M(n), the message digest is the 160-bit string
   represented by the 5 words

M(n)を処理した後に、メッセージダイジェストは5つの単語によって表された160ビット列です。

         H0 H1 H2 H3 H4.

H0 H1 H2 H3 H4。

6.2 Method 2

6.2 方法2

   The method above assumes that the sequence W(0), ... , W(79) is
   implemented as an array of eighty 32-bit words.  This is efficient
   from the standpoint of minimization of execution time, since the
   addresses of W(t-3), ...  ,W(t-16) in step (b) are easily computed.
   If space is at a premium, an alternative is to regard { W(t) } as a

上の方法は、それが系列W(0)であると仮定します… , W(79)は80の32ビットの単語の勢ぞろいとして実行されます。 W(t-3)のアドレス以来これは実行時間の最小化の見地から効率的です… W中の(t-16)ステップ(b) 容易に計算されます。 プレミアムにスペースがあるなら、代替手段はW(t)をaと見なすことです。

Eastlake & Jones             Informational                      [Page 7]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[7ページ]のRFC3174米国

   circular queue, which may be implemented using an array of sixteen
   32-bit words W[0], ... W[15].  In this case, in hex let

円形の待ち行列…(それは、16の32ビットの単語W[0]のアレイを使用することで実行されるかもしれません)。 W[15]。 この場合十六進法がさせたコネ

   MASK = 0000000F.  Then processing of M(i) is as follows:

=0000000Fにマスクをかけてください。 次に、M(i)の処理は以下の通りです:

      a. Divide M(i) into 16 words W[0], ... , W[15], where W[0] is the
         left-most word.

a。 M(i)を16の単語W[0]、…に分割してください。 , W[15]。(そこでは、W[0]が最も左の単語です)。

      b. Let A = H0, B = H1, C = H2, D = H3, E = H4.

b。 =H0をさせてください、そして、BはH1と等しく、CはH2と等しく、DはH3と等しく、EはH4と等しいです。

      c. For t = 0 to 79 do

c。 0〜79がするt=のために

         s = t AND MASK;

sはt AND MASKと等しいです。

         if (t >= 16) W[s] = S^1(W[(s + 13) AND MASK] XOR W[(s + 8) AND
         MASK] XOR W[(s + 2) AND MASK] XOR W[s]);

マスク] (t>=16)W[s]はS^1(W(s+13)ANDマスク]XOR W(s+8)と等しいかどうか、そして、XOR W[(s+2)ANDマスク]XOR W[s])。

         TEMP = S^5(A) + f(t;B,C,D) + E + W[s] + K(t);

臨時はS^5(A)+f(t; B、C、D)+E+W[s]+K(t)と等しいです。

         E = D; D = C; C = S^30(B); B = A; A = TEMP;

EはDと等しいです。 DはCと等しいです。 CはS^30(B)と等しいです。 BはAと等しいです。 =臨時。

      d. Let H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4
         + E.

d。 H0にH1+B、H2=H2+C、H3H0+A、H1==H3+Dと等しくしいさせてください、H4=H4+E。

7. C Code

7. Cコード

   Below is a demonstration implementation of SHA-1 in C.  Section 7.1
   contains the header file, 7.2 the C code, and 7.3 a test driver.

以下に、C.セクション7.1における、SHA-1の実現がヘッダーファイル、Cがコード化する7.2、および1テスト・ドライバあたり7.3を含んでいるというデモンストレーションがあります。

7.1 .h file

7.1 . hファイル

/*
 *  sha1.h
 *
 *  Description:
 *      This is the header file for code which implements the Secure
 *      Hashing Algorithm 1 as defined in FIPS PUB 180-1 published
 *      April 17, 1995.
 *
 *      Many of the variable names in this code, especially the
 *      single character names, were used because those were the names
 *      used in the publication.
 *
 *      Please read the file sha1.c for more information.
 *
 */

/**sha1.h**記述: * これは*1995年4月17日に発行されたFIPS PUB180-1で定義されるようにAlgorithm1を論じ尽くしながらSecure*を実行するコードのためのヘッダーファイルです。 * * それらが公表で使用される名前*であったので、このコードの変数名の多く(特に*ただ一つのキャラクタ名)が使用されました。 * * 詳しい情報のためにファイルsha1.cを読んでください。 * */

Eastlake & Jones             Informational                      [Page 8]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[8ページ]のRFC3174米国

#ifndef _SHA1_H_
#define _SHA1_H_

#ifndef_SHA1_H_ #は_SHA1_H_を定義します。

#include <stdint.h>
/*
 * If you do not have the ISO standard stdint.h header file, then you
 * must typdef the following:
 *    name              meaning
 *  uint32_t         unsigned 32 bit integer
 *  uint8_t          unsigned 8 bit integer (i.e., unsigned char)
 *  int_least16_t    integer of >= 16 bits
 *
 */

#*あなたにISOの標準のstdint.hヘッダーがないなら、インクルード<stdint.h>/*はファイルされて、次に、あなたは*必須typdef以下です: * >の名前32ビットの無記名の無記名の意味*uint32の_のtの整数*uint8の_のtの8ビットの整数(すなわち、無記名の炭)*int_least16_t整数は16ビット**/と等しいです。

#ifndef _SHA_enum_
#define _SHA_enum_
enum
{
    shaSuccess = 0,
    shaNull,            /* Null pointer parameter */
    shaInputTooLong,    /* input data too long */
    shaStateError       /* called Input after Result */
};
#endif
#define SHA1HashSize 20

#ifndef_SHA_enum_ #は_SHA_enum_enumを定義します。shaSuccess=0、shaNull、/*ヌルポインタパラメタ*/shaInputTooLong、Result*/*は次々とInputと呼ばれるデータ長過ぎる*/ shaStateError /*を入力しました。 #endif#はSHA1HashSize20を定義します。

/*
 *  This structure will hold context information for the SHA-1
 *  hashing operation
 */
typedef struct SHA1Context
{
    uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest  */

SHA-1*のための保持文脈情報が操作*/typedef struct SHA1Contextを論じ尽くして、この構造がそうする/**、uint32_t Intermediate_Hash[SHA1HashSize/4]; /*メッセージDigest*/

    uint32_t Length_Low;            /* Message length in bits      */
    uint32_t Length_High;           /* Message length in bits      */

uint32_t Length_Low。 ビット*/uint32_t Length_Highの/*メッセージ長。 ビット*/の/*メッセージ長

                               /* Index into message block array   */
    int_least16_t Message_Block_Index;
    uint8_t Message_Block[64];      /* 512-bit message blocks      */

_メッセージブロックアレイ*/int least16_t Message_Block_Indexへの/*インデックス。 uint8_t Message_Block[64]。 /*512ビットのメッセージブロック*/

    int Computed;               /* Is the digest computed?         */
    int Corrupted;             /* Is the message digest corrupted? */
} SHA1Context;

int Computed。 /*は計算されたダイジェストですか? */int Corrupted。 /*は崩壊するメッセージダイジェストですか? */ } SHA1Context。

/*
 *  Function Prototypes
 */

/**関数原型*/

Eastlake & Jones             Informational                      [Page 9]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[9ページ]のRFC3174米国

int SHA1Reset(  SHA1Context *);
int SHA1Input(  SHA1Context *,
                const uint8_t *,
                unsigned int);
int SHA1Result( SHA1Context *,
                uint8_t Message_Digest[SHA1HashSize]);

int SHA1Reset(SHA1Context*)。 int SHA1Input(SHA1Context*、const uint8_t*、無記名のint)。 int SHA1Result(SHA1Context*、uint8_t Message_Digest[SHA1HashSize])。

#endif

#endif

7.2 .c file

7.2 . cファイル

/*
 *  sha1.c
 *
 *  Description:
 *      This file implements the Secure Hashing Algorithm 1 as
 *      defined in FIPS PUB 180-1 published April 17, 1995.
 *
 *      The SHA-1, produces a 160-bit message digest for a given
 *      data stream.  It should take about 2**n steps to find a
 *      message with the same digest as a given message and
 *      2**(n/2) to find any two messages with the same digest,
 *      when n is the digest size in bits.  Therefore, this
 *      algorithm can serve as a means of providing a
 *      "fingerprint" for a message.
 *
 *  Portability Issues:
 *      SHA-1 is defined in terms of 32-bit "words".  This code
 *      uses <stdint.h> (included via "sha1.h" to define 32 and 8
 *      bit unsigned integer types.  If your C compiler does not
 *      support 32 bit unsigned integers, this code is not
 *      appropriate.
 *
 *  Caveats:
 *      SHA-1 is designed to work with messages less than 2^64 bits
 *      long.  Although SHA-1 allows a message digest to be generated
 *      for messages of any number of bits less than 2^64, this
 *      implementation only works with messages with a length that is
 *      a multiple of the size of an 8-bit character.
 *
 */

/**sha1.c**記述: * このファイルは1995年4月17日に発行されたFIPS PUB180-1で定義された*としてSecure Hashing Algorithm1を実行します。 * * SHA-1、a当然のこと*データのための160ビットのメッセージダイジェストが流す生産物。 それは2時頃に同じダイジェストでどんな2つのメッセージも見つけるために与えられたメッセージと*2**(n/2)と同じダイジェストで*メッセージを見つけるには**nステップでかかるべきです、*nがビットのダイジェストサイズであるときに。 したがって、この*アルゴリズムは*「指紋」をメッセージに提供する手段として機能できます。 * * 移植性の問題: * SHA-1は32ビットの「単語」で定義されます。 (あなたのCコンパイラがどんな*もしないなら、サポート32は符号のない整数に噛み付いて、このコードは*が. **警告を当てるということではありません。このコード*は<stdint.h>を使用します。"sha1.h"を通して含まれていて、*噛み付いている32と8符号のない整数を定義するのはタイプされます; *SHA-1は、*長い間メッセージで2未満^を64ビット扱うように設計されています。. SHA-1は、メッセージダイジェストがこの*実現が2^64より働いているだけではないいろいろなビットのメッセージのための発生している*が長さでそれを通信させるということであることを許容しますが、8ビットのキャラクタのサイズの*a倍数は**/ですか?

Eastlake & Jones             Informational                     [Page 10]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[10ページ]のRFC3174米国

#include "sha1.h"

#"sha1.h"を含めてください。

/*
 *  Define the SHA1 circular left shift macro
 */
#define SHA1CircularShift(bits,word) \
                (((word) << (bits)) | ((word) >> (32-(bits))))

/**が定義する、左のSHA1円形のシフトマクロ*/#、はSHA1CircularShift(ビット、単語)\を定義します。((単語)<<(ビット))| ((単語)>>(32(ビット)))

/* Local Function Prototyptes */
void SHA1PadMessage(SHA1Context *);
void SHA1ProcessMessageBlock(SHA1Context *);

/*地方のFunction Prototyptes*/空間SHA1PadMessage(SHA1Context*)。 SHA1ProcessMessageBlock(SHA1Context*)を欠如させてください。

/*
 *  SHA1Reset
 *
 *  Description:
 *      This function will initialize the SHA1Context in preparation
 *      for computing a new SHA1 message digest.
 *
 *  Parameters:
 *      context: [in/out]
 *          The context to reset.
 *
 *  Returns:
 *      sha Error Code.
 *
 */
int SHA1Reset(SHA1Context *context)
{
    if (!context)
    {
        return shaNull;
    }

/**SHA1Reset**記述: * この機能は新しいSHA1メッセージダイジェストを計算するための準備*でSHA1Contextを初期化するでしょう。 * * パラメタ: * 文脈: [/アウト] *のリセットする文脈。 * * リターン: * sha Error Code。 * */int SHA1Reset(SHA1Context*文脈)、(文脈)です。リターンshaNull。

    context->Length_Low             = 0;
    context->Length_High            = 0;
    context->Message_Block_Index    = 0;

文脈、->長さ_安値は0と等しいです。 文脈、->長さ_高値は0と等しいです。 メッセージ_ブロック_が索引をつける文脈->は0と等しいです。

    context->Intermediate_Hash[0]   = 0x67452301;
    context->Intermediate_Hash[1]   = 0xEFCDAB89;
    context->Intermediate_Hash[2]   = 0x98BADCFE;
    context->Intermediate_Hash[3]   = 0x10325476;
    context->Intermediate_Hash[4]   = 0xC3D2E1F0;

文脈->中間的な_細切れ肉料理[0]=0×67452301。 文脈->中間的な_細切れ肉料理[1]は0xEFCDAB89と等しいです。 文脈->中間的な_細切れ肉料理[2]は0x98BADCFEと等しいです。 文脈->中間的な_細切れ肉料理[3]=0×10325476。 文脈->中間的な_細切れ肉料理[4]は0xC3D2E1F0と等しいです。

    context->Computed   = 0;
    context->Corrupted  = 0;

文脈->が計算された=0。 文脈->が崩壊している=0。

Eastlake & Jones             Informational                     [Page 11]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[11ページ]のRFC3174米国

    return shaSuccess;
}

shaSuccessを返してください。 }

/*
 *  SHA1Result
 *
 *  Description:
 *      This function will return the 160-bit message digest into the
 *      Message_Digest array  provided by the caller.
 *      NOTE: The first octet of hash is stored in the 0th element,
 *            the last octet of hash in the 19th element.
 *
 *  Parameters:
 *      context: [in/out]
 *          The context to use to calculate the SHA-1 hash.
 *      Message_Digest: [out]
 *          Where the digest is returned.
 *
 *  Returns:
 *      sha Error Code.
 *
 */
int SHA1Result( SHA1Context *context,
                uint8_t Message_Digest[SHA1HashSize])
{
    int i;

/**SHA1Result**記述: * この機能は訪問者によって提供された*メッセージ_Digestアレイに160ビットのメッセージダイジェストを返すでしょう。 * 以下に注意してください。 細切れ肉料理の最初の八重奏は0番目の要素に格納されます、*。19番目の要素における、細切れ肉料理の最後の八重奏。 * * パラメタ: * 文脈: [/アウト] *のSHA-1細切れ肉料理について計算するのに使用する文脈。 * メッセージ_は読みこなします: ダイジェストが返される[out]*。 * * リターン: * sha Error Code。 * */int SHA1Result(SHA1Context*文脈、uint8_t Message_Digest[SHA1HashSize])、int i。

    if (!context || !Message_Digest)
    {
        return shaNull;
    }

(メッセージ_ダイジェスト| 文脈| )です。リターンshaNull。

    if (context->Corrupted)
    {
        return context->Corrupted;
    }

(文脈->は崩壊していました)文脈->にCorruptedを返してください。

    if (!context->Computed)
    {
        SHA1PadMessage(context);
        for(i=0; i<64; ++i)
        {
            /* message may be sensitive, clear it out */
            context->Message_Block[i] = 0;
        }
        context->Length_Low = 0;    /* and clear length */
        context->Length_High = 0;
        context->Computed = 1;

(文脈->、Computed)、(i=0; i<64; + + i)のためのSHA1PadMessage(文脈)、/*メッセージは機密であるかもしれなく、文脈*/>Message_Block[i]=0からそれを晴れさせてください;、文脈、-0; /*と明確な長さの文脈*/>Length_High=0;文脈->>Length_Low=Computedは1と等しいです。

Eastlake & Jones             Informational                     [Page 12]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[12ページ]のRFC3174米国

    }

}

    for(i = 0; i < SHA1HashSize; ++i)
    {
        Message_Digest[i] = context->Intermediate_Hash[i>>2]
                            >> 8 * ( 3 - ( i & 0x03 ) );
    }

(i=0; i<SHA1HashSize; + + i)のためにメッセージ_Digest[i]=文脈、-、>Intermediate_Hash[i>>2]>>8*(3--(iと0×03))。

    return shaSuccess;
}

shaSuccessを返してください。 }

/*
 *  SHA1Input
 *
 *  Description:
 *      This function accepts an array of octets as the next portion
 *      of the message.
 *
 *  Parameters:
 *      context: [in/out]
 *          The SHA context to update
 *      message_array: [in]
 *          An array of characters representing the next portion of
 *          the message.
 *      length: [in]
 *          The length of the message in message_array
 *
 *  Returns:
 *      sha Error Code.
 *
 */
int SHA1Input(    SHA1Context    *context,
                  const uint8_t  *message_array,
                  unsigned       length)
{
    if (!length)
    {
        return shaSuccess;
    }

/**SHA1Input**記述: * この機能はメッセージの次の部分*として八重奏の勢ぞろいを認めます。 * * パラメタ: * 文脈: アップデート*メッセージ_へのSHA文脈が整列させる[コネ/アウト]*: *次を表すキャラクタのアレイは*を分配します。[in]、メッセージ。 * 長さ: メッセージ_アレイ**のメッセージの長さの[in]*は戻ります: * sha Error Code。 * */int SHA1Input(SHA1Context*文脈、const uint8_t*は_アレイ、無記名の長さを通信させる)、(長さ)です。リターンshaSuccess。

    if (!context || !message_array)
    {
        return shaNull;
    }

(メッセージ_アレイ| 文脈| )です。リターンshaNull。

    if (context->Computed)
    {
        context->Corrupted = shaStateError;

(文脈->は計算されていました)、文脈->が崩壊している=shaStateError。

Eastlake & Jones             Informational                     [Page 13]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[13ページ]のRFC3174米国

        return shaStateError;
    }

shaStateErrorを返してください。 }

    if (context->Corrupted)
    {
         return context->Corrupted;
    }
    while(length-- && !context->Corrupted)
    {
    context->Message_Block[context->Message_Block_Index++] =
                    (*message_array & 0xFF);

(文脈、-、>Corrupted)、文脈->にCorruptedを返してください;、(長さ、--、文脈->、Corrupted)、文脈、-、>Message_Block、[文脈、-、>Message_Block_Index++] =(*_アレイと0xFFを通信させてください)。

    context->Length_Low += 8;
    if (context->Length_Low == 0)
    {
        context->Length_High++;
        if (context->Length_High == 0)
        {
            /* Message is too long */
            context->Corrupted = 1;
        }
    }

文脈>長さ_安値+=8。 (文脈、-、>長さ_安値=0)文脈、-、>Length_High++;、(文脈、-、>Length_High=0)、/*メッセージは長過ぎる文脈*/>Corrupted=1です。

    if (context->Message_Block_Index == 64)
    {
        SHA1ProcessMessageBlock(context);
    }

(メッセージ_ブロック_が索引をつける文脈->=64)です。SHA1ProcessMessageBlock(文脈)。

    message_array++;
    }

メッセージ_アレイ++。 }

    return shaSuccess;
}

shaSuccessを返してください。 }

/*
 *  SHA1ProcessMessageBlock
 *
 *  Description:
 *      This function will process the next 512 bits of the message
 *      stored in the Message_Block array.
 *
 *  Parameters:
 *      None.
 *
 *  Returns:
 *      Nothing.
 *
 *  Comments:

/**SHA1ProcessMessageBlock**記述: * この機能はMessage_Blockアレイに格納されたメッセージ*の次の512ビットを処理するでしょう。 * * パラメタ: * なし。 * * リターン: * 何でもない。 * * コメント:

Eastlake & Jones             Informational                     [Page 14]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

細切れ肉料理アルゴリズム1(SHA1)2001年9月に安全なイーストレークとジョーンズ情報[14ページ]のRFC3174米国

 *      Many of the variable names in this code, especially the
 *      single character names, were used because those were the
 *      names used in the publication.
 *
 *
 */
void SHA1ProcessMessageBlock(SHA1Context *context)
{
    const uint32_t K[] =    {       /* Constants defined in SHA-1   */
                            0x5A827999,
                            0x6ED9EBA1,
                            0x8F1BBCDC,
                            0xCA62C1D6
                            };
    int           t;                 /* Loop counter                */
    uint32_t      temp;              /* Temporary word value        */
    uint32_t      W[80];             /* Word sequence               */
    uint32_t      A, B, C, D, E;     /* Word buffers                */

* それらが公表で使用される*名であったので、このコードの変数名の多く(特に*ただ一つのキャラクタ名)が使用されました。 * * */空のSHA1ProcessMessageBlock(SHA1Context*文脈)、SHA-1*/0x5A827999、0x6ED9EBA1、0x8F1BBCDC、0xCA62C1D6で定義された/*const uint32_t K[]=定数; *int t;/*ループ・カウンタ*/uint32_t臨時;/一時的な単語値の*/uint32_t W[80]; /*Wordは*/uint32_t Aを配列します、B、C、D、E; /*Wordは*/をバッファリングします。

    /*
     *  Initialize the first 16 words in the array W
     */
    for(t = 0; t < 16; t++)
    {
        W[t] = context->Message_Block[t * 4] << 24;
        W[t] |= context->Message_Block[t * 4 + 1] << 16;
        W[t] |= context->Message_Block[t * 4 + 2] << 8;
        W[t] |= context->Message_Block[t * 4 + 3];
    }

/* * Initialize the first 16 words in the array W */ for(t = 0; t < 16; t++) { W[t] = context->Message_Block[t * 4] << 24; W[t] |= context->Message_Block[t * 4 + 1] << 16; W[t] |= context->Message_Block[t * 4 + 2] << 8; W[t] |= context->Message_Block[t * 4 + 3]; }

    for(t = 16; t < 80; t++)
    {
       W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
    }

for(t = 16; t < 80; t++) { W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); }

    A = context->Intermediate_Hash[0];
    B = context->Intermediate_Hash[1];
    C = context->Intermediate_Hash[2];
    D = context->Intermediate_Hash[3];
    E = context->Intermediate_Hash[4];

A = context->Intermediate_Hash[0]; B = context->Intermediate_Hash[1]; C = context->Intermediate_Hash[2]; D = context->Intermediate_Hash[3]; E = context->Intermediate_Hash[4];

    for(t = 0; t < 20; t++)
    {
        temp =  SHA1CircularShift(5,A) +
                ((B & C) | ((~B) & D)) + E + W[t] + K[0];
        E = D;
        D = C;
        C = SHA1CircularShift(30,B);

for(t = 0; t < 20; t++) { temp = SHA1CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0]; E = D; D = C; C = SHA1CircularShift(30,B);

Eastlake & Jones             Informational                     [Page 15]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

Eastlake & Jones Informational [Page 15] RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001

        B = A;
        A = temp;
    }

B = A; A = temp; }

    for(t = 20; t < 40; t++)
    {
        temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
        E = D;
        D = C;
        C = SHA1CircularShift(30,B);
        B = A;
        A = temp;
    }

for(t = 20; t < 40; t++) { temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; E = D; D = C; C = SHA1CircularShift(30,B); B = A; A = temp; }

    for(t = 40; t < 60; t++)
    {
        temp = SHA1CircularShift(5,A) +
               ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
        E = D;
        D = C;
        C = SHA1CircularShift(30,B);
        B = A;
        A = temp;
    }

for(t = 40; t < 60; t++) { temp = SHA1CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]; E = D; D = C; C = SHA1CircularShift(30,B); B = A; A = temp; }

    for(t = 60; t < 80; t++)
    {
        temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
        E = D;
        D = C;
        C = SHA1CircularShift(30,B);
        B = A;
        A = temp;
    }

for(t = 60; t < 80; t++) { temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; E = D; D = C; C = SHA1CircularShift(30,B); B = A; A = temp; }

    context->Intermediate_Hash[0] += A;
    context->Intermediate_Hash[1] += B;
    context->Intermediate_Hash[2] += C;
    context->Intermediate_Hash[3] += D;
    context->Intermediate_Hash[4] += E;

context->Intermediate_Hash[0] += A; context->Intermediate_Hash[1] += B; context->Intermediate_Hash[2] += C; context->Intermediate_Hash[3] += D; context->Intermediate_Hash[4] += E;

    context->Message_Block_Index = 0;
}

context->Message_Block_Index = 0; }

/*
 *  SHA1PadMessage
 *

/* * SHA1PadMessage *

Eastlake & Jones             Informational                     [Page 16]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

Eastlake & Jones Informational [Page 16] RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001

 *  Description:
 *      According to the standard, the message must be padded to an even
 *      512 bits.  The first padding bit must be a '1'.  The last 64
 *      bits represent the length of the original message.  All bits in
 *      between should be 0.  This function will pad the message
 *      according to those rules by filling the Message_Block array
 *      accordingly.  It will also call the ProcessMessageBlock function
 *      provided appropriately.  When it returns, it can be assumed that
 *      the message digest has been computed.
 *
 *  Parameters:
 *      context: [in/out]
 *          The context to pad
 *      ProcessMessageBlock: [in]
 *          The appropriate SHA*ProcessMessageBlock function
 *  Returns:
 *      Nothing.
 *
 */

* Description: * According to the standard, the message must be padded to an even * 512 bits. The first padding bit must be a '1'. The last 64 * bits represent the length of the original message. All bits in * between should be 0. This function will pad the message * according to those rules by filling the Message_Block array * accordingly. It will also call the ProcessMessageBlock function * provided appropriately. When it returns, it can be assumed that * the message digest has been computed. * * Parameters: * context: [in/out] * The context to pad * ProcessMessageBlock: [in] * The appropriate SHA*ProcessMessageBlock function * Returns: * Nothing. * */

void SHA1PadMessage(SHA1Context *context)
{
    /*
     *  Check to see if the current message block is too small to hold
     *  the initial padding bits and length.  If so, we will pad the
     *  block, process it, and then continue padding into a second
     *  block.
     */
    if (context->Message_Block_Index > 55)
    {
        context->Message_Block[context->Message_Block_Index++] = 0x80;
        while(context->Message_Block_Index < 64)
        {
            context->Message_Block[context->Message_Block_Index++] = 0;
        }

void SHA1PadMessage(SHA1Context *context) { /* * Check to see if the current message block is too small to hold * the initial padding bits and length. If so, we will pad the * block, process it, and then continue padding into a second * block. */ if (context->Message_Block_Index > 55) { context->Message_Block[context->Message_Block_Index++] = 0x80; while(context->Message_Block_Index < 64) { context->Message_Block[context->Message_Block_Index++] = 0; }

        SHA1ProcessMessageBlock(context);

SHA1ProcessMessageBlock(context);

        while(context->Message_Block_Index < 56)
        {
            context->Message_Block[context->Message_Block_Index++] = 0;
        }
    }
    else
    {
        context->Message_Block[context->Message_Block_Index++] = 0x80;
        while(context->Message_Block_Index < 56)
        {

while(context->Message_Block_Index < 56) { context->Message_Block[context->Message_Block_Index++] = 0; } } else { context->Message_Block[context->Message_Block_Index++] = 0x80; while(context->Message_Block_Index < 56) {

Eastlake & Jones             Informational                     [Page 17]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

Eastlake & Jones Informational [Page 17] RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001

            context->Message_Block[context->Message_Block_Index++] = 0;
        }
    }

context->Message_Block[context->Message_Block_Index++] = 0; } }

    /*
     *  Store the message length as the last 8 octets
     */
    context->Message_Block[56] = context->Length_High >> 24;
    context->Message_Block[57] = context->Length_High >> 16;
    context->Message_Block[58] = context->Length_High >> 8;
    context->Message_Block[59] = context->Length_High;
    context->Message_Block[60] = context->Length_Low >> 24;
    context->Message_Block[61] = context->Length_Low >> 16;
    context->Message_Block[62] = context->Length_Low >> 8;
    context->Message_Block[63] = context->Length_Low;

/* * Store the message length as the last 8 octets */ context->Message_Block[56] = context->Length_High >> 24; context->Message_Block[57] = context->Length_High >> 16; context->Message_Block[58] = context->Length_High >> 8; context->Message_Block[59] = context->Length_High; context->Message_Block[60] = context->Length_Low >> 24; context->Message_Block[61] = context->Length_Low >> 16; context->Message_Block[62] = context->Length_Low >> 8; context->Message_Block[63] = context->Length_Low;

    SHA1ProcessMessageBlock(context);
}

SHA1ProcessMessageBlock(context); }

7.3 Test Driver

7.3 Test Driver

   The following code is a main program test driver to exercise the code
   in sha1.c.

The following code is a main program test driver to exercise the code in sha1.c.

/*
 *  sha1test.c
 *
 *  Description:
 *      This file will exercise the SHA-1 code performing the three
 *      tests documented in FIPS PUB 180-1 plus one which calls
 *      SHA1Input with an exact multiple of 512 bits, plus a few
 *      error test checks.
 *
 *  Portability Issues:
 *      None.
 *
 */

/* * sha1test.c * * Description: * This file will exercise the SHA-1 code performing the three * tests documented in FIPS PUB 180-1 plus one which calls * SHA1Input with an exact multiple of 512 bits, plus a few * error test checks. * * Portability Issues: * None. * */

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sha1.h"

#include <stdint.h> #include <stdio.h> #include <string.h> #include "sha1.h"

/*
 *  Define patterns for testing
 */
#define TEST1   "abc"
#define TEST2a  "abcdbcdecdefdefgefghfghighijhi"

/* * Define patterns for testing */ #define TEST1 "abc" #define TEST2a "abcdbcdecdefdefgefghfghighijhi"

Eastlake & Jones             Informational                     [Page 18]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

Eastlake & Jones Informational [Page 18] RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001

#define TEST2b  "jkijkljklmklmnlmnomnopnopq"
#define TEST2   TEST2a TEST2b
#define TEST3   "a"
#define TEST4a  "01234567012345670123456701234567"
#define TEST4b  "01234567012345670123456701234567"
    /* an exact multiple of 512 bits */
#define TEST4   TEST4a TEST4b
char *testarray[4] =
{
    TEST1,
    TEST2,
    TEST3,
    TEST4
};
long int repeatcount[4] = { 1, 1, 1000000, 10 };
char *resultarray[4] =
{
    "A9 99 3E 36 47 06 81 6A BA 3E 25 71 78 50 C2 6C 9C D0 D8 9D",
    "84 98 3E 44 1C 3B D2 6E BA AE 4A A1 F9 51 29 E5 E5 46 70 F1",
    "34 AA 97 3C D4 C4 DA A4 F6 1E EB 2B DB AD 27 31 65 34 01 6F",
    "DE A3 56 A2 CD DD 90 C7 A7 EC ED C5 EB B5 63 93 4F 46 04 52"
};

#define TEST2b "jkijkljklmklmnlmnomnopnopq" #define TEST2 TEST2a TEST2b #define TEST3 "a" #define TEST4a "01234567012345670123456701234567" #define TEST4b "01234567012345670123456701234567" /* an exact multiple of 512 bits */ #define TEST4 TEST4a TEST4b char *testarray[4] = { TEST1, TEST2, TEST3, TEST4 }; long int repeatcount[4] = { 1, 1, 1000000, 10 }; char *resultarray[4] = { "A9 99 3E 36 47 06 81 6A BA 3E 25 71 78 50 C2 6C 9C D0 D8 9D", "84 98 3E 44 1C 3B D2 6E BA AE 4A A1 F9 51 29 E5 E5 46 70 F1", "34 AA 97 3C D4 C4 DA A4 F6 1E EB 2B DB AD 27 31 65 34 01 6F", "DE A3 56 A2 CD DD 90 C7 A7 EC ED C5 EB B5 63 93 4F 46 04 52" };

int main()
{
    SHA1Context sha;
    int i, j, err;
    uint8_t Message_Digest[20];

int main() { SHA1Context sha; int i, j, err; uint8_t Message_Digest[20];

    /*
     *  Perform SHA-1 tests
     */
    for(j = 0; j < 4; ++j)
    {
        printf( "\nTest %d: %d, '%s'\n",
                j+1,
                repeatcount[j],
                testarray[j]);

/* * Perform SHA-1 tests */ for(j = 0; j < 4; ++j) { printf( "\nTest %d: %d, '%s'\n", j+1, repeatcount[j], testarray[j]);

        err = SHA1Reset(&sha);
        if (err)
        {
            fprintf(stderr, "SHA1Reset Error %d.\n", err );
            break;    /* out of for j loop */
        }

err = SHA1Reset(&sha); if (err) { fprintf(stderr, "SHA1Reset Error %d.\n", err ); break; /* out of for j loop */ }

        for(i = 0; i < repeatcount[j]; ++i)
        {

for(i = 0; i < repeatcount[j]; ++i) {

Eastlake & Jones             Informational                     [Page 19]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

Eastlake & Jones Informational [Page 19] RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001

            err = SHA1Input(&sha,
                  (const unsigned char *) testarray[j],
                  strlen(testarray[j]));
            if (err)
            {
                fprintf(stderr, "SHA1Input Error %d.\n", err );
                break;    /* out of for i loop */
            }
        }

err = SHA1Input(&sha, (const unsigned char *) testarray[j], strlen(testarray[j])); if (err) { fprintf(stderr, "SHA1Input Error %d.\n", err ); break; /* out of for i loop */ } }

        err = SHA1Result(&sha, Message_Digest);
        if (err)
        {
            fprintf(stderr,
            "SHA1Result Error %d, could not compute message digest.\n",
            err );
        }
        else
        {
            printf("\t");
            for(i = 0; i < 20 ; ++i)
            {
                printf("%02X ", Message_Digest[i]);
            }
            printf("\n");
        }
        printf("Should match:\n");
        printf("\t%s\n", resultarray[j]);
    }

err = SHA1Result(&sha, Message_Digest); if (err) { fprintf(stderr, "SHA1Result Error %d, could not compute message digest.\n", err ); } else { printf("\t"); for(i = 0; i < 20 ; ++i) { printf("%02X ", Message_Digest[i]); } printf("\n"); } printf("Should match:\n"); printf("\t%s\n", resultarray[j]); }

    /* Test some error returns */
    err = SHA1Input(&sha,(const unsigned char *) testarray[1], 1);
    printf ("\nError %d. Should be %d.\n", err, shaStateError );
    err = SHA1Reset(0);
    printf ("\nError %d. Should be %d.\n", err, shaNull );
    return 0;
}

/* Test some error returns */ err = SHA1Input(&sha,(const unsigned char *) testarray[1], 1); printf ("\nError %d. Should be %d.\n", err, shaStateError ); err = SHA1Reset(0); printf ("\nError %d. Should be %d.\n", err, shaNull ); return 0; }

8. Security Considerations

8. Security Considerations

   This document is intended to provide convenient open source access by
   the Internet community to the United States of America Federal
   Information Processing Standard Secure Hash Function SHA-1 [FIPS
   180-1].  No independent assertion of the security of this hash
   function by the authors for any particular use is intended.

This document is intended to provide convenient open source access by the Internet community to the United States of America Federal Information Processing Standard Secure Hash Function SHA-1 [FIPS 180-1]. No independent assertion of the security of this hash function by the authors for any particular use is intended.

Eastlake & Jones             Informational                     [Page 20]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

Eastlake & Jones Informational [Page 20] RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001

References

References

   [FIPS 180-1] "Secure Hash Standard", United States of American,
                National Institute of Science and Technology, Federal
                Information Processing Standard (FIPS) 180-1, April
                1993.

[FIPS 180-1] "Secure Hash Standard", United States of American, National Institute of Science and Technology, Federal Information Processing Standard (FIPS) 180-1, April 1993.

   [MD4]        "The MD4 Message Digest Algorithm," Advances in
                Cryptology - CRYPTO '90 Proceedings, Springer-Verlag,
                1991, pp. 303-311.

[MD4] "The MD4 Message Digest Algorithm," Advances in Cryptology - CRYPTO '90 Proceedings, Springer-Verlag, 1991, pp. 303-311.

   [RFC 1320]   Rivest, R., "The MD4 Message-Digest Algorithm", RFC
                1320, April 1992.

[RFC 1320] Rivest, R., "The MD4 Message-Digest Algorithm", RFC 1320, April 1992.

   [RFC 1321]   Rivest, R., "The MD5 Message-Digest Algorithm", RFC
                1321, April 1992.

[RFC 1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, April 1992.

   [RFC 1750]   Eastlake, D., Crocker, S. and J. Schiller, "Randomness
                Requirements for Security", RFC 1750, December 1994.

[RFC 1750] Eastlake, D., Crocker, S. and J. Schiller, "Randomness Requirements for Security", RFC 1750, December 1994.

Authors' Addresses

Authors' Addresses

   Donald E. Eastlake, 3rd
   Motorola
   155 Beaver Street
   Milford, MA 01757 USA

Donald E. Eastlake, 3rd Motorola 155 Beaver Street Milford, MA 01757 USA

   Phone:   +1 508-634-2066 (h)
            +1 508-261-5434 (w)
   Fax:     +1 508-261-4777
   EMail:   Donald.Eastlake@motorola.com

Phone: +1 508-634-2066 (h) +1 508-261-5434 (w) Fax: +1 508-261-4777 EMail: Donald.Eastlake@motorola.com

   Paul E. Jones
   Cisco Systems, Inc.
   7025 Kit Creek Road
   Research Triangle Park, NC 27709 USA

Paul E. Jones Cisco Systems, Inc. 7025 Kit Creek Road Research Triangle Park, NC 27709 USA

   Phone:   +1 919 392 6948
   EMail:   paulej@packetizer.com

Phone: +1 919 392 6948 EMail: paulej@packetizer.com

Eastlake & Jones             Informational                     [Page 21]

RFC 3174           US Secure Hash Algorithm 1 (SHA1)      September 2001

Eastlake & Jones Informational [Page 21] RFC 3174 US Secure Hash Algorithm 1 (SHA1) September 2001

Full Copyright Statement

Full Copyright Statement

   Copyright (C) The Internet Society (2001).  All Rights Reserved.

Copyright (C) The Internet Society (2001). All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.

Funding for the RFC Editor function is currently provided by the Internet Society.

Eastlake & Jones             Informational                     [Page 22]

Eastlake & Jones Informational [Page 22]

一覧

 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 

スポンサーリンク

携帯用クローラーのIPアドレスとユーザーエージェント

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

上に戻る