• ベストアンサー

ハッシュ値について

現代暗号入門という本を読んで「ハッシュ値」について解説がありました。 初めて聞く言葉だなと思い、読んでゆくとこれはあれに似ているなと思いました 「あれ」とは CRCという仕組みです ずいぶん前の話ですが、シリアル伝送路にはその途中でのデータ改ざんの恐れがあり、その検出のためにこんな方法があるのだということだったと思います ダイアルアップで接続していたころです この考え方はハッシュ値と同じではないかと思うのです となると、CRCとハッシュ値との間にはどんなかかわりがあるのだろうと思ったわけです どなたかこの疑問に答えてくださいませんか

質問者が選んだベストアンサー

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.3

以下、wikipediaの記述で、これがわかりやすいかと思います。 「CRC値は、メッセージとの1対1の対応が不可能(メッセージより常に情報量が少ないため)という点は、暗号学的ハッシュ関数によるハッシュ値(以下、単に「ハッシュ値」とする)と同じだが、ハッシュ値はそれでも100ビット程度以上の大きさがあるのが普通であり、また、内容が異なるのに同じハッシュ値となるようなメッセージを偽造したりするのは容易でない(という特性が一般に暗号学的ハッシュ関数には必須である)。それに対し、CRC値は一般に小さく、さらには消失訂正という技法によって同じCRC値になるメッセージを容易に作成可能であり、元のメッセージを少しだけ改変したものでもCRC値を同じにできる。なお、元のメッセージに非常によく似た(ごく低い通信エラーと同程度の差異しか無く、攻撃者の意図で決められたものではなくランダムに変えられたような)メッセージであれば、CRCの設計上、大きく異なるものにはなる。」 要は、CRCは小容量のデータが目的で、改ざんも容易なために「単純なデータ送信時の誤り確認」にしか使えないのに対し、ハッシュ値は大容量のデータ比較が目的で改ざんが難しい・・・という差があります。 CRCは基本的に処理が簡単なので、計算速度の遅いコンピュータでも容易に使えたのに対し、ハッシュ値は計算が複雑でパワーのあるコンピュータでしか使えなかったという問題もあり、CRCによる符号訂正は現在「レガシー技術」の世界でしか使ってないと思います。

noname#249103
質問者

お礼

回答ありがとうございます よくわかりました 暗号に興味を持って本を読んでいるうちにハッシュ値という言葉にたどり着きました また何かの機会がありましたらよろしくお願いします

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • asciiz
  • ベストアンサー率70% (6656/9434)
回答No.4

