ハッシュ関数 (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_ + 64
が
M_
の長さ
以上であるとき、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_i
の
D_
は使用されません。この API は
Uint8Array
の共通鍵
P_
を使用して、Ip_
と
Op_
を
Uint8Array
形式で得ます。Hi_
にはハッシュ関数の
初期値を設定する API を割り当てます。HMAC の出力
D_
の長さはハッシュ関数の出力長、Ip_
および
Op_
の長さはブロック長
Hs_
と等しくなります。
intf.hmac_a0
を使用して HMAC の初期値を設定し、
intf.hmac_a
の
L_
に
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
-
3
⊕
wt
-
8
⊕
wt
-
14
⊕
wt
-
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
の場合
(b
∧
c)
∨
(¬b
∧
d)
20
≦
t
<
40
の場合
b
⊕
c
⊕
d
40
≦
t
<
60
の場合
(b
∧
c)
∨
(b
∧
d)
∨
(c
∧
d)
60
≦
t
<
80
の場合
b
⊕
c
⊕
d
論理和は、排他的論理和 (XOR) に置き換えることもで
きます。kt
は
20
刻みの
t
について、2、3、5
および
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)
=
(e
∧
f)
⊕
(¬e
∧
g)
M(a,
b,
c)
=
(a
∧
b)
⊕
(a
∧
c)
⊕
(b
∧
c)
kt
は 80 番目の素数までの立方根における、小数部分の
上位 64 ビットです。a
から
h
の初期値は、8 番目の素
数までの平方根について、小数部分の上位 64 ビットを
割り当てた値です。
ワードを 32 ビットで区切る場合は、上位 32 ビットに
繰り上がりの 1 を加算します。1 の加算は、下位 32 ビ
ットの加算結果より、加算の左辺または右辺が大きい場
合に実行します (32 ビット符号なし整数に変換し、ビッ
ト表現として比較します)。実装では、uu、uv
から
um、
uk
が 32 ビット符号付き整数として管理されています。
R61、R41、R34、R39
は
L3、L23、L30、L25
へ変
更できます
HMAC の構成
HMAC では、メッセージ
W
に対するハッシュ関数
H
の出力を、新たなメッセージとして
H
に入力します。
H(m5C
|
H(m36
|
W))
H
の初期値は、共通鍵を知る場合に限り再現できるよう
に、圧縮関数
F
のブロック
m
の先頭を
m36
または
m5C
にします。
m36
=
x
⊕
p36
m5C
=
x
⊕
p5C
x
は共通鍵です。m
の長さを超える場合は、H
によっ
て短縮します。p36
と
p5C
は、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
n
は
1
より大きく HMAC の実行回数
i
以下の整数です。
s
はソルト、z
は 4 バイトの整数 (初期値は
1) です。
i
回目の実行後、z
に
1
を加算して新たに
K'
を生成し
ます。K
は指定のバイト長まで右端に追加されます
COPYRIGHT © 2019 mScroll