pythonで暗号演算 ~宮口・プレネルによるハッシュ値生成~
今回は宮口・プレネルという一方向圧縮関数を利用したハッシュ値生成を勉強していこうと思います。
初めに
現在SHE(Secure Hardware Extension)という暗号処理機能の実装に取り組んでおります。
その中で出てきた耳なれない演算処理が宮口・プレネルです。
端的に言ってしまえば、ブロック暗号を使用してハッシュ値を生成する暗号演算になります。
以下で詳細を解説します。
ハッシュ値の生成と一方向圧縮関数
Merkle–Damgård構造
現在使用されている主要なハッシュ値生成は、基本的には以下要素のもとに行われます。
① 初期値(IV)を使用
② 入力データをブロック単位で処理(f)
③ 最終ブロックはパディング
上記を満たすハッシュ生成処理の構造をMerkle–Damgård構造といいます。
ここで、②の処理(f)に使用されるのが一方向圧縮関数です。
一方向圧縮関数
一方向圧縮関数は2つの固定長データ入力に対し、1つの固定長データを出力する関数です。
出力されたデータから入力されたデータを割り出すことは困難であることから、一方向となっています。
今回取り上げる宮口・プレネルは一方向圧縮関数であり、主にハッシュ値生成のために使用されます。
宮口・プレネル
宮口翔二とバート・プレネルが考案した一方向圧縮関数です。
ブロック暗号を用い、以下の処理で得られた出力値をハッシュ値とします。
① ハッシュ値Hi-1を鍵として、メッセージブロックmiを暗号化
(初回メッセージブロックm1を暗号化するときのハッシュ値H0は任意の初期値を使用)
② 出力された暗号文とハッシュ値Hi-1をXOR
③ 出力値とメッセージブロックmiをXORすることで、ハッシュ値Hiが得られる
ソース
以下で公開されているソースコードを動かしてみました。
構成
ソースファイル | 概要 |
---|---|
aes-mp.py | サンプル実行コード |
AES_MP128.py | パラメータ設定コード IVと使用するブロック暗号の暗号利用モードが指可能 デフォルトの場合 暗号利用モード:AES-ECB、IV:0 |
MiyaguchiPreneel.py | ハッシュ値生成コード |
出力結果
aes-mp.pyをそのまま実行した際の出力結果は以下です。
b'e732a43c377b26f391f6f0ecb2e66a11'