BLAKE

BLAKEは、Jean-Philippe Aumasson, Luca Henzen, Willi Meier, and Raphael C.-W. Phanによってアメリカ国立標準技術研究所 によるSHA-3の公募に提出された暗号学的ハッシュ関数である。ダニエル・バーンスタインによって設計されたストリーム暗号であるChaChaをベースとしたものであり、ChaChaのラウンドの前にラウンド定数との排他的論理和を取った入力ブロックの置換コピーが加えられている。BLAKEはSHA-3公募において5つの最終候補のうちの1つに残った。

SHA-2と同様に、BLAKEには4つのバリエーションが存在する。32ビットのワード長を持ち256ビットのハッシュを出力するBLAKE-256およびそれを切り詰め224ビットの出力としたBLAKE-224、64ビットのワード長を持ち512ビットのハッシュを出力するBLAKE-512およびそれを切り詰め384ビットの出力としたBLAKE-384の4つである。

1. アルゴリズム
---------

ChaChaでは4×4アレイのワードを操作し、BLAKEでは16のメッセージワードと8ワードのハッシュ値を連結することで、ChaChaの出力を切り詰めて次のハッシュ値の計算に用いる。

中核となる変換では入力の16ワードと16の変数を組み合わせるが、ブロック間では8ワードしか保持されない。

BLAKEでは、16の固定ワードと、16要素間での置換テーブル10個を用いる。 σ[0] = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 σ[1] = 14 10 4 8 9 15 13 6 1 12 0 2 11 7 5 3 σ[2] = 11 8 12 0 5 2 15 13 10 14 3 6 7 1 9 4 σ[3] = 7 9 3 1 13 12 11 14 2 6 5 10 4 0 15 8 σ[4] = 9 0 5 7 2 4 10 15 14 1 11 12 6 8 3 13 σ[5] = 2 12 6 10 0 11 8 3 4 13 7 5 15 14 1 9 σ[6] = 12 5 1 15 14 13 4 10 0 7 6 3 9 2 8 11 σ[7] = 13 11 7 14 12 1 3 9 5 0 15 4 8 6 2 10 σ[8] = 6 15 14 9 11 3 0 8 12 2 13 7 1 4 10 5 σ[9] = 10 2 8 4 7 6 1 5 15 11 9 14 3 12 13 0

BLAKE-224, BLAKE-256では、固定ワードnに下記の定数を用いる。 n = 0x243f6a88 0x85a308d3 0x13198a2e 0x03707344 0xa4093822 0x299f31d0 0x082efa98 0xec4e6c89 0x452821e6 0x38d01377 0xbe5466cf 0x34e90c6c 0xc0ac29b7 0xc97c50dd 0x3f84d5b5 0xb5470917

BLAKE-384, BLAKE-512では、固定ワードnに下記の定数を用いる。 n = 0x243f6a8885a308d3 0x13198a2e03707344 0xa4093822299f31d0 0x082efa98ec4e6c89 0x452821e638d01377 0xbe5466cf34e90c6c 0xc0ac29b7c97c50dd 0x3f84d5b5b5470917 0x9216d5d98979fb1b 0xd1310ba698dfb5ac 0x2ffd72dbd01adfb7 0xb8e1afed6a267e96 0xba7c9045f12c7f99 0x24a19947b3916cf7 0x0801f2e2858efc16 0x636920d871574e69

中核の操作はChaChaの1/4ラウンドと同等の操作であり、4ワードのカラムあるいは対角線上において2ワードのメッセージ m[] と2つの固定ワード n[] を結合する。1ラウンドごとに8回この操作が行われる。 j ← σ[r%10][2×i] // Index computations k ← σ[r%10][2×i+1] a ← a + b +  // Step 1  d ←  >>> 16 c ← c + d // Step 2  b ←  >>> 12 a ← a + b +  // Step 3  d ←  >>> 8 c ← c + d // Step 4  b ←  >>> 7 上の計算は32ビットバージョンであるBLAKE-256, -224のものである。r はラウンド数、i は繰り返し回数である。