「ハッシュ値」という言葉自体は、大量のデータに対して何らかの演算をし、そのデータ全体の特性を表した小さなデータ、という意味です。 そしてハッシュ値を求める方法には、いろいろなものがあります。 CRCはその具体的な方法のうちの、一つです。 単純にデータの合計値を求めるだけのチェックサム方式や、ビット数の偶奇を揃えるだけのパリティビット方式も、ハッシュ値を求める方法の1つと言えます。 --以下余談かも-- ・パリティビット方式は、元データの1となっているビット数を数えて、常に偶数または常に奇数になるよう、0または1を末尾につけます。 まあこんなチェックでは、2か所以上ノイズが載ったら、偶然で合うことも十分考えられ、データの完全性はあまり期待できません。 それでも、7ビットごとに1ビットのパリティを付ければ、その7ビット間にノイズが2か所乗るというのも考えにくいので、かなりの精度でチェックできることになります。 (しかし送信データ全体の1/8がチェックデータに使われるというのは、効率の悪い話です。) ・チェックサム方式は、任意バイト数のデータをすべて合計し、下位1バイト(または2バイト)のチェックサム値を求めます。 これもたとえば、255バイトごとに1バイトのSUMを求めることにすれば、チェックが合わなかったときに256バイトのどこかにエラーがある、という検出ができます。 2か所以上にエラーが生じた場合でも、エラー同士の増減が等しくなければ、チェックサムは合わず、とりあえずのエラー検出はできます。 またパリティビット方式に比べて、本体データ量:チェックデータ量の比は7:1から255:1となり、かなり効率よくなりますね。 しかし、人為的なデータ操作には弱いという弱点もあります。 チェックサムが合うようにデータを書き換えられたなら、エラーを検出できません。 そして次あたりに出てくるのが、CRCです。 これはざっくりいうと、割り算の剰余をチェックデータに使うものです。 データ列をとても大きな数値だとみなして、特定の数で割っていきます。 ここで割り算の筆算を思い浮かべてもらうと、数字の上位桁数個を使って計算し、その余りと続きの桁を下ろしてきて、計算を続けますよね。実はこれと同じ原理で、数字全体の桁数がムチャクチャ多くても、「剰余」は求めていけるんです。 ※割り算の結果=「商」は、求めません。商は求めた次の瞬間に破棄してしまい、最終的に1つの「剰余」さえ求められればいいんです。 この方式により、チェックサムではすり抜けられたような、合計が合うようにデータを増減するとか、任意のデータの場所を入れ替えるという方法では、CRCチェックをごまかせません。 CRC値が狂わないようにデータを書き換えるのはそれなりの労力が必要になります。 そしてパリティビットやチェックサム方式に比較して、もっと大きなデータブロックに対してCRCを付与しても、十分に信頼度のあるエラーチェックができます。 しかしそのCRCにも弱点はあります。 そこでさらに優秀なハッシュ関数、MD5や、SHA-○○などが開発され、年々改良されています。 ---- 「暗号化する」ということと「ハッシュ値を求める」ということは似ている部分がありますが、決定的な違いがあります。 「ハッシュ値から元のデータは復元できない」ということです。 まあそりゃそうです、何百分の一、あるいは何万分の一になったデータから元のデータ列が再生できたなら、どんな超圧縮技術が発明されたんだってことになりますが、さすがにそんなことはあり得ません。 ハッシュ値の意味とは、 「ハッシュ値が違うなら、受け取ったデータはどこかが壊れている」 そして 「ハッシュ値が等しいなら、データはまず改竄されていないと信用できる」 というところにあります。 まあ、偶然にもハッシュ値が合うように複数個所のデータ破損が起こり、検出できなかった、ということは当然あり得るのですが。 そういう破損にも強い計算方法であること、1ビットでも違えばハッシュ値が大きく変わるものであること、ハッシュ値の変わらない改竄方法がなかなか見つからないようなものであること、そういう条件を満たすものほど、「優秀なハッシュ関数」であると言えます。

noname#249103
質問者

お礼

回答ありがとうございます よくわかりました CRCはハッシュの一形態である CRCはすでに過去のものかと思ったのですが、そうではない ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

  CRCとハッシュ値は計算方法が違う  

noname#249103
質問者

お礼

回答ありがとうございます 計算方法は違うんですね 用途はどうでしょう どんな時に使われるものなのか

全文を見る
すると、全ての回答が全文表示されます。
  • 121CCagent
  • ベストアンサー率51% (14316/27874)
回答No.1

ハッシュ値 http://e-words.jp/w/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E5%80%A4.html ハッシュ値 (hash value) https://wa3.i-3-i.info/word11949.html 巡回冗長検査 https://www.weblio.jp/content/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB 巡回冗長検査 https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB 等々検索したら色々出てきます。 CRCはデータの誤りを修正りたりする場合に使うものでハッシュ値はファイルの同一性を見るためのもので目的が違うような気はしますけどね。

noname#249103
質問者

お礼

