DESやAESやBlowfishなど様々な暗号化の手法がありますが、可逆暗号でありながら同じものを暗号化しても毎回、暗号結果が異なるという仕組みがいまいち理解できません。
sample を暗号化したら 39gu48vnls0c8ihrf という文字列になり
39gu48vnls0c8ihrf を復号化したら sample になりますが、
もう一度 sample を暗号化したら sduebfi738fiuwoc93 になり
sduebfi738fiuwoc93 を復号化しても sample になります。
単換字暗号で対応表を元に入れ替えれば毎回同じ暗号結果となりますし、復号も対応表さえれば簡単です。
検索はしておりますが複雑な計算式などで説明されていて理解が出来ませんでした。
暗号化の結果が毎回異なるにもかかわらず、復号が行える仕組みを高校生レベルの知能の人に教える内容でご教授いただけないでしょうか?
コメント(4件)
質問文に鍵の話が出てきてませんが、純粋にあるデータをある鍵で暗号化した場合の話と、暗号化処理を実装したソフトで処理した場合では、話が違ってきます。
基本的には同じデータで同じ鍵を使えば、同じ暗号文が作られるはずです。ただ、暗号化処理を実装した具体的なソフトの場合、例えば、実際のデータを暗号化するための鍵は乱数から生成し、その生成した鍵をユーザが指定した鍵で暗号化し、「乱数鍵で対象データを暗号化したもの」と「乱数鍵をユーザが指定した鍵で暗号化した内容」を合わせて、最終的な出力結果とする、といった事をすれば、同じデータ、同じ鍵でも、出力内容が毎度変わる、という状態を作る事はできます。
実際に、内容に対する暗号化の際に使う鍵を乱数から生成する、という実装は多いです。
典型的なのは SSL/TLS で、実際の通信内容の暗号化に使う鍵は、クライアント、サーバ間でやり取りした乱数から生成します。その乱数のやり取りを守るために、公開鍵暗号の仕組を使ったりします。メールの内容の暗号化に使われる PGP なんかも、同様の処理をします。
簡単な例を考えると分かりやすいかと。
暗号化方式としてシーザー暗号を用いて、
右へのシフト数を鍵と思えば、
共通鍵:3
HATENA -> KDWHQD
という風に暗号化されます。
復号する際は、共通鍵分だけ左にシフトすればよいです。
これに一工夫をして、上記の場合で共通鍵として利用したものを乱数で出すこととします。
そして、この乱数に、共通の数(共通鍵)を足したものを付加したものを出力としてみます。
共通鍵:2
乱数鍵:3
HATENA -> 5KDWHQD
共通鍵:2
乱数鍵:2
HATENA -> 4JCVGPC
というように異なる結果になりますが、複合する際には先頭の数字と共通鍵から、実際のシフト数が判別でき復号が可能になります。
実際にはもっと複雑ですが、結果が変わるのに復号可能な基本的なコンセプトはこんな感じかと。
復号 :画数を数える
としましょう.
暗号化の結果「土」「口」「大」「下」「久」....その他いろいろ
どれでも復号の結果は「3」です.
いかがですか?
いただいたアドバイスを元に簡単ではありますが実装してみました。
生成した暗号の中にKEYを埋め込むという発想がなかったので、皆さんのご意見を見てひじょうに参考になりました。
現状ではソースを辿れば復号が出来てしまうので、ちまたで公開されているソースを見ても解読出来ないというようなものはさすがに仕組みが理解できないので作れませんが、今回作成したものはちょっとしたことには使えそうです。
ありがとうございました。