ChaChaの1/4ラウンドの関数とは以下の違いがある。

メッセージワードの和が追加された。
ローテートの方向が逆となった。64ビットバージョンであるBLAKE-512, -384も32ビットバージョンであるBLAKE-256, -224と本質的には同じであるが、ローテートの量が32, 25, 16, 11に変更され、ラウンド数が14から16に増やされている。

2. 修正
-----

NISTによる公募の期間中、発見された問題への対処として応募者がアルゴリズムを修正することが許されていた。BLAKEに加えられた修正は以下の通りである

ラウンド数がBLAKE-256, -224では10から14に、BLAKE-512, -384では14から16に増やされた。速度を維持したままセキュリティマージンを大きくするためである。

3. ハッシュ値の例
----------

BLAKE-512 = A8CFBBD73726062DF0C6864DDA65DEFE58EF0CC52A5625090FA17601E1EECD1B628E94F396AE402A00ACC9EAB77B4D4C2E852AAAA25A636D80AF3FC7913EF5B8

BLAKE-512 = 1F7E26F63B6AD25A0896FD978FD050A1766391D2FD0471A77AFB975E5034B7AD2D9CCF8DFB47ABBBE656E1B82FBC634BA42CE186E8DC5E1CE09A885D41F43451<WtXmlEndTag />

4. BLAKE2
---------

2012年12月21日、BLAKEの改良版としてBLAKE2が発表された。これはJean-Philippe Aumasson、Samuel Neves、Zooko Wilcox-O'Hearn、Christian Winnerleinにより設計されたものであり、実際に破られた、あるいは理論的に破られたハッシュ関数であるMD5、SHA-1の置き換えを目指したものである。512ビットのハッシュを出力する64ビットバージョンであるBLAKE2b、256ビットのハッシュを出力する32ビットバージョンであるBLAKE2sの2つのバリエーションが存在する。BLAKE2bでは1から64バイト、BLAKE2sでは1から32バイトの間で任意の長さのハッシュを出力可能である。

マルチコアプロセッサでの並列処理による高速化を図った BLAKE2bp および BLAKE2sp と呼ばれるバージョンも存在する。

BLAKE2では、BLAKEから以下の修正がなされている。

BLAKEのラウンド関数にあった固定ワードのメッセージワードへの追加が除去された。
2つのローテート量が変更された。
パディングが簡素化された。
初期化ベクトルとの排他的論理和を取ったパラメータブロックが追加された。
ラウンド数が14 あるいは16 から、10 あるいは12 に削減された。

4.1. BLAKE2 のハッシュ値の例
--------------------

BLAKE2b-512 = 786A02F742015903C6C6FD852552D272912F4740E15847618A86E217F71F5419D25E1031AFEE585313896444934EB04B903A685B1448B755D56F701AFE9BE2CE

BLAKE2b-512 = A8ADD4BDDDFD93E4877D2746E62817B116364A1FA7BC148D95090BC7333B3673F82401CF7AA2E4CB1ECD90296E3F14CB5413F8ED77BE73045B13914CDCD6A918<WtXmlEndTag />

5. BLAKE3
---------

2021年7月25日、BLAKE3が発表された。

MD5、SHA-1、SHA-2、SHA-3、そしてBLAKE2よりも高速である。
MD5及びSHA-1よりも堅牢で、さらに長さ拡張攻撃に対してSHA-2よりも堅牢である。
マークル木を利用しているため、並列化やストリーミングデータ・差分更新されるデータのハッシュ計算が可能である。
通常のハッシュ以外にも、 疑似乱数生成関数、メッセージ認証コード、鍵導出関数、可変長出力関数 を利用可能である。
変種のない一種類のアルゴリズムを提供しており、x86-64や他の小さいアーキテクチャにおいて高速である。

6. 実装ライブラリ
----------

BLAKEをサポートしているライブラリは以下の通り。

Botan
libsodium
OpenSSL
LibreSSL
wolfSSL

7. 脚注
-----

8. 外部リンク
--------

[1]
[2]
[3]
[4]