回答ありがとうございます 目的が違うとのこと ファイルの同一性を検証するという目的に使うというハッシュ値 ファイルの同一性を検証しなければならない場面とはどういう場面か? あるデータを送信してその送信路での改ざんを疑う場合、ハッシュ値が使用されるのではないかと思ったのです すると、同じような目的に使用されるCRCは現在利用価値があるのか? などということを考えてしまったのです

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 現代における経済の問題についての入門書

    経済の仕組みについての入門書ではなく、 現代における経済の問題を分かりやすく解説した入門書のおすすめを教えて下さい。

  • INIファイルの改ざんを検出する

    自作でソフトウェアを作成しているのですが、その中でINIファイルに設定を書き出しています。 しかし、実体のあるテキストファイル(INI)で保存すると、簡単に改ざん(ユーザーの意図していない悪質な改ざん)をされてしまうことになります。 ソフトウェアの性質上、INIファイルに保存されているデータをevalすることがあるのですが、 もしそこが改ざんされていれば大変なことになりかねません。 そこで、INIファイルの改ざんを検出、または改ざんされないようにしたいのですが、どのような手段があるでしょうか。 自分で考えたのは、 アプリケーション終了時に ・INIファイルのMD5ハッシュを取得、それを記憶。 ・INIファイルのタイムスタンプを記憶。 をして、次回起動時に現在のINIファイルのMD5,タイムスタンプと比較して、改ざんを検出するというものです。 ですが、この方法だと結局はMD5のハッシュ値やタイムスタンプをどこかに保存しておかねばならず、 そうなるとそれらも改ざんされる恐れがあって結局意味を成さなく成ってしまいます。 どうすると、一番効率的で安全でしょうか。 レジストリも結局は改ざんされてしまいます。 そもそも、完全に改ざんを防ぐことはできないだろうと思っていますので、 出来るだけ改ざんされにくい方法、または改ざんを検出しやすい方法をご教授いただければと思います。 様々な意見を頂きたいので、既に回答が出ている場合も追加で回答頂けると幸いです。

  • 接続方法の違い?

    初めまして。このカテゴリでは初めて質問をさせていただきます。 私は名古屋在住で、BIGLOBEのダイヤルアップ接続「使いほーだい」を使用しています。 パソコンが古いもので、買い換えを機に接続環境も光やADSL等の高速回線に変えようかと考えています。 NTT西日本のサイトにおいて、伝送損失等のチェックをしてみたところ、NTT収容ビルまでの距離が3150m、伝送損失50dbという結果がでました。これではとても無理だと思っていたところ、BIGLOBEの光接続一覧の中に「アクセスコミュファ」とあり、回線キャリアがNTT西日本ではなく、中部電力となっているのです。 中部電力なら、自宅から500mもないところにあるのですが…。 回線キャリアが「NTT西日本」と「中部電力」ではどう違うのか、それによる伝送損失も変わってくるのかを教えていただければ幸いです。 また、ダイヤルアップでの接続の仕組み(NTTの収容ビルを介して接続するのかどうか)も教えていただければ幸いです。 よろしくお願いします。

  • Windowsタスクでのネットワークの検出方法

    皆さんの投稿をいつも参考にさせて頂いております。 1つ質問があります。 普段、どのネットワークには繋がっていないノートPCがあります。 そのノートPCは、ダイアルアップ(RAS)にて、ネットワークに接続するのですが、 その接続に条件があり、接続先のサーバとの時刻誤差が±2分以内でないと ダイアルアップ接続が確立されないのです。 そこで、ダイアルアップが接続する度に時刻同期をさせ、 次回ダイアルアップ時に備えたいと考えております。 理想の仕組みとしては、schtasks コマンドにてネットワーク検出時に 時刻同期プログラムを走らせる。という事をしたいのです。 (時刻同期は、Windows標準の時刻同期は使用できない環境なので、あるプログラムを起動させて、時刻同期をする予定です) 長くなってしまいましたが、要約すると WindowsXPのタスクでネットワーク検出をする事が出来ますか? という質問になります。 皆さんのお知恵をお貸し下さい。よろしくお願いします。

  • Lovgateに感染してしまいました

    事務所のネットワークがLovgateに感染してしまいました。 事務所のダイアルアップがかかりっぱなしになったり、 再インストールしたWindows2000が1時間後には再感染 したりともうむちゃくちゃです。 事務所のネットワーク内には10台ほどのPCがありまして Windows98と2000です。感染はフリーのAVGで検出しま した。 調べると、共有ファイルを利用して感染する・・と書いて ありましたのでLAN経由ですべてのPCに感染してる恐れが あります。 しかしダイヤルアップのためにWindowsUpdateが難しい 状況です。しかしアップデートなしでは駆除しても すぐに再感染してしまい、収集がつかない状態です。 ウィルスに詳しい方でしたら、どのように対応されるの でしょうか・・アドバイスなどいただけたら幸いです。

  • シリアル通信の原理について

    シリアル通信の調歩同期式は、「伝送を開始する際にまずスタートビットを送り、続いて一文字分のデータ(7~8ビット)、パリティビット、最後にストップビットを送る。」と多くのウェブサイトで解説されていると思います。 またビットレートも1200bps/2400bps/4800bps/9600bps・・・など複数あると思います。 上記仕様については理解しているのですが、これらを実現する具体的な仕組みが分かりません。 具体的には、 1.受信側は送信側のビットレートをどのように知るのでしょうか? 2.同様にデータが7ビットと8ビットのどちらであるかをどうやって判断するのでしょうか? 3.受信側は送られてきたデータのビットを1バイト毎にレジスタやメモリに格納すると思うのですが、1つのプログラムにつきどこからどこまでが該当のデータであるかをどうやって判断するのでしょうか?(送られてくる全体のデータサイズをどうやって知るのでしょうか?) ググっても上記の具体的な解説が見つからず、理解できずにおります。 ご回答どうぞよろしくお願いします。

  • 宗教を脳科学から分析した書籍を教えてください

    脳の機能や宗教などを専門的に解説した良書を教えてください。 うつ病や強迫性障害、ストレスなどといった脳の機能の仕組みが、宗教の成り立ちや発展、儀式などと密接な関わりがあるのではないかと感じています。 釈迦は悟りを開いたといわれていますが、悟りを開くとは、うつ病が寛解した瞬間のことであるとどこかで耳にしたことがあります。 先日、仏式の葬儀に出る機会があったのですが、死者を前にして弔う儀式や、邪念や不安を除くために念仏・真言を繰り返し唱える行為など、人間の脳の機能の仕組みと関係が深いのかなと感じます。 畑ちがいということで専門家が互いに境界をおかすことは難しいとは思うのですが、例えば仏教やキリスト教、イスラム教などを現代の精神医学や脳機能などの見地から専門的に解説された書籍やコンテンツなどはありませんでしょうか。うさんくさいものもたくさんあるとは思うのですが、著名な専門家や識者、論文などお教えいただければ幸甚です。 それぞれの学説や簡単な論旨などもご紹介いただけるとうれしいです。 何とぞよろしくお願いします。

  • Outlookメールが使えなくなってしまいました。

    Outlook Exを利用しているのですが、迷惑メールが多いためメールアドレスを変更しました。 アドレスの変更に伴ってメールソフトの設定などは行いましたが、Outlookを立ち上げると「ダイヤルアップ接続」のタグが出て「接続先」「ユーザー名」「パスワード」の入力画面になります。 入力後、接続をすると「ダイヤルしています・・」というメッセージが表示されるのですが、 しばらくたつと「モデムを検出できませんでした。モデムは使用中、電源が入っていない、または正しくインストールされていません。」というメッセージが表示され接続が中断されてしまいます。 パソコン初心者なので自分なりに調べてはいるのですが、用語自体が難しく感じなかなか解決に辿り着きません。。 初心者の私にも分かりやすく解説してあるサイト、もしくはご説明いただける方がいらっしゃればご教示ください。 宜しくお願いいたします。

    • ベストアンサー
    • ADSL
  • 以前ADSLが繋がらなかったのですが。。

    NTT基地局から3530m、伝送損失50dBです。 (NTTのHPで確認) 1年以上前にフレッツADSLを導入してみたのですが やはり遠いためか、うまく繋がりませんでした。 ずーっとADSLは無理と思い、未だにダイアルアップで メールのみのユーザーでした。 で、本日NTT116番になにか良いサービスがないかと 思って相談をしたら ADSLを勧められ、「遠いし、1年前ほどはダメだった」 と伝えたのですがNTTの方は「今は違うから大丈夫」 というのです。 ADSLの仕組みが変わったわけでもないと思うのですが 1年前はダメで、今は大丈夫ということがあるのでしょうか? それに、サービスタイプも「1.5M」よりも「モア」を 勧められました。 以前の認識ですと、距離が2km以内の確実に繋がる人は 1.5Mより8Mの方が快適なスピードが出るけれど 3km以上にもなるような人は、「早くてもどうせスピード が出ないのだから1.5Mで充分」と思っています。 やはり3.5kmも離れていたらADSLは無理なのでしょうか それとも試してみる価値はあるのでしょうか? よろしく回答お願いします。

    • ベストアンサー
    • ADSL
  • ハッシュのハッシュを実現したい。

    ハッシュのハッシュを行いたいですがうまくいきません。 ◆正しい例 %ultraman = ( TARO => { cpu => "Celeron(266MHz)", memory=> "32MB", hdd => "4.3GB", }, JACK => { cpu => "Pentium2(333Mhz*2)", memory=> "128MB", hdd => "9GB*4", }, ); $name = "JACK"; $item = "cpu"; print "\$ultraman{$name}{$item}=[$ultraman{$name}{$item}]"; exit(0); __END__ ◆このように使えたら便利(要はハッシュの代入でハッシュのハッシュを実現したい) %a=(); %b = ("cpu"=>"aaaa", "memory"=>"bbbb"); $a{'JACK'} = %b; #---> このように代入したい $name = "JACK"; $item = "cpu"; print "\$a{$name}{$item}=[$a{$name}{$item}]"; exit(0); __END__

    • ベストアンサー
    • Perl