pythonで暗号演算 ~宮口・プレネルによるハッシュ値生成~

python,暗号演算,SHE,暗号演算

今回は宮口・プレネルという一方向圧縮関数を利用したハッシュ値生成を勉強していこうと思います。

初めに

現在SHE(Secure Hardware Extension)という暗号処理機能の実装に取り組んでおります。

その中で出てきた耳なれない演算処理が宮口・プレネルです。

端的に言ってしまえば、ブロック暗号を使用してハッシュ値を生成する暗号演算になります。

以下で詳細を解説します。

ハッシュ値の生成と一方向圧縮関数

Merkle–Damgård構造

現在使用されている主要なハッシュ値生成は、基本的には以下要素のもとに行われます。

① 初期値(IV)を使用

② 入力データをブロック単位で処理(f)

③ 最終ブロックはパディング

Davidgothberg, Public domain, via Wikimedia Commons, https://commons.wikimedia.org/wiki/File:Merkle-Damgard_hash_big.svg

上記を満たすハッシュ生成処理の構造をMerkle–Damgård構造といいます。

ここで、②の処理(f)に使用されるのが一方向圧縮関数です。

一方向圧縮関数

一方向圧縮関数は2つの固定長データ入力に対し、1つの固定長データを出力する関数です。

出力されたデータから入力されたデータを割り出すことは困難であることから、一方向となっています。

今回取り上げる宮口・プレネル一方向圧縮関数であり、主にハッシュ値生成のために使用されます。

宮口・プレネル

宮口翔二とバート・プレネルが考案した一方向圧縮関数です。

ブロック暗号を用い、以下の処理で得られた出力値をハッシュ値とします。

① ハッシュ値Hi-1を鍵として、メッセージブロックmiを暗号化

  (初回メッセージブロックm1を暗号化するときのハッシュ値H0は任意の初期値を使用)

② 出力された暗号文とハッシュ値Hi-1をXOR

③ 出力値とメッセージブロックmiをXORすることで、ハッシュ値Hiが得られる

デビッドゴスバーグ, Public domain, via Wikimedia Commons, https://commons.wikimedia.org/wiki/File:Matyas-Meyer-Oseas_hash.svg

ソース

以下で公開されているソースコードを動かしてみました。

構成

ソースファイル概要
aes-mp.pyサンプル実行コード
AES_MP128.pyパラメータ設定コード
IVと使用するブロック暗号の暗号利用モードが指可能
デフォルトの場合 暗号利用モード:AES-ECB、IV:0
MiyaguchiPreneel.pyハッシュ値生成コード

出力結果

aes-mp.pyをそのまま実行した際の出力結果は以下です。

b'e732a43c377b26f391f6f0ecb2e66a11'