(57)【要約】      （修正有）【課題】２つの文字列のハッシュ値、たとえば正規のパスワードと入力されたパスワードのハッシュ値を比較することによって、その２つの文字列が「近傍」にあるかどうかを判定する。【解決手段】暗号処理装置は、第１の入力文字列に第１のワイルドカード文字を挿入することで得られる文字列を、第１の類似文字列として生成する第１の類似文字列生成部と、前記第１の類似文字列を暗号化関数に作用させて第１の比較暗号値を生成する第１の暗号化部と、第２の入力文字列に第２のワイルドカード文字を挿入することで得られる文字列を、第２の類似文字列として生成する第２の類似文字列生成部と、前記第２の類似文字列に前記暗号化関数を作用させて第２の比較暗号値を生成する第２の暗号化部と、前記第１の比較暗号値と前記第２の比較暗号値を比較して、前記第１の入力文字列と前記第２の入力文字列の類似度を判定する類似暗号比較部とを含む。【選択図】図６
2014137423.tif 000002
【特許請求の範囲】
【請求項１】
第１の入力文字列に任意の文字として使用される第１のワイルドカード文字を挿入することで得られる文字列、または前記第１の入力文字列の少なくとも１文字を前記第１のワイルドカード文字に置換して得られる文字列を、第１の類似文字列として生成する第１の類似文字列生成部と、
前記第１の類似文字列に暗号化関数を作用させて第１の比較暗号値を生成する第１の暗号化部と、
第２の入力文字列に任意の文字として使用される第２のワイルドカード文字を挿入することで得られる文字列、または前記第２の入力文字列の少なくとも１文字を前記第２のワイルドカード文字に置換して得られる文字列を、第２の類似文字列として生成する第２の類似文字列生成部と、
前記第２の類似文字列に前記暗号化関数を作用させて第２の比較暗号値を生成する第２の暗号化部と、
前記第１の比較暗号値と前記第２の比較暗号値を比較して、前記第１の入力文字列と前記第２の入力文字列の類似度を判定する類似暗号比較部と、
を含む暗号処理装置。
【請求項２】
第１の前記類似文字列群生成部および／または第２の前記類似文字列群生成部は、複数の類似文字列を生成する、請求項１に記載の暗号処理装置。
【請求項３】
さらに、
前記第１の入力文字列および前記第２の入力文字列が所定の長さより短い場合に、前記所定の長さに達するまでパディングするために特定のパディング文字を挿入する入力文字列受付部を含む請求項１または２に記載の暗号処理装置。
【請求項４】
前記似文字列群生成部は、前記ワイルドカードの挿入および／または前記ワイルドカードへの置換の回数に依存して、前記入力文字列に対する類似度を出力する請求項１乃至３のいずれか一項に記載の暗号処理装置。
【請求項５】
前記第１の入力文字列および前記第２の入力文字列は、パスワードである付記１乃至４のいずれか一項に記載の暗号処理装置。
【請求項６】
前記ワイルドカード文字は、制御文字である請求項１乃至５のいずれか一項に記載の暗号処理装置。
【請求項７】
前記暗号化関数はハッシュ関数である、請求項１乃至６のいずれか一項に記載の暗号処理装置。
【請求項８】
コンピュータによって実行される暗号処理方法であって、
第１の入力文字列に任意の文字として使用される第１のワイルドカード文字を挿入することで得られる文字列、または前記第１の入力文字列の少なくとも１文字を前記第１のワイルドカード文字に置換して得られる文字列を、第１の類似文字列として生成することと、
前記第１の類似文字列に暗号化関数を作用させて第１の比較暗号値を生成することと、
第２の入力文字列に任意の文字として使用される第２のワイルドカード文字を挿入することで得られる文字列、または前記第２の入力文字列の少なくとも１文字を前記第２のワイルドカード文字に置換して得られる文字列を、第２の類似文字列として生成することと、
前記第２の類似文字列に前記暗号化関数を作用させ第２の比較暗号値を生成することと、
前記第１の比較暗号値と前記第２の比較暗号値を比較して、前記第１の入力文字列と前記第２の入力文字列の類似度を判定することを、
を含む暗号処理方法。
【請求項９】
第１の入力文字列に任意の文字として使用される第１のワイルドカード文字を挿入することで得られる文字列、または前記第１の入力文字列の少なくとも１文字を前記第１のワイルドカード文字に置換して得られる文字列を、第１の類似文字列として生成し、
前記第１の類似文字列に暗号化関数を作用させて第１の比較暗号値を生成し、
第２の入力文字列に任意の文字として使用される第２のワイルドカード文字を挿入することで得られる文字列、または前記第２の入力文字列の少なくとも１文字を前記第２のワイルドカード文字に置換して得られる文字列を、第２の類似文字列として生成し、
前記第２の類似文字列に前記暗号化関数を作用させて第２の比較暗号値を生成し、
前記第１の比較暗号値と前記第２の比較暗号値を比較して、前記第１の入力文字列と前記第２の入力文字列の類似度を判定する
処理をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、暗号処理装置、方法およびプログラムに関する。
【背景技術】
【０００２】
昨今、情報通信技術の進展により、電子計算機が他の電子計算機と相互に接続されて運用されることが非常に多くなった。これに伴い、電子計算機やその中で扱われるデータが正当な所有者や利用者以外からアクセスされる機会や、通信や処理のためにそうしたデータを他の計算機に預ける機会も増えた。このため、元のデータを秘匿したままで比較などの操作を可能とする技術が考案され、利用されている。
【０００３】
そうした技術の一つに、暗号学的ハッシュ関数（以下では、単にハッシュ関数と呼ぶこともある）を利用する暗号処理装置がある。
ハッシュ関数とは、任意のデータ（元データ）に作用させると、固定長のハッシュ値と呼ばれる別のデータに変換する写像として定義される。つまり、暗号学的ハッシュ関数は、同じ元データを常に同じハッシュ値に変換するが、異なる元データはほとんどの場合、同じハッシュ値に変換しない。「良い」ハッシュ関数は、元データの規則的な変化（たとえば数値の連続的な増減、特定のビットの反転など）に対して、対応するハッシュ値が乱雑な変化をするものである。
【０００４】
暗号学的ハッシュ関数とは、ハッシュ関数のうちハッシュ値の乱雑度や変換の一方向性が非常に強く、安全性の高いものを指す。つまり、元データを知らずにハッシュ値だけを見て元データを導き出したり、複数のハッシュ値だけを見てそれらの元データ間の関係や規則性を見出したりすることが不可能または非常に困難なものを指す。暗号学的ハッシュ関数として働く代表的なアルゴリズムとして、ＭＤ５、ＳＨＡ−１、ＳＨＡ−２などが知られている。
【０００５】
暗号学的ハッシュ関数は、安全性をもつことから、セキュリティを高める用途にしばしば使われる。たとえば、ディジタル署名やメッセージ認証コード （ＭＡＣ）、パスワード認証などに使われている。このうちパスワード認証の用途では、ユーザが正規ユーザであるかどうかを判定するために、予め登録されているパスワードのハッシュ値と、ユーザが入力したハッシュ値を比較し、一致すればそのユーザを正規ユーザと判定する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１０−２３７６５３公報
【非特許文献】
【０００７】
【非特許文献１】RFC 2104「HMAC: Keyed-Hashing for Message Authentication」
【発明の概要】
【発明が解決しようとする課題】
【０００８】
暗号化されていない２つの元データについて、２つのデータに暗号学的ハッシュ関数を作用させて得られる２つの暗号化データを比較する場合、元データが少しでも異なるとハッシュ値はまったく異なる値になるため、元データが類似していることを知ることができない。よって、ハッシュ関数を用いて暗号化をする場合、２つの元データが互いに類似しているのか否かを、暗号化データを比較しても分からないという問題がある。
【０００９】
たとえば、ユーザが正規ユーザであるかどうかを判定するために、予め登録されているパスワードのハッシュ値と、ユーザが入力したハッシュ値を比較する場合、正しいユーザが１文字違いのパスワードを所定の回数だけ誤って入力すると、アカウントロックが起こってしまう。アカウントロックが起こると、ロックを外すためには、管理者による解除が必要であったりと、パスワードを再び受け付けることが可能となるためには、時間と手間を要するという問題がある。また、アカウントロックが生じると、パスワードに対応する識別子（ＩＤ）で特定されるユーザのデータが消去されることがあるという問題がある。
【００１０】
パスワード認証の場合、正規ユーザが誤ったパスワードを入力する場合、入力されたパスワードは、部分的な文字列が一致するなど、正しいパスワードの「近傍」にあることが多い。ここで２つの文字列が互いに「近傍」にあるとは、全体の文字列の比較的高い割合の部分が一致することである。逆に、セキュリティを破ってログインしようとする攻撃者から入力されるパスワードが、正しいパスワードの近傍にあるケースは多くない。もし、上記の２つの状況が区別できれば、正規ユーザであるにも関わらず、連続してパスワードを誤った状況を検出できるが、そのような方法がないという問題がある。
【００１１】
よって、一つの側面として、本発明は、２つの入力文字列が「近傍」にあるか否かを示す類似度を、秘匿したまま比較する装置、方法を提供することを目的とする。
【課題を解決するための手段】
【００１２】
第１と第２の入力文字列が「近傍」にあるか否かを示す類似度を、秘匿したまま比較する暗号処理装置が提供される。暗号処理装置は、第１の入力文字列に任意の文字として使用される第１のワイルドカード文字を挿入することで得られる文字列、または前記第１の入力文字列の少なくとも１文字を前記第１のワイルドカード文字に置換して得られる文字列を、第１の類似文字列として生成する第１の類似文字列生成部と、前記第１の類似文字列を暗号化関数に作用させて第１の比較暗号値を生成する第１の暗号化部と、第２の入力文字列に任意の文字として使用される第２のワイルドカード文字を挿入することで得られる文字列、または前記第２の入力文字列の少なくとも１文字を前記第２のワイルドカード文字に置換して得られる文字列を、第２の類似文字列として生成する第２の類似文字列生成部と、前記第２の類似文字列に前記暗号化関数を作用させて第２の比較暗号値を生成する第２の暗号化部と、前記第１の比較暗号値と前記第２の比較暗号値を比較して、前記第１の入力文字列と前記第２の入力文字列の類似度を判定する類似暗号比較部とを含む。
【発明の効果】
【００１３】
実施形態の暗号処理装置および方法では、２つの文字列のハッシュ値、たとえば正規のパスワードと入力されたパスワードのハッシュ値を比較することによって、その２つの文字列が「近傍」にあるかどうかを判定することができるという効果を奏する。
【図面の簡単な説明】
【００１４】
【図１】パスワード認証の概略を説明する図である。
【図２Ａ】正規ユーザからのオンライン総当り攻撃を受けたときの状況の例を示す図である。
【図２Ｂ】攻撃者からのオンライン総当り攻撃を受けたときの状況の例を示す図である。
【図３】オンライン総当り攻撃に対する対策の一つとしての平文比較方式の例を示す図である。
【図４】オンライン総当り攻撃に対する対策の一つとして、近傍文字列すべてのハッシュ値を取っておく方法の例を示す図である。
【図５】オンライン総当り攻撃に対する対策の一つとして、近傍文字列すべてのハッシュ値を取っておく方法の別の例を示す図である。
【図６】開示の実施形態にしたがう近傍ハッシュの生成方法の例の概略を示す図である。
【図７】近傍ハッシュの生成方法の例を示す図である。
【図８】暗号システムの機能ブロックの例を示す図である。
【図９】図８の類似ハッシュ生成部の機能ブロックの例を示す図である。
【図１０】図８の類似ハッシュ比較部の機能ブロックの例を示す図である。
【図１１】類似ハッシュデータの例を示す図である。
【図１２】暗号処理装置または、第１の類似ハッシュ生成部、第２の類似ハッシュ生成部、および／もしくは類似ハッシュ比較部の構成の例を示す構成図である。
【図１３】類似文字列生成処理での処理の流れを示すフローチャートの例である。
【図１４】１文字増減に対応した類似文字列生成処理での処理の流れを示すフローチャートの例である。
【図１５】２文字増減に対応した類似文字列生成処理での処理の流れを示すフローチャートの例である。
【図１６】比較処理での処理の流れを示すフローチャートの例である。
【発明を実施するための形態】
【００１５】
以下では、第１と第２の入力文字列が「近傍」にあるか否かを示す類似度を、秘匿したまま比較する暗号処理装置、方法およびプログラムが提供される。ここで２つの文字列が互いに「近傍」にあるとは、全体の文字列の比較的高い割合の部分が一致することである。
【００１６】
本明細書ではハッシュ関数のうち暗号学的ハッシュ関数だけを扱うので、以下では、特に断りのない限り、暗号学的ハッシュ関数、暗号学的ハッシュ値をそれぞれ単にハッシュ関数、ハッシュ値と呼ぶものとする。また、以下では用語「ハッシュ」と「ハッシュ値」を同等に扱うことがある。
【００１７】
また、ハッシュ関数の入力となるデータは任意のバイト列だが、以降では便宜的に任意個の文字が並んだ文字列として説明する。実際には、ＡＳＣＩＩ文字列のように１文字が１バイトに対応したデータとしてもよいし、文字列を文字符号化した結果のバイト列を元データとしてハッシュ関数に入力してもよい。
【００１８】
また、パスワードは、暗証番号のみならず、ＰＩＮ、パスフレーズなどを含んでも良い。
【００１９】
＜全般的な説明＞
図１〜５を用いて、パスワード認証方法の概略と、それに対する攻撃法の例を説明する。
【００２０】
図１は、パスワード認証の概略を説明する図である。以下では、文字列を暗号化するために、その文字列に暗号化関数としてハッシュ関数を作用させ、暗号化値としてハッシュ値（または単にハッシュ）を得る方法を用いる。しかしながら、暗号化関数としては、ＭＤ２、ＭＤ４、ＭＤ５、ＳＨＡ等のハッシュ関数に限らず、他の暗号化関数を用いても良い。暗号化関数としては、フィードバックシフトレジスタ（ＬＦＳＲ）によるシフト、ビットのシフト後、２ｍ個の要素を有する拡大ガロア体上ＧＦ（２ｍ）上の特性多項式の剰余などの一方向関数を含み得る。
【００２１】
事前処理として、正しいパスワードにハッシュ関数Ｈ’を作用させて、正しいハッシュを生成させておく。図１の例では、正しいパスワード「ｐ＠ｓｓＷ０ｒｄ」にハッシュ関数Ｈ’を作用させ、正しいハッシュ「ｃ６ｅ７１５７０ａ９７」を生成する。
【００２２】
認証時には、ユーザによって入力されたパスワードにハッシュ関数Ｈ’を作用させてハッシュ（比較ハッシュ）を生成し、それを事前に得られている正しいハッシュと比較する。そして、ユーザによって入力されたパスワードから生成されたハッシュである比較ハッシュと正しいハッシュと一致すれば、その文字列を入力したユーザを正規ユーザとして認証する。
【００２３】
図１の例では、ユーザによって文字列「ｐａｓｓｗｏｒｄ」が入力されるとする。その文字列にハッシュ関数Ｈ’を作用させると、ハッシュ「５６５２９０７６ｅ９９７」が得られる。これと正しいハッシュ「ｃ６ｅ７１５７０ａ９７」を比較すると一致しないので、このユーザは正規ユーザとして認証されない。
【００２４】
一方、あるユーザがパスワードとして文字列「ｐ＠ｓｓＷ０ｒｄ」を入力したとすると、この文字列にハッシュ関数Ｈ’を作用させると、ハッシュ「ｃ６ｅ７１５７０ａ９７」が得られる。これは正しいハッシュと一致する。よって、このユーザは正規ユーザとして認証される。
【００２５】
一般に、ハッシュ関数では元のデータが少しでも異なると、ハッシュ関数を作用して得られるハッシュ値はまったく異なる値になるため、元データが類似していることを知ることができない。つまり、二つの元データである文字列が類似している、たとえば１文字違いであることをそれらのハッシュ値のみから知ることはできない。
【００２６】
図２Ａは、正規ユーザからのオンライン総当り攻撃を受けたときの状況の例を示す図である。図２Ｂは、攻撃者からのオンライン総当り攻撃を受けたときの状況の例を示す図である。
【００２７】
正規ユーザからの入力であっても、ケアレスミスや、ふとパスワードが思い出せなくなってしまったなどの理由で、パスワードを連続して何回か間違ってしまう状況がある。これは、パスワードがあらゆる場面で使われ、子供や老人など老若男女を問わずパスワードを使用するＩＴ社会では頻出する可能性がある。このような状況では、正しいパスワードと何らかの関連性がある文字列が入力されることが多い。しかも、正規ユーザがパスワードを連続して何回か間違えるとアカウントロックが起こり、再度可能にするには、しばらく待つ、管理者に解除してもらう、など時間的なロスが発生するだけでなく、データが消去される可能性もある。
【００２８】
図２Ａに示されている例では、正しいパスワードが文字列「ｐ＠ｓｓＷ０ｒｄ」であるにも関わらず、正規ユーザが文字列「ｐａｓｓｗｏｒｄ」、「ｐａｓｓＷｏｒｄ」など、正しい文字列に「類似」の文字列が入力される。
【００２９】
また、認証システムには、正規でないユーザから、システムに格納されている個人データ等の秘匿データを盗むために、攻撃が仕掛けられることがある。
【００３０】
図２Ｂは、攻撃者が考え得る文字列全てを入力することによってセキュリティを破ろうとする攻撃を仕掛けたとき、パスワードとして入力される文字列の例である。この場合、攻撃者は正しいパスワードに関する情報を事前には全く持ち合わせていないので、正しいパスワードとは何ら関連性のない文字列を入力することが多い。図２Ｂの例では、正しいパスワードが文字列「ｐ＠ｓｓＷ０ｒｄ」であるにも関わらず、文字列「ｘＡ５１ａａａａ」など、正しいパスワードとハミング距離が長いだけでなく、正しい文字列とは「類似性が薄い」または正しい文字列の「近傍」にはない文字列が入力される。
【００３１】
もし、図２Ａと図２Ｂに示されているような２つの状況を互いに見分けることができれば、総当たり攻撃の検出精度が高まる、アカウントロックの精度が高まり、正しいユーザのミスでロックしてしまう可能性が減るなどのメリットが期待できる。
【００３２】
しかし、こうした類似マッチができると、ハッシュ値のみから元データの類似性を知ることができるので、類似性がわからないときよりも安全性が低下している可能性がある。すなわち、ハッシュ値の元データを知りたい攻撃者は、予想した元データが正しい元データと完全に一致しなくても類似していれば類似していることがわかるので、次回以降の予想範囲をかなり狭めることができる。このため、類似マッチができないときよりも少ない試行回数で正しい元データを知ることができる可能性がある。こうした類似マッチでは、目的とする類似性がわかってしまうのは仕方がないが、それ以上の性質はわからないようにすることが望ましい。また、鍵付きハッシュの技術を用い、ハッシュ関数の処理に秘密情報を導入することで、秘密情報を知らない第三者には類似マッチすらできないようにすることで、安全性低下の脅威を軽減できる場合もある。
【００３３】
正規ユーザによるパスワード入力ミスと攻撃者によるパスワード入力ミスを見分ける方法の一つとして、図３に示されているような平文比較方式がある。
【００３４】
この方法では、入力されたパスワードと正しいパスワードの平文を比較する。しかし、平文のパスワードを保存するのは危険であるという問題がある。特に、正しいパスワードの平文が漏洩したり、管理者などの覗き見される可能性がある。正しパスワードを暗号化しておいても、暗号化の鍵が漏れたり、鍵が推測されるとパスワードが露見してしまう可能性がある。
【００３５】
正規ユーザによるパスワード入力ミスと攻撃者によるパスワード入力ミスを見分ける方法の別の例として、一方の元データに類似したデータすべてに対するハッシュ値（類似ハッシュ値）を作成するという方法が考えられる。それらのハッシュ値のいずれかがもう一方の元データから得たハッシュ値と一致すれば類似していることを知ることができる。たとえば、元データを「ａｂｃｄ」とすると、１文字目を置き換えた「ｂｂｃｄ」「ｃｂｃｄ」「ｄｂｃｄ」など、２文字目を置き換えた「ａａｃｄ」「ａｃｃｄ」「ａｄｃｄ」のように１文字違いの類似データをすべて作成し、それらのハッシュ値を作成することで、別の元データのハッシュ値がいずれかの類似ハッシュ値が一致すれば１文字違いであることがわかる。
【００３６】
図４は、オンライン総当り攻撃に対する対策の一つとして、近傍文字列すべてのハッシュ値を取っておく方法の例を示す図、図５はオンライン総当り攻撃に対する対策の一つとして、近傍文字列すべてのハッシュ値を取っておく方法の別の例を示す図である。
【００３７】
図４では、事前に正しいパスワードである文字列「ｐ＠ｓｓＷ０ｒｄ」と１文字だけ異なる文字列を全て生成する。たとえば、１文字目を削除して「＠ｓｓＷ０ｒｄ」としたり、１文字目を置換して「ａ＠ｓｓＷ０ｒｄ」としたりする。そして、これらの正しいパスワードと１文字だけ異なる文字列のそれぞれにハッシュ関数Ｈ’を作用させ、ハッシュ値を得ておく。これらのハッシュは近傍ハッシュ群を形成する。正しいパスワードである文字列「ｐ＠ｓｓＷ０ｒｄ」に対応するハッシュである主ハッシュも事前に得ておく。
【００３８】
ここで、近傍ハッシュ群とは、正しいパスワードを示す文字列の「近傍」にある文字列から生成されるハッシュ値の集まりであり得る。
【００３９】
認証時には、入力されたパスワード、たとえば「ｐ＠ｓｓＷ０ｒｄ」にハッシュ関数Ｈ’を作用させ、比較ハッシュを得る。図４の場合、比較ハッシュとして文字列「ｃ６ｅ７１５７０３ａ９７」が得られる。この比較ハッシュは、主ハッシュと一致する。
【００４０】
この方法では、パスワードをｎ文字とすると、近傍ハッシュ群の要素は約 ｎ×９６個必要（９６は文字の種類数）となり、ｎ＝８ なら７６８個、２文字違いや文字挿入も考えると、近傍ハッシュ群の要素はもっと多くなる。
【００４１】
図５では、事前に正しいパスワードである文字列「ｐ＠ｓｓＷ０ｒｄ」に対応するハッシュは正しい主ハッシュだけ得ておく。
【００４２】
認証時には、まず、入力された文字列にハッシュ関数Ｈ’を作用させ、主ハッシュを得る。また、入力された文字列と１文字だけ異なる文字列を全て生成し、これらの文字列全てから対応するハッシュを得る。これらのハッシュは近傍ハッシュ群を形成する。事前に得られている正しい主ハッシュと、認証時に入力された文字列に関連する主ハッシュおよび近傍ハッシュ群の要素を比較する。
【００４３】
図５の場合、認証時に入力された文字列「ｐａｓｓＷ０ｒｄ」に対応するハッシュは正しい主ハッシュとは異なるが、近傍ハッシュ群の要素の一つが正しい主ハッシュと一致する。この場合、入力された文字列は、正規ユーザが誤って入力した文字列である可能性が高いと判定される。
【００４４】
しかし、この方法では、必要となる類似ハッシュ値の数が多すぎ、ハッシュ値生成の処理量または生成したハッシュ値を格納する容量が膨大になってしまう。具体的には、文字の種類がｍ、元データを構成する文字の数が最大ｎだったとすると、１文字違いの類似を表現するだけでもおよそｍ×ｎ個のハッシュ値が必要になる。たとえば、ＡＳＣＩＩコードでは制御文字を除く文字はおよそ１００種類あり、それら文字から構成される元データが最大１６文字だとすると、およそ１６００個の類似ハッシュ値が必要となる。
【００４５】
図６は、開示の実施形態にしたがう近傍ハッシュの生成方法の例の概略を示す図である。
【００４６】
本方法では、たとえば、比較対象の文字列ａと文字列ｂがあるとする。このとき、まず文字列ａの各位置の文字をワイルドカード文字に置き換えてからハッシュ値を計算する。ワイルドカード文字とは、本方式において任意の文字に合致することを表現するための特別な文字で、任意の文字の代替として使用される文字である。ワイルドカード文字は、元データに使われ得る文字でなければ何でもよく、あらかじめ一つを決めておく。こうして計算されたハッシュ値をまとめて、文字列ａの類似ハッシュ値集合Ａとする。文字列ｂに対しても同様に類似ハッシュ値集合Ｂを計算する。類似比較をするには、Ａの要素のいずれかとＢの要素のいずれかが一致するかどうかを比較する。一致するものがあれば、文字列ａとｂは1文字違いであることがわかる。
【００４７】
図６の例では、事前に正しいパスワードである文字列「ｐ＠ｓｓＷ０ｒｄ」の各位置をワイルドカード「＿」に置換した文字列を生成する。そして、これらの文字列にハッシュ関数ｈ”を作用させておく。
【００４８】
認証時も、入力された文字列「ｐａｓｓＷ０ｒｄ」の各位置をワイルドカード「＿」に置換した文字列を生成する。そして、これらの文字列にハッシュ関数ｈ”を作用させる。そして、事前に得られているハッシュと、認証時に得たハッシュ値のどれかが一致するなら、入力されたパスワードは１文字違いである。
【００４９】
これらの処理は、認証時に入力された文字列に対応するハッシュが、正しいパスワードに対応するハッシュとは異なることを判定した後に処理されても良いし、同時に処理されても良い。
【００５０】
この方法では、パスワードをｎ文字とすると、事前に保存するハッシュの数はｎ個、認証時に生成するハッシュの数もｎ個、そしてｎ２回の比較よって、正規ユーザによるパスワード入力ミスと攻撃者によるパスワード入力ミスを見分けることができる。実際には文字列は最大１６文字などと決めて、足りない分はパディングしても良い。
【００５１】
また、前記の方法で類似ハッシュ値集合を作ると、集合の大きさ（すなわち集合に含まれるハッシュの数）から元の文字列の長さ（すなわち文字数）がわかってしまう。これを防ぐには、元の文字列にパディングを施してから各文字の置換を行う。パディングの処理は、ワイルドカード文字と同様にパディングを表すための特別なパディング文字を用意して、既定の文字数に達するまで元の文字列の後ろに付け足す。もしも元の文字列が既定の文字数よりも長ければ、既定数を超える文字は取り除いて短くしても良いし、あるいは文字列はそのままでワイルドカード文字へ置換する文字位置を規定文字数までで止めても良い。
【００５２】
図７は、近傍ハッシュの生成方法の例を示す図である。
ワイルドカード文字を元の文字と置き換えるだけでなく、元の文字の前または後に挿入してもよい。これにより、１文字多いまたは少ないという類似も検出できる。前記のパディングで長さを揃えている場合は、挿入した分末尾の文字を取り除く。また、そうすると、パディング文字を置換した場合とパディング文字の前に挿入した場合とで同じ文字列が作られてしまい、類似ハッシュ値同士が一致する組数からパディング文字が何文字あるか、すなわち元の文字列が何文字かがわかってしまうため、これを避けるために、挿入位置がパディング文字の直前である場合は敢えて文字列が一致しないように変更を加える。文字列の最初にパディング文字を加えても良い。
【００５３】
また、ワイルドカード文字を複数の位置で置き換えまたは挿入することもできる。これにより、１文字だけでなく複数文字の違いや増加・減少も類似と見なして検出することができる。
【００５４】
図７の例では、元の８文字の文字列「ａｂｃｄｅｆｇｈ」の後ろにパディング文字「．」を挿入し１６文字の文字列「ａｂｃｄｅｆｇｈ．．．．．．．．」を生成する。そして、この１６文字の文字列「ａｂｃｄｅｆｇｈ．．．．．．．．」の各位置をワイルドカード文字「＿」に置換した後にハッシュ関数を作用させる（ハッシュする）。たとえば、１６文字の文字列「ａｂｃｄｅｆｇｈ．．．．．．．．」の第１文字目をワイルドカードに置換すると、「＿ｂｃｄｅｆｇｈ．．．．．．．．」が得られ、これにハッシュ関数を作用させハッシュ値「ｃ６ｅ０９５２０２ｂ９７」を得る。
【００５５】
パディング文字は「．」、ワイルドカード文字は「＿」としたが、パスワードに使われない文字なら何でも良く、また何バイトでも良い。制御文字であっても良い。
【００５６】
＜装置の構成＞
図８〜１１を参照して、上記のような機能を有する暗号処理装置の例を説明する。
【００５７】
暗号処理装置１０は電子計算機上のソフトウェアとして実現されるものとするが、ハードウェアとして実現されても構わない。
【００５８】
図８は、類似比較を行う暗号処理装置１０の構成の例を示す図である。暗号処理装置１０は、第１の類似ハッシュ生成部１０２、第２の類似ハッシュ生成部１０４、および類似ハッシュ比較部１０６を含む。類似ハッシュ比較部１０６は、第１の類似ハッシュ生成部１０２および第２の類似ハッシュ生成部１０４と電気的に接続される。第１の類似ハッシュ生成部１０２と第２の類似ハッシュ生成部１０４はそれぞれ、入力文字列Ａおよび入力文字列Ｂから主ハッシュ値Ｈ（Ａ）、Ｈ（Ｂ）および類似ハッシュデータ（近傍ハッシュ群）ＮＡ、ＮＢを生成する。類似ハッシュ比較部１０６は、複数の入力文字列から作られた主ハッシュ値と類似ハッシュデータの組を使い、両者の一致結果および類似度を出力する。図８では、類似ハッシュ比較部１０６は、第１の類似ハッシュ生成部１０２の出力である主ハッシュ値Ｈ（Ａ）と類似ハッシュデータＮＡ、第２の類似ハッシュ生成部１０４の出力である主ハッシュ値Ｈ（Ｂ）と類似ハッシュデータＮＢを比較する。
【００５９】
第１の類似ハッシュ生成部１０２、第２の類似ハッシュ生成部１０４、および類似ハッシュ比較部１０６は互いに、物理的にまったく別々に配置されても良いし、ごく近くに配置されても良い。また、これらが一つの筐体内に収められていても良いし、互いに別個の筐体に収められても良い。互いに別個の筐体に収められている場合、ある場所で作られた類似ハッシュデータを通信によって移動させて、別の場所で比較に用いる。また第１の類似ハッシュ生成部１０２と第２の類似ハッシュ生成部１０４のいずれかが、類似ハッシュ比較部１０６と同じ筐体に収められていても良い。ここで、同じ筐体に収められていなくても、近い位置にあれば良いものとする。たとえば、同じ建物であったり、同じ組織内であってりしていても良い。また、物理的な配置だけでなく時間的な配置についても同様で、生成された類似ハッシュデータをすぐに比較に使っても構わないし、保存しておいて後で比較しても構わない。図の二つの類似ハッシュデータの一方は保存しておいて、もう一方は比較時に生成しても構わない。
【００６０】
図９は、図８の類似ハッシュ生成部１０２、１０４の機能ブロックの例を示す図である。類似ハッシュ生成部１０２と１０４は同一または類似の構成を有し、以下では、類似ハッシュ生成部１０２を例に説明をする。類似ハッシュ生成部１０２は、入力文字受付部１０２０、第１ハッシュ関数作用部１０２２、類似文字列群生成部１０２４、および第２ハッシュ関数作用部１０２６を含む。また、類似ハッシュ生成部１０４は、入力文字受付部１０４０、第１ハッシュ関数作用部１０４２、類似文字列群生成部１０４４、および第２ハッシュ関数作用部１０４６を含み、これらはそれぞれ、入力文字受付部１０２０、第１ハッシュ関数作用部１０２２、類似文字列群生成部１０２４、および第２ハッシュ関数作用部１０２６と同一または類似の構成および／または機能を有する。
【００６１】
類似ハッシュ生成部１０２は、入力文字列を受け取り、主ハッシュ値と類似ハッシュ値群を出力する。
【００６２】
入力文字受付部１０２０は、入力された文字列を入力文字列として受け取り、受け取った入力文字列を第１ハッシュ関数作用部１０２２および類似文字列群生成部１０２４に出力する。
【００６３】
第１ハッシュ関数作用部１０２２では、入力文字受付部１０２０から受けた入力文字列にハッシュ関数を作用させ、得られたハッシュ値を主ハッシュ値として出力する。
【００６４】
類似文字列群生成部１０２４は、図７に示したように、入力文字列を改変して複数の類似文字列を生成する。上述のように、類似文字列にワイルドカード文字が使用される。類似文字列群生成部１０２４で生成された類似文字列は、第２ハッシュ関数作用部１０２６に出力される。
【００６５】
第２ハッシュ関数作用部１０２６では、類似文字列群生成部１０２４から受けた類似文字列にハッシュ関数を作用させ、得られたハッシュ値を類似ハッシュデータとして出力する。
【００６６】
第１ハッシュ関数作用部１０２２と第２ハッシュ関数作用部１０２６で用いられるハッシュ関数は、暗号学的ハッシュ関数であれば良い。また、第１ハッシュ関数作用部１０２２と第２ハッシュ関数作用部１０２６は、同じアルゴリズムでなくても構わない。さらに、第１ハッシュ関数作用部１０２２と第２ハッシュ関数作用部１０２６は、一般にソルトと呼ばれる攪拌情報を加えるアルゴリズムを用いても良いし、鍵情報を用いるＨＭＡＣ（ハッシュによるメッセージ認証コード）アルゴリズムであっても構わない。第１ハッシュ関数作用部１０２２と第２ハッシュ関数作用部１０２６は、まったく同じ構成および／または機能であるよりも、アルゴリズムそのものや付随するソルトまたは鍵情報の値が異なるほうが安全性は高く、望ましい。
【００６７】
図１０は類似ハッシュ比較部１０６の構成の例を示す図である。類似ハッシュ比較部１０６は、二つの入力文字列Ａ、Ｂに対するそれぞれの主ハッシュ値Ｈ（Ａ）、Ｈ（Ｂ）と類似ハッシュデータの組ＮＡ、ＮＢを入力として受け付け、一致または不一致を表す一致結果と、類似度を出力する。
【００６８】
類似ハッシュ比較部１０６は、主ハッシュ値比較部１０６０および類似ハッシュデータ比較部１０６２を含む。
【００６９】
主ハッシュ値比較部１０６０は、主ハッシュ値Ｈ（Ａ）とＨ（Ｂ）を比較し、同じ値であれば一致、さもなければ不一致と判断する。
【００７０】
類似ハッシュデータ比較部１０６２は、類似ハッシュデータを比較して類似度を出力する。
【００７１】
図１１は類似ハッシュデータの構成の例である。類似ハッシュデータは、類似度と類似ハッシュ値の組を一つ以上含む。類似度は、類似ハッシュ値が元の文字列から何文字分変化した文字列に対応するかを示している。類似ハッシュ値は、第１ハッシュ関数作用部１０２２と第２ハッシュ関数作用部１０２６の出力であり、長さや形式は用いられるハッシュ関数に依存する。図１１では、用いられるアルゴリズムとしてＳＨＡ−１を想定し、８０ビット（２０バイト）のハッシュ値を４０桁の１６進数として表現している。
【００７２】
このように、暗号処理装置１０は、第１の入力文字列に任意の文字として使用される第１のワイルドカード文字を挿入することで得られる文字列、または前記第１の入力文字列の少なくとも１文字を前記第１のワイルドカード文字に置換して得られる文字列を、第１の類似文字列として生成する第１の類似文字列生成部１０２２と、類似文字列に暗号化関数を作用させて第１の比較暗号値を生成する第１の暗号化部１０２６と、第２の入力文字列に任意の文字として使用される第２のワイルドカード文字を挿入することで得られる文字列、または前記第２の入力文字列の少なくとも１文字を前記第２のワイルドカード文字に置換して得られる文字列を、第２の類似文字列として生成する第２の類似文字列生成部１０４２と、第２の類似文字列に暗号化関数を作用させて第２の比較暗号値を生成する第２の暗号化部１０４６と、第１の比較暗号値と第２の比較暗号値を比較して、第１の入力文字列と第２の入力文字列の類似度を判定する類似暗号比較部１０６を含んでいる。
【００７３】
この場合、ある文字列の「類似度」とは、パディング文字に挿入または置換された文字数であっても良い。そして、ある文字列が、別の文字列について、パディング文字に挿入または置換された文字数が所定の文字数以下であるとき、互いに「近傍」にあると定義しても良い。
【００７４】
上記では、暗号化関数としてハッシュ関数を用いたが、別の暗号化関数を用いても良い。ハッシュ関数作用部は単に暗号化部、類似ハッシュ比較部は単に類似暗号比較部と呼ぶこともある。
【００７５】
上記では、２つの文字列にともにワイルドカードを挿入または文字列の少なくとも１文字をワイルドカードに置換して得られる文字列群を暗号化して得られる２つの暗号化値群を比較した。しかしながら、２つの文字列のうち一方のみから暗号化値群を生成し、もう一方の文字列の暗号化値と比較しても良い。
【００７６】
図１２は、暗号処理装置１０または、第１の類似ハッシュ生成部１０２、第２の類似ハッシュ生成部１０４、および／もしくは類似ハッシュ比較部１０６の構成の例を示す構成図である。図１２は、暗号処理装置１０または、第１の類似ハッシュ生成部１０２、第２の類似ハッシュ生成部１０４、および／もしくは類似ハッシュ比較部１０６として使用可能なコンピュータの一例の構成図である。
【００７７】
このコンピュータ５００は、ＭＰＵ５０２、ＲＯＭ５０４、ＲＡＭ５０６、ハードディスク装置５０８、入力装置５１０、表示装置５１２、インタフェース装置５１４、及び記録媒体駆動装置５１６を備えている。なお、これらの構成要素はバスライン５２０を介して接続されており、ＭＰＵ５０２の管理の下で各種のデータを相互に授受することができる。
【００７８】
ＭＰＵ（Ｍｉｃｒｏ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）５０２は、このコンピュータ５００全体の動作を制御する演算処理装置であり、コンピュータ５００の制御処理部として機能する。
【００７９】
ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）５０４は、所定の基本制御プログラムが予め記録されている読み出し専用半導体メモリである。ＭＰＵ５０２は、この基本制御プログラムをコンピュータ５００の起動時に読み出して実行することにより、このコンピュータ５００の各構成要素の動作制御が可能になる。
【００８０】
ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）５０６は、ＭＰＵ５０２が各種の制御プログラムを実行する際に、必要に応じて作業用記憶領域として使用する、随時書き込み読み出し可能な半導体メモリである。
【００８１】
ハードディスク装置５０８は、ＭＰＵ５０２によって実行される各種の制御プログラムや各種のデータを記憶しておく記憶装置である。ＭＰＵ５０２は、ハードディスク装置５０８に記憶されている所定の制御プログラムを読み出して実行することにより、後述する各種の制御処理を行えるようになる。
【００８２】
入力装置５１０は、例えばマウス装置やキーボード装置であり、図６のシステムの利用者により操作されると、その操作内容に対応付けられている各種情報の入力を取得し、取得した入力情報をＭＰＵ５０２に送付する。
【００８３】
表示装置５１２は例えば液晶ディスプレイであり、ＭＰＵ５０２から送付される表示データに応じて各種のテキストや画像を表示する。
【００８４】
インタフェース装置５１４は、このコンピュータ５００に接続される各種機器との間での各種情報の授受の管理を行う。
【００８５】
記録媒体駆動装置５１６は、可搬型記録媒体５１８に記録されている各種の制御プログラムやデータの読み出しを行う装置である。ＭＰＵ５０２は、可搬型記録媒体５２０に記録されている所定の制御プログラムを、記録媒体駆動装置５１６を介して読み出して実行することによって、後述する各種の制御処理を行うようにすることもできる。なお、可搬型記録媒体２１８としては、例えばＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）規格のコネクタが備えられているフラッシュメモリ、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＤＶＤ−ＲＯＭ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）などがある。
【００８６】
このようなコンピュータ５００を用いて暗号処理装置を構成するには、例えば、上述の各処理部における処理をＭＰＵ５０２に行わせるための制御プログラムを作成する。作成された制御プログラムはハードディスク装置５０８若しくは可搬型記録媒体５２０に予め格納しておく。そして、ＭＰＵ５０２に所定の指示を与えてこの制御プログラムを読み出させて実行させる。こうすることで、暗号処理装置１０または、第１の類似ハッシュ生成部１０２、第２の類似ハッシュ生成部１０４、および／もしくは類似ハッシュ比較部１０６が備えている機能がＭＰＵ５０２により提供される。
【００８７】
このような暗号処理装置１０を用いることによって、２つの文字列のハッシュ値、たとえば正規のパスワードと入力されたパスワードのハッシュ値を比較することによって、その２つの文字列が「近傍」にあるかどうかを判定することができる。
【００８８】
また、正規ユーザによるパスワード入力ミスと攻撃者によるパスワード入力ミスを見分けることができる。
【００８９】
上記暗号処理装置をパスワード認証のための装置として用いる場合、正規ユーザが誤ったパスワードを入力すると、入力されたパスワードは、部分的な文字列が一致するなど、正しいパスワードの「近傍」にあることが多い。ここで２つの文字列が互いに「近傍」にあるとは、全体の文字列の比較的高い割合の部分が一致することである。逆に、セキュリティを破ってログインしようとする攻撃者から入力されるパスワードが、正しいパスワードの近傍にあるケースは多くない。上記の装置によれば、正しいパスワードについて何文字かをワイルドカード文字に置換した文字列から得られるハッシュ値と、入力された文字列について何文字かをワイルドカード文字に置換した文字列から得られるハッシュ値とを比較することによって、入力ミスか総当たり攻撃かを判別することができる。
【００９０】
＜処理の例＞
図１２〜１５を参照して、処理の例を説明する。本処理では、ワイルドカード文字と呼ばれる特別な文字を使う。ワイルドカード文字は、あらかじめ一つに決めておく必要があるが、本来の入力文字列に決して含まれない文字であれば何でもよい。一般的にはＡＳＣＩＩコードで０から３１の範囲および１２７にある制御文字は入力文字列に使われることが少ないため、これらのいずれかを使うことができる。
【００９１】
また以降の説明では、類似比較できる最大文字数の既定値を１６とする。さらに既定の長さにそろえるために使われるパディング文字もワイルドカード文字と同様に予め決めておく。パディング文字はワイルドカード文字とは別の文字であることが好ましい。
【００９２】
また、装置が図１２に示されているような汎用コンピュータである場合には、図１２〜１５および／または下記の説明は、そのような処理を行う制御プログラムを定義する。すなわち、以下では、下記に説明する処理を汎用コンピュータに行わせる制御プログラムの説明でもある。
【００９３】
図１２は、類似文字列生成処理での処理の流れを示すフローチャートの例である。図１２は、入力文字列のうち１文字が別の文字に入れ替わっているような類似を検出できる例を示す。
【００９４】
Ｓ１０２で入力文字列受付部１０２０（１０４０）は、入力文字列ｓを受け取る。たとえば、ｓ＝「ａｂｃｄ」とする。
【００９５】
Ｓ１０４で入力文字列受付部１０２０（１０４０）は、Ｓ１０２で受け取った入力文字列ｓの末尾にパディング文字を既定文字数に達するまで追加する。ｓ＝「ａｂｃｄ」の場合は、パディング文字を「．」とすると、ｓ＝「ａｂｃｄ．．．．．．．．．．．．」とする。
【００９６】
次に、Ｓ１０６で類似文字列群生成部１０２４（２０４４）は、文字位置を表す変数ｉを１に初期化する。
【００９７】
Ｓ１０８〜Ｓ１１２は、ループを構成しており、文字位置を表す変数ｉの値を１ずつ増加させながらループ処理を行う。ループはｉの値が文字列ｓの長さを超えるまで繰り返す。
【００９８】
Ｓ１０８で類似文字列群生成部１０２４（２０４４）は、文字列ｓのｉ文字目をワイルドカード文字、たとえば「？」に置換し、類似ハッシュデータとして、類似度＝１、文字列ｔの組（１、ｔ）を出力する。
【００９９】
たとえば、文字列ｓ＝「ａｂｃｄ．．．．．．．．．．．．」の第１文字目をワイルドカード文字「？」に置き換え、類似ハッシュデータとして、類似度＝１、文字列ｔ＝「？ｂｃｄ．．．．．．．．．．．．」の組（１、ｔ）が出力される。
【０１００】
Ｓ１１０で類似文字列群生成部１０２４（２０４４）は、文字位置を表す変数ｉを１つ増加させる。
【０１０１】
Ｓ１１２で類似文字列群生成部１０２４（２０４４）は、文字位置を表す変数ｉが文字列ｓの文字数を超えているかを判定する。もし、本判定の結果が“ＹＥＳ”、すなわち、文字位置を表す変数ｉがｓの文字数を超えていれば、処理を終了する。もし、本判定の結果が“ＮＯ”、すなわち、文字位置を表す変数ｉがｓの文字数を超えていなければ、Ｓ１０８に戻る。
【０１０２】
Ｓ１０８〜Ｓ１１２の処理によって、類似度＝１、文字列ｔ＝「？ｂｃｄ．．．．．．．．．．．．」の組から、類似度＝１、文字列ｔ＝「ａｂｃｄ．．．．．．．．．．．？」まで、１６個の類似ハッシュデータが生成される。
【０１０３】
図１３は、１文字増減に対応した類似文字列生成処理での処理の流れを示すフローチャートの例である。本処理は、類似文字列群生成部１０２４（２０４４）によって処理される。
【０１０４】
Ｓ２０２〜Ｓ２０６までは、上述のＳ１０２〜Ｓ１０６の処理と同一である。
Ｓ２０８で類似文字列群生成部１０２４（２０４４）は、文字列ｓのｉ文字目の直前にワイルドカード文字、たとえば「？」を挿入し、最後の文字を削除した文字列ｕを作る。たとえば、文字列ｓ＝「ａｂｃｄ．．．．．．．．．．．．」でｉ＝１であれば、文字列ｕ＝「？ａｂｃｄ．．．．．．．．．．．」である。
【０１０５】
次のＳ２１０で類似文字列群生成部１０２４（２０４４）は、文字列ｕのｉ＋１ 文字目がパディング文字である場合、またはｉ文字目が末尾の文字でｉ＋１文字目が存在しない場合、文字列ｕの先頭にパディング文字を追加する。文字列ｓ＝「ａｂｃｄ．．．．．．．．．．．．」でｉ＝５であれば、文字列ｕ＝「．ａｂｃｄ？．．．．．．．．．」である。この場合、末尾のパディング文字は削除されてもよい。
【０１０６】
Ｓ２１２で類似文字列群生成部１０２４（２０４４）は、類似ハッシュデータとして、類似度＝１、文字列ｕの組（１、ｕ)を出力する。
【０１０７】
Ｓ２１４〜Ｓ２１６の処理は、Ｓ１１０〜Ｓ１１２の処理と同一である。
Ｓ２１４で類似文字列群生成部１０２４（２０４４）は、文字位置を表す変数ｉを１つ増加させる。
【０１０８】
Ｓ２１６で類似文字列群生成部１０２４（２０４４）は、文字位置を表す変数ｉが文字列ｓの文字数を超えているかを判定する。もし、本判定の結果が“ＹＥＳ”、すなわち、文字位置を表す変数ｉがｓの文字数を超えていれば、処理を終了する。もし、本判定の結果が“ＮＯ”、すなわち、文字位置を表す変数ｉがｓの文字数を超えていなければ、Ｓ２０８に戻る。
【０１０９】
図１４は、２文字増減に対応した類似文字列生成処理での処理の流れを示すフローチャートの例である。図１４は、入力文字列のうち２文字が別の文字に入れ替わっているような類似を検出できる例を示す。本処理は、類似文字列群生成部１０２４（２０４４）によって処理される。
【０１１０】
この処理では、図１３に示した１文字変更の場合と似ているが、すべての（ｉ、ｊ）の組（ただし、１≦ｉ＜ｊ≦ｎで、ｎはパディング後の文字列ｓの長さ）に関してｉ文字目とｊ文字目をワイルドカード文字に置き換えた文字列ｔを作るため、二重のループで処理を行い、類似度２と文字列ｔの組を出力する。
【０１１１】
Ｓ３０２〜Ｓ３０６までは、上述のＳ１０２〜Ｓ１０６の処理と同一である。
Ｓ３０８〜Ｓ３１４は、（第２の）文字位置を表す変数ｊに関するループを構成しており、文字位置を表す変数ｊの値を１ずつ増加させながらループ処理を行う。ループはｊの値が文字列ｓの長さを超えるまで繰り返す。
【０１１２】
Ｓ３０８では、文字位置を表（第２の）す変数ｊをｉ＋１に初期化する。
Ｓ３１０で類似文字列群生成部１０２４（２０４４）は、文字列ｓのｉ文字目をワイルドカード文字、たとえば「？」に置換し、類似ハッシュデータとして、類似度＝２、文字列ｔの組（２、ｔ）を出力する。たとえば、文字列ｓ＝「ａｂｃｄ．．．．．．．．．．．．」でｉ＝１、ｊ＝２であれば、文字列ｔ＝「？？ｃｄ．．．．．．．．．．．」であり、ｉ＝１、ｊ＝１６であれば、文字列ｔ＝「？ｂｃｄ．．．．．．．．．．？」である。
【０１１３】
Ｓ３１２で類似文字列群生成部１０２４（２０４４）は、文字位置を表す（第２の）変数ｊを１つ増加させる。
【０１１４】
Ｓ３１４で類似文字列群生成部１０２４（２０４４）は、文字位置を表す（第２の）変数ｊが文字列ｓの文字数を超えているかを判定する。もし、本判定の結果が“ＹＥＳ”、すなわち、文字位置を表す（第２の）変数ｊがｓの文字数を超えていれば、Ｓ３１６に進む。もし、本判定の結果が“ＮＯ”、すなわち、文字位置を表す（第２の）変数ｊがｓの文字数を超えていなければ、Ｓ３１０に戻る。
【０１１５】
Ｓ３１６で類似文字列群生成部１０２４（２０４４）は、文字位置を表す（第１の）変数ｉを１つ増加させる。
【０１１６】
Ｓ３１８で類似文字列群生成部１０２４（２０４４）は、文字位置を表す（第１の）変数ｉが文字列ｓの文字数を超えているかを判定する。もし、本判定の結果が“ＹＥＳ”、すなわち、文字位置を表す（第１の）変数ｉがｓの文字数を超えていれば、処理を終了する。もし、本判定の結果が“ＮＯ”、すなわち、文字位置を表す（第１の）変数ｉがｓの文字数を超えていなければ、Ｓ３０８に戻る。
【０１１７】
図１５は、比較処理での処理の流れを示すフローチャートの例である。
この処理は、入力された類似ハッシュデータをそれぞれＮＡ、ＮＢとしたとき、ＮＡの中の類似ハッシュ値とＮＢの中の類似ハッシュ値が等しいものを探し、その中で対応する類似度のうちもっとも小さい値を出力する、という処理である。基本的にハッシュ値の元の文字列（第２ハッシュ関数作用部１０２６（１０４６）の入力）に同じ数のワイルドカード文字が含まれているときのみハッシュ値も一致するので、類似度が異なるハッシュ値同士が一致することはまずない。この処理は様々な方法で実現でき、たとえば類似ハッシュ値の集合同士から共通要素を取り出してから、そのうちで類似度の小さいものを探す、という方法でもよいが、以下ではあらかじめ類似度の小さい順にソートしてから前から順番に探す方法を示す。
【０１１８】
Ｓ４０２で類似ハッシュ比較部１０６は、類似ハッシュデータＮＡとＮＢを、それぞれ類似度昇順でソートする。
【０１１９】
Ｓ４０４で類似ハッシュ比較部１０６は、類似ハッシュデータＮＡの先頭から順に類似度ｄＡ、ハッシュ値Ｈ（Ａ）を取り出す。
【０１２０】
Ｓ４０６で類似ハッシュ比較部１０６は、類似ハッシュデータＮＢの先頭から順に類似度ｄＢ、ハッシュ値Ｈ（Ｂ）を取り出す。
【０１２１】
Ｓ４０８で類似ハッシュ比較部１０６は、ｄＡとｄＢが等しく、かつＨ（Ａ）とＨ（Ｂ）が等しいかを判定する。もし、本判定の結果が“ＮＯ”、すなわち、ｄＡとｄＢが等しくない、またはＨ（Ａ）とＨ（Ｂ）が等しくない場合には、Ｓ４１２に進む。また、本判定の結果が“ＹＥＳ”、すなわち、ｄＡとｄＢが等しく、かつＨ（Ａ）とＨ（Ｂ）が等しい場合には、Ｓ４１０に進む。
【０１２２】
Ｓ４１０で類似ハッシュ比較部１０６は、類似度ｄＡ＝ｄＢを出力して、処理を終了する。
【０１２３】
次のＳ４１２で類似ハッシュ比較部１０６は、類似ハッシュデータＮＢに残りの組があるかを判定する。もし、本判定の結果が“ＹＥＳ”、すなわち、類似ハッシュデータＮＢに残りの組がある場合には、Ｓ４０６に戻る。もし、本判定の結果が“ＮＯ”、すなわち、類似ハッシュデータＮＢに残りの組がない場合には、Ｓ４１４に進む。
【０１２４】
次のＳ４１２で類似ハッシュ比較部１０６は、類似ハッシュデータＮＡに残りの組があるかを判定する。もし、本判定の結果が“ＹＥＳ”、すなわち、類似ハッシュデータＮＡに残りの組がある場合には、Ｓ４０４に戻る。もし、本判定の結果が“ＮＯ”、すなわち、類似ハッシュデータＮＡに残りの組がない場合には、Ｓ４１６に進む。
【０１２５】
Ｓ４１６で類似ハッシュ比較部１０６は、類似ハッシュデータＮＡと類似ハッシュデータＮＢには類似のものがないという意味で、非類似であるという結果を出力して、処理を終了する。
【０１２６】
上記のような装置および方法により、２つ以上の入力に対応する暗号学的ハッシュ値の集合同士を比較するだけで、入力が互いに「近傍」にあるか否か、たとえば、それらの元データがｎ文字違いなどの条件で類似しているかどうかを知ることが可能である。特に、上記のような装置および方法では、元の値を秘匿したまま、入力が互いに「近傍」にあるか否かを判定することができる。
【０１２７】
さらに、類似しているかどうかを知ることができるという点を除けば、元データや元データ間の関係がわからないという安全性は保たれる。
【０１２８】
上記のような装置および方法では、正しいパスワードの「近傍」にあるパスワード入力を判定するために必要とされるハッシュ値の数が少なくて済む。元データを構成する文字の数を最大ｎとすると、本方式では２×ｎ個のハッシュ値で済ますことができる。
【０１２９】
暗号化されていない２つの元データについて、２つのデータに暗号学的ハッシュ関数を作用させて得られる２つの暗号化データを比較する場合、元データが少しでも異なるとハッシュ値はまったく異なる値になるため、元データが類似していることを知ることができない。しかし、上記の暗号処理装置、方法を用いることによって、２つの元データが互いに類似しているのか否かを、暗号化データの比較によって判定することができる。
【０１３０】
さらに、上記の暗号処理装置、方法では、２つの元データが互いに類似しているのか否かのもならず、２つの元データの「類似度」を、暗号化データの比較によって得ることができる。
【０１３１】
以上の実施形態に関し、さらに以下の付記を開示する。
（付記１）
第１の入力文字列に任意の文字として使用される第１のワイルドカード文字を挿入することで得られる文字列、または前記第１の入力文字列の少なくとも１文字を前記第１のワイルドカード文字に置換して得られる文字列を、第１の類似文字列として生成する第１の類似文字列生成部と、
前記第１の類似文字列に暗号化関数を作用させて第１の比較暗号値を生成する第１の暗号化部と、
第２の入力文字列に任意の文字として使用される第２のワイルドカード文字を挿入することで得られる文字列、または前記第２の入力文字列の少なくとも１文字を前記第２のワイルドカード文字に置換して得られる文字列を、第２の類似文字列として生成する第２の類似文字列生成部と、
前記第２の類似文字列に前記暗号化関数を作用させて第２の比較暗号値を生成する第２の暗号化部と、
前記第１の比較暗号値と前記第２の比較暗号値を比較して、前記第１の入力文字列と前記第２の入力文字列の類似度を判定する類似暗号比較部と、
を含む暗号処理装置。
（付記２）
第１の前記類似文字列群生成部および／または第２の前記類似文字列群生成部は、複数の類似文字列を生成する、付記１に記載の暗号処理装置。
（付記３）
さらに、
前記第１の入力文字列および前記第２の入力文字列が所定の長さより短い場合に、前記所定の長さに達するまでパディングするために特定のパディング文字を挿入する入力文字列受付部を含む付記１または２に記載の暗号処理装置。
（付記４）
前記似文字列群生成部は、前記ワイルドカードの挿入および／または前記ワイルドカードへの置換の回数に依存して、前記入力文字列に対する類似度を出力する付記１乃至３のいずれか一項に記載の暗号処理装置。
（付記５）
前記第１の入力文字列および前記第２の入力文字列は、パスワードである付記１乃至４のいずれか一項に記載の暗号処理装置。
（付記６）
前記ワイルドカード文字は、制御文字である付記１乃至５のいずれか一項に記載の暗号処理装置。
（付記７）
前記暗号化関数はハッシュ関数である、付記１乃至６のいずれか一項に記載の暗号処理装置。
（付記８）
コンピュータによって実行される暗号処理方法であって、
第１の入力文字列に任意の文字として使用される第１のワイルドカード文字を挿入することで得られる文字列、または前記第１の入力文字列の少なくとも１文字を前記第１のワイルドカード文字に置換して得られる文字列を、第１の類似文字列として生成することと、
前記第１の類似文字列に暗号化関数を作用させて第１の比較暗号値を生成することと、
第２の入力文字列に任意の文字として使用される第２のワイルドカード文字を挿入することで得られる文字列、または前記第２の入力文字列の少なくとも１文字を前記第２のワイルドカード文字に置換して得られる文字列を、第２の類似文字列として生成することと、
前記第２の類似文字列に前記暗号化関数を作用させ第２の比較暗号値を生成することと、
前記第１の比較暗号値と前記第２の比較暗号値を比較して、前記第１の入力文字列と前記第２の入力文字列の類似度を判定することを、
を含む暗号処理方法。
（付記９）
前記類似文字列を生成することは、複数の類似文字列を生成する、付記６に記載の暗号処理方法。
（付記１０）
さらに、
前記第１の入力文字列および前記第２の入力文字列が所定の長さより短い場合に、前記所定の長さに達するまでパディングするために特定のパディング文字を挿入することを含む付記７または８に記載の暗号処理方法。
（付記１１）
前記類似文字列を生成することは、前記ワイルドカードの挿入および／または前記ワイルドカードへの置換の回数に依存して、前記入力文字列に対する類似度を出力する付記７乃至９のいずれか一項に記載の暗号処理方法。
（付記１２）
前記第１の入力文字列および前記第２の入力文字列は、パスワードである付記７乃至１０のいずれか一項に記載の暗号処理方法。
（付記１３）
前記ワイルドカード文字は、制御文字である付記７乃至１１のいずれか一項に記載の暗号処理方法。
（付記１４）
前記暗号化関数はハッシュ関数である、付記７乃至１３のいずれか一項に記載の暗号処理方法。
（付記１５）
第１の入力文字列に任意の文字として使用される第１のワイルドカード文字を挿入することで得られる文字列、または前記第１の入力文字列の少なくとも１文字を前記第１のワイルドカード文字に置換して得られる文字列を、第１の類似文字列として生成し、
前記第１の類似文字列に暗号化関数を作用させて第１の比較暗号値を生成し、
第２の入力文字列に任意の文字として使用される第２のワイルドカード文字を挿入することで得られる文字列、または前記第２の入力文字列の少なくとも１文字を前記第２のワイルドカード文字に置換して得られる文字列を、第２の類似文字列として生成し、
前記第２の類似文字列に前記暗号化関数を作用させて第２の比較暗号値を生成し、
前記第１の比較暗号値と前記第２の比較暗号値を比較して、前記第１の入力文字列と前記第２の入力文字列の類似度を判定する
処理をコンピュータに実行させるプログラム。
（付記１６）
前記類似文字列を生成させる処理では、複数の類似文字列を生成させる処理をコンピュータに実行させる付記１２に記載のプログラム。
（付記１７）
さらに、
前記第１の入力文字列および前記第２の入力文字列が所定の長さより短い場合に、前記所定の長さに達するまでパディングするために特定のパディング文字を挿入する処理をコンピュータに実行させる付記１３または１４に記載のプログラム。（付記１８）
前記類似文字列を生成させる処理では、前記ワイルドカードの挿入および／または前記ワイルドカードへの置換の回数に依存して、前記入力文字列に対する類似度を出力させる処理をコンピュータに実行させる付記１３乃至１５のいずれか一項に記載のプログラム。
（付記１９）
前記第１の入力文字列および前記第２の入力文字列は、パスワードである付記１３乃至１６のいずれか一項に記載のプログラム。
（付記２０）
前記ワイルドカード文字は、制御文字である付記１３乃至１７のいずれか一項に記載のプログラム。
（付記２１）
前記暗号化関数はハッシュ関数である、付記７乃至１３のいずれか一項に記載のプログラム。
【符号の説明】
【０１３２】
１０  暗号処理装置
１０２  第１の類似ハッシュ生成部
１０４  第２の類似ハッシュ生成部
１０６  類似ハッシュ比較部
１０２０、１０４０  入力文字列受付部
１０２２、１０４２  第１ハッシュ関数作用部
１０２４、１０４４  類似文字列群生成部
１０２６、１０４６  第２ハッシュ関数作用部
１０６０  主ハッシュ比較部
１０６２  類似ハッシュ値群比較部
【図１】
2014137423.tif 000003
【図２Ａ】
2014137423.tif 000004
【図２Ｂ】
2014137423.tif 000005
【図３】
2014137423.tif 000006
【図４】
2014137423.tif 000007
【図５】
2014137423.tif 000008
【図６】
2014137423.tif 000009
【図７】
2014137423.tif 000010
【図８】
2014137423.tif 000011
【図９】
2014137423.tif 000012
【図１０】
2014137423.tif 000013
【図１１】
2014137423.tif 000014
【図１２】
2014137423.tif 000015
【図１３】
2014137423.tif 000016
【図１４】
2014137423.tif 000017
【図１５】
2014137423.tif 000018
【図１６】
2014137423.tif 000019