ハッシュ関数 (intf.js)
オブジェクト: intf
必要なライブラリ:
std ※<body> より後に配置します

SHA-1
Secure Hash Algorithm (SHA) のうち、512 ビットの
ブロックに対し、160 ビットの出力を得るハッシュ関数
です。
intf.sha1i(D_) intf.sha1a(D_,  M_, O_, L_, F_)

まず、intf.sha1i を使用して初期値を設定します。
intf.sha1a にブロック区切りのメッセージを入力し、
D_ を更新します。

出力 D_ は、20 バイト (160 ビット) の Uint8Array
です。Uint8Array のメッセージ M_ について、O_
64 バイト (512 ビット) のブロックの先頭位置です。
このライブラリでは、M_ 以外も含むメッセージ全体の
長さ L_ は、バイト単位です。O_ + 64M_ の長さ
以上であるとき、L_ * 8 で表されるパディングを追加
するには、F_true にします

SHA-512
128 バイト (1024 ビット) のブロックに対し、64 バイ
ト (512 ビット) の出力を得ます。API の構成は SHA-1
と同様です。
intf.sha512i(D_) intf.sha512a(D_,  M_, O_, L_, F_)

ブロックの連結
ブロックを連結してハッシュ関数に入力する場合は、次
の API が利用できます。
intf.concat(D_,  E_, M_, L_, F_,  Ha_,  Hs_)

戻り値はメッセージの未処理の部分 (Uint8Array) で
す。intf.concat は、戻り値を E_ に代入して連結す
ることができます。Ha_ はハッシュ関数、Hs_ はブロッ
クの長さです

HMAC
Keyed-Hash Message Authentication Code (HMAC)
は、共通鍵を知る場合にハッシュ関数の出力を再現可能
にすることで、メッセージ認証を実現します。
intf.hmac_i(D_, Op_, Ip_,  P_,  Hi_, Ha_,  Hs_) intf.hmac_a0(D_,  Ip_,  Hi_, Ha_) intf.hmac_a(D_,  E_, M_, L_, Op_, F_,  Hi_, Ha_,  Hs_)

intf.hmac_iD_ は使用されません。この API は
Uint8Array の共通鍵 P_ を使用して、Ip_Op_
Uint8Array 形式で得ます。Hi_ にはハッシュ関数の
初期値を設定する API を割り当てます。HMAC の出力
D_ の長さはハッシュ関数の出力長、Ip_ および Op_
の長さはブロック長 Hs_ と等しくなります。

intf.hmac_a0 を使用して HMAC の初期値を設定し、
intf.hmac_aL_Ip_ の長さを加算します。こ
れらの API の戻り値を E_ に代入してブロックを連結し
ます

PBKDF2
Password-Based Key Derivation Function 2
(PBKDF2) は鍵導出関数であり、ハッシュ操作の回数を
増やすことで総当たり攻撃に対する耐性を向上させるこ
とができるほか、任意の出力長に対応しています。
intf.pbkdf2(K_,  P_, S_, I_,  Hi_, Ha_,  Hl_, Hs_)

K_ は出力です。任意の長さの Uint8Array を使用で
きます。S_ に乱数 (ソルト) を Uint8Array で代入し、
I_ にハッシュ操作の回数を指定します。このライブラ
リでは、ハッシュ操作は HMAC によります。HMAC は
出力長 Hl_ あたり I_ 回実行されます

SHA 実装の詳細
SHA では、圧縮関数 F の出力 D を再帰的に入力し、
最後の D をハッシュ関数 H の出力とします。
D' = F(m, D) = Em(D) + D

E はブロック暗号、m はブロック暗号の鍵として入力
されるメッセージ、+ はワード毎の加算です。メッセー
ジは、ビットの 1 で終端し、メッセージ全体 W のビッ
ト長を右端に含むパディングを追加します。これによっ
m の長さを超える場合は、F を追加します。

W の長さは、右詰めの固定長フィールドに記録します。
SHA-1  64 ビット
SHA-512  128 ビット

SHA-1:
ワードの長さを 32 ビット、m の長さを 512 ビットと
して、E を次の通りに定義します。 は XOR、Ln
n ビットの左巡回シフトを表します。mt は、m をワー
ド単位に分割したものです。D も同様に a から e に分
割します。

メッセージの拡大
 0 ≦ t < 16 の場合
  wt = mt
 16 ≦ t < 80 の場合
  wt = L1(wt - 3wt - 8
   ⊕ wt - 14wt - 16)


0 ≦ t < 80 において
 T = L5(a) + St(b, c, d) + e + kt + wt
 e = d
 d = c
 c = L30(b)
 b = a
 a = T


