がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

ハッシュへの考察:追記あるいは「一方向性」という言葉への考察

えっと。始めに話を受けた方から

ハッシュ関数」とは何か。
「一方向ハッシュ関数」とは何か。
「一方向性」とは何か。
について個別に触れようとしてないのが全然ダメ。

というお話を頂いて。…なんとなく「どの辺に引っかかっていたのか」を色々と考察してみます。


ここで。とりあえずポイントとしては

  • 不可逆
  • 一方向性

の二つの言葉の定義でしょうか?
不可逆はまぁそのまんまなので省略します。
で…ちと一方向性について調べてみたりするのですが。

一方向性関数とは、関数の中でも、間単に計算できるが逆関数逆関数の計算が非常に困難である(もしくは不可能である)ような関数のことである。

一方向性関数(いちほうこうせいかんすう, oneway function)とは、簡単に計算できるが逆関数の計算は非常に困難である関数の事。

このあたりから公約数的な発想をすると…


hoge = 関数(でぇた)
があるときにおいて。

  • でぇたを関数に通すとhogeが算出できる
  • hogeから、逆関数を定義してでぇたを取り出すのが不可能、若しくは困難である


っていうのが恐らくは定義としてあるのではないか、と思われるです。
で…「不可逆」である以上、逆算は(データがつぶれてるから)不可能なはずなので。真っ当な手段「ではなく」アタック的手法で逆算したとして、その値が「衝突するほかのデータではない」保障もないですし。
この観点からすると、ハッシュ関数はすべからく一方向性関数になると思われます。そこから「一方向性ハッシュ関数」という呼称が出てきたのだろうとは十分に予測が出来るのですが(そういった用語使用例も、ネットを見ている限りでは多いですし)。


ただ、ここで微妙に気になるのが。
一方向性関数」ではなくて「一方向性ハッシュ関数」とした場合の定義が、場所によっては

一方向性ハッシュ関数は、衝突を起こしにくい圧縮関数hのことをいいます。ここでいう衝突とは、異なるx1、x2に対してh(x1)=h(x1)となることです。

という風に「値の逆算の不可能性/困難性」ではなく「衝突を起こしにくい、或いは衝突を見つけにくい」という部分に言及してある場合があることです(ケース的には少ないように感じられましたが。とりあえず1件しか見つけられてないので)。
で。もし前述のMixiの方の発言が、この定義を元に「衝突耐性の強度如何によっては"一方向性ハッシュ関数ではない"」と定義されるなら………わからなくも、ないです。
ただ…「一方向性関数」からの派生語としての「一方向性ハッシュ関数」を考えた場合に、衝突の強度の有無(しかも基準がもう一つ微妙)を前提にするのは…ちょっと難しいように思うのですが。どうなんでしょうかねぇ?


とりあえず「一方向性関数」関連で調べると案外に面白かったので追記してみます。