St(b, c, d)
 0 ≦ t < 20 の場合
  (bc) ∨ (¬bd)
 20 ≦ t < 40 の場合
  bcd
 40 ≦ t < 60 の場合
  (bc) ∨ (bd) ∨ (cd)
 60 ≦ t < 80 の場合
  bcd

論理和は、排他的論理和 (XOR) に置き換えることもで
きます。kt20 刻みの t について、235 および
10 の平方根の上位 32 ビットを割り当てた定数です。

また、a から e の初期値は 16 進数表現を辞書式順序で
組み立てた値です。
a: 76543210 b: FEDCBA98 c: 89ABCDEF d: 01234567 C D E F 3 3C e: 2 2D 1 1E 0 0F

実装では、最上位ビットが 1 である数の加算を、補数の
減算に置き換え、符号なし整数から符号付き整数に変更
しています。
St(b, c, d) + kt
 = St(b, c, d) - (232 - kt) mod 232


SHA-512:
ワードの長さは 64 ビット、m の長さは 1024 ビット
です。E の定義は次の通りです。n ビットの右巡回シフ
トを Rn、符号なし右シフトを rn とします。

メッセージの拡大
 0 ≦ t < 16 の場合
  wt = mt
 16 ≦ t < 80 の場合
  wt = σ1(wt - 2) + wt - 7
   + σ2(wt - 15) + wt - 16


0 ≦ t < 80 において
 T1 = Σ1(e) + C(e, f, g) + h + kt + wt
 T2 = Σ2(a) + M(a, b, c)
 h = g
 g = f
 f = e
 e = d + T1
 d = c
 c = b
 b = a
 a = T1 + T2


σ1(wt) = R19(wt) ⊕ R61(wt) ⊕ r6(wt)
σ2(wt) = R1(wt) ⊕ R8(wt) ⊕ r7(wt)
Σ1(e) = R14(e) ⊕ R18(e) ⊕ R41(e)
Σ2(a) = R28(a) ⊕ R34(a) ⊕ R39(a)
C(e, f, g)
 = (ef) ⊕ (¬eg)
M(a, b, c)
 = (ab) ⊕ (ac) ⊕ (bc)


kt は 80 番目の素数までの立方根における、小数部分の
上位 64 ビットです。a から h の初期値は、8 番目の素
数までの平方根について、小数部分の上位 64 ビットを
割り当てた値です。

ワードを 32 ビットで区切る場合は、上位 32 ビットに
繰り上がりの 1 を加算します。1 の加算は、下位 32 ビ
ットの加算結果より、加算の左辺または右辺が大きい場
合に実行します (32 ビット符号なし整数に変換し、ビッ
ト表現として比較します)。実装では、uuuv から um
uk が 32 ビット符号付き整数として管理されています。
R61R41R34R39L3L23L30L25 へ変
更できます

HMAC の構成
HMAC では、メッセージ W に対するハッシュ関数 H
の出力を、新たなメッセージとして H に入力します。
H(m5C | H(m36 | W))

H の初期値は、共通鍵を知る場合に限り再現できるよう
に、圧縮関数 F のブロック m の先頭を m36 または
m5C にします。
m36 = xp36
m5C = xp5C


x は共通鍵です。m の長さを超える場合は、H によっ
て短縮します。p36p5C は、m の長さまで 0x36
たは 0x5C が連続する定数です。2 種類の定数は、符号
としての距離が大きくなるように選択されており、内側
と外側の H を異なるランダムなハッシュ関数とするも
のです。これにより H の衝突耐性を改善します。

H の階層構造は、W の伸長攻撃を困難にします。単体
H では、パディングもメッセージとして含めた W'
の右端にデータの付加が可能ですが、階層構造によって
内側の H の出力が明示的に与えられず、W に対する追
加操作が困難になります

PBKDF2 の定義
次の説明は HMAC で構成する場合のものです。
D1 = H(m5C | H(m36 | s | z))
Dn = H(m5C | H(m36 | Dn - 1))
K = D1 ⊕ ... ⊕ Di


n1 より大きく HMAC の実行回数 i 以下の整数です。
s はソルト、z は 4 バイトの整数 (初期値は 1) です。
i 回目の実行後、z1 を加算して新たに K' を生成し
ます。K は指定のバイト長まで右端に追加されます
関連項目:

ダウンロード (GitHub リポジトリ)

共通鍵暗号
[広告]



ライブラリへ戻ります

トップページへ戻ります
COPYRIGHT © 2019 mScroll