映画 サマーウォーズの暗号を京大生が解いてみた結果…

サマーウォーズは細田守監督の代表作、そして今や夏の映画の定番の一つといってもいいと思います。

 

そんな作品の一番の見所は、やはり主人公のケンジ君が「よろしくお願いしまぁぁああーす」と言いながらエンターキーッッッタアァァアンッと押すシーンではないでしょうか?

kenji

 

さてさて、そんなサマーウォーズですが、京大生として注目したいのは、あの暗号

いぶき
あれ、解けるの?

と疑問に思ったので、解き方とかについて色々調べてみることにしました。

 

※ここからはネタバレを多少含みます。

 

 

一応サマーウォーズをご存知ない方のためにあらすじを紹介しておきますね。

世界中の人々が集うインターネット上の仮想世界OZ(オズ)。OZの管理権限や個人情報などは、世界一安全と言われるセキュリティによって守られていた。

ある日、高校2年生の健二は、憧れの先輩である夏希から、一緒に夏希の実家に行くという「バイト」に誘われる。実家には夏希の曽祖母であるおばあちゃんの90歳の誕生日を祝うために、26人の親族が一堂に集まった。

その日の夜、健二の携帯電話に数字の羅列が書かれた謎のメールが送られてくる。数学が得意な健二は、それを何かの問題だと思って回答してしまう。それはOZの暗号システムの鍵だったのだ…

システムを乗っ取られたOZでは、いろいろな騒動が起こり,,,

[続く]

 

 

 

暗号について

暗号

 

まずは暗号の概要について、軽く触れておきます。

暗号化の種類は”RSA”と言います。色々調べていくうちに、結構な人がこの暗号について調べていたことがわかりました!

 

この記事とかが参考になりました。

サマーウォーズ:曜日の求め方とか2056桁の暗号とかの解説

 

しかし、僕には何が何やらよくわかりませんでした…

とりあえず「RSA暗号」というものを使っているらしいということまではわかりました。

まあ、実際の暗号文を見てみましょう。

 

けんじくんのケータイに送られてきた暗号文はこちらです↓

814381625757888867669235779923577997614666120182967212423625362561842935706935245733897830597123563958705058989075149759929002687954354162959592635382962929999373527393893015272028273730979383739039731352452762289782738269898221546122131360619421303021411333103461918121612113166613120121314764123131664436383883993965356373934846376383933154328878976238398563738365433423534644888463839384643839396476573748938457345564245126348446687582487268268599929226493922762658492645161381238929910492254753685216544526687633169497562621466262164751662165496216233621461156486215622262254897462256624662062148316547254564902302454621245456232245162312424565124345181640126512518124243216518454246124324649155489615622654043145149481612161465225465454643245189159164648464546424211515912121512512462155666156124173641635467148361593823787985896185613764728526928789895656425257381651935613893981991374836873823541837167837898784e765434576345637173823138479813768765238613741311236937264827654778277325473898928152422542515522536131313315113131436465191945461216494600604573790464767487277872182954748299792393745245635321521251762851642417215462185215216524128156631535133635135624373234146484945914624245144655937545243151552364728646254632586421653765268752146364216452966051582166316165298691556167867525411656512513466425667026216616514563466741256352312000214153442514256547456176523156416857441156514555136515571345216351461342355314575145551352534665275245434123524164512514854135513552515115617195661675681735681361373613725382416248275264278352381658327184562416554631567452166375415676516659156451553145235234613252553232516852127126451621572321315221367251321433642212341623226546564323221637261423214278263167424542351254254143654215461524423554259418149422453565065652624639606225635206461462565251661258214063232062267640333141325426372633225334823727365243212325634253834253324362370285630743325310023223052360452321456631647857143521514557163023223522423243624702260270285607962516432235723674724715613526215523165518237142314221623715637261634153471

で、これを復号化(デコード、つまり暗号を解いた)したのが以下のテキスト(パスワード)です。

 

the magic words are squeamish ossifrage To know is to know that you know nothing That is the true meaning of knowledge

このパスワードは2つの部分に分けられて、まず前半の「the magic words are squeamish ossifrage」という文。これは、アメリカで実際に行われた暗号解読問題の解答です。

詳しくは以下のウィキで見てください↓

https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7#RSA-129

 

そして、後半が「To know is to know that you know nothing That is the true meaning of knowledge」となっています。

 

この文を訳すと、

魔法の言葉は”気難しいヒゲわし”。知ることとは、あなたが何も知らないということを知ること。それが本当の意味で”知る”ということである。

 

ちなみに、この暗号文も、1977年にアメリカの科学雑誌・サイエンスで、懸賞問題として発表されました。(解読には数百年以上は必要だとされていましたが、1994年に解読されています。)

また、後半の「To know~」は、古代中国の哲学者・孔子の言葉が元ネタです。(論語の一説「知るを知るとなし、知らざるを知らずとなす。これ知なり」から。)

 

これを初めて解いた人はどんな思いだったでしょうか?

これを知った瞬間、ケンジ君の本当のすごさがわかりました。だって高校生のご身分でアメリカの懸賞金問題解けるのですよ?立派な数学者レベル、いやもはや人間じゃ…汗

 

ちなみに、サマーウォーズで出てきた例の暗号を「RSA-129」と確信できるのは以下の理由からみたいです。

 

①パスワードが有名(?)なRSA-129の解であること「The Magic Words are Squeamish Ossifrage」

②健二は電車で「Shorの因数分解アルゴリズム」の論文(or 記事)を読んでいた。(これは金曜ロードショーでもカットされていないことから、複線的な意味があるのでしょう)

Shorの因数分解アルゴリズム

 

③健二はモジュロ演算が得意。(あとで解説します。若い人はmodの方が馴染みがあるかも)

<新幹線の中の会話>

健二「1992年の7月19日は日曜日でした。」

夏希「ひょっとして、全部憶えているの?」

健二「いえ、モジュロ演算っていうのを使って…」

 

④メールで送られてきた数字が、RSA-129に符合する。

81 43 81 62 57 57 88 88 67 66 92 35 77 99(メールの数字)

11 43 81 62 57 57 88 88 67 66 92 35 77 99(RSA-129)

 

スポンサーリンク

暗号とは?

夏の空

では、そろそろRSA暗号解読に進みたいと思いますが、その前に…

まずは「そもそも暗号ってどういうもの?」、と「暗号を解くとはどういうこと?」ということを軽く触れておきます。

わかってるよー、という人は次の章まで飛ばしてくださいm(__)m

そもそも暗号とは?

あん‐ごう〔‐ガウ〕【暗号】

通信の内容が相手以外にわからないように、当事者の間だけで決めた記号。

出典|小学館デジタル大辞泉

というわけです。

 

といっても

わかるかぁ(-_-#)

って感じですよね。ご安心ください。例を挙げて説明します。

 

暗号を送る手順としては

  1. まず相手に伝えたい文を用意する
  2. それを相手以外には内容がわからないようにする
  3. 相手に送る
  4. 相手がそれを元の文に戻す

ということになります。では、これをどういう風にするのでしょうか?本当に簡単な例を見ていきます。

 

例えばあなたは相手に「おはよう」という文字を送りたいと思います。これが伝えたい文です。

でも、「おはよう」という数字を送ってしまっては周りから丸見えです。

なので、「かひらえ」という暗号文、そして「-1」というヒント(鍵)を作ります。これが②にあたります。この暗号文の意味は、

い-1 =あ

う-1 =い

え-1 =う

のように、50温順に文字を並べて一つづつずらしていくという意味です。ここまでついて来れてますか?

 

そして③で「かひらえ」という暗号文を相手に送ります。そして、その相手にこっそりと「-1」という鍵を渡します。この時、周りの人は「-1」、つまり一つ前にずらす、ということを知らないため、「かひらえ」だけを見ても???となります。(めちゃめちゃ頭のいい人ならできるかも)

 

そして、④で相手は文字を一つ前にずらし、晴れて相手に「おはよう」の文字が届きます。

はい、これで暗号文の例は終わりです!

 

 

ちょっとまったー!

と思ったあなたは鋭いです。

 

この説明、少し無理があるのです。

それは、

「どうして『おはよう』の文字は周りに見られるかもしれないからって暗号文にしたのに、「ー1」という鍵は誰にも知られずに相手に届くの?」

ということです。

これが暗号業界(そんな業界があるのかはわかりませんが…)における長年の悩みでした。

そしてこの矛盾を見事に解決したのが「RSA暗号」という暗号方式なのです!

小まとめ

ここで一回小まとめです。

暗号とは基本的に

  • 相手に送りたい文である「元の文」
  • そしてそれを誰にも話から内容にした「暗号文」
  • さらにその暗号文を解くためのヒントである「(鍵)」

の三つからなっていることを覚えておいてください!

長いですね。すみません。なんか書いてても疲れてきたのですが、後少しです!頑張ってください!

 

RSA暗号文

Summer_wars_logo

さて、ここからはいよいよRSA暗号文のお話です。

少し難しくなるかもしれませんが、ここまでこれたあなたならきっと大丈夫です。

それでは、いきましょう。

 

先ほど、

ヒントを誰にも見られずに渡すことができないことが問題だ!

という話をしました。

 

そして、この問題を見事に解決したのがRSA暗号方式だった

というお話もしました。

ここからは、その謎についてです。

 

まず、結論から言うと、これは「公開鍵」と「秘密鍵」と言う二種類の鍵(ヒント)を使うことで解決できるのです。

ま、こう言われてピンと来る人はそういないので詳しく解説します。

 

まず、公開鍵というのはいわば誰でも見れるヒントです。これはヒントというよりは「こういう風にして元の文を暗号文にしてね」という説明書みたいなものです。ここからはこれを「説明書」と呼びましょう。

 

そして「秘密鍵」の方は本物の鍵です。こちらは先ほどの「鍵」と変わらないので、これからはこちらの方を「鍵」(ヒント)と呼ぶことにします。

さて、メッセージを送りたい人はこの説明書通りに自分の送りたい「元の文」を「暗号文」に変換します。

そして先ほどと同じように、この文を相手に送り、相手がヒントを使って「元の文」に戻すのです。

 

おいおい、それじゃあさっきと変わらないじゃないか、とお思いでしょうが、実はこれがRSA暗号のすごいところで、

いったん「説明書」で「元の文」を「暗号」にしてしまったら、その「暗号文」を「説明書」で「元の文」にすることは不可能

という性質があります。まあ実際は「ほぼ不可能」なのであって、ケンジ君はこれを解いてしまったのですが…

 

意味、わかりましたか?

簡単に言うと、

そっちでこんな手順に従って元の文を変形すれば、誰にも読めない文ができるから!その後、それをこっちに送ってくれれば私はマル秘技術で解読するから!

ってな感じです。

 

この性質を難しい言葉で言うと、

公開鍵で暗号化したものは公開鍵で復号化できず、秘密鍵でしか復号できない

と言うことになります。

 

これはものすごいことで、今までは誰もいないところで鍵をやりとりしなきゃいけなかったのに、この方法だとそんな心配は無くなります。

相手に渡したり受け取ったりするデータは一切秘密にする必要がありません。

で、こんな便利を実現する暗号化方法が「RSA暗号」なわけです。

ちなみに、「RSA」というのはこの暗号を発明した3人の名前、ロナルド・リベスト (Ron Rivest) 、アディ・シャミア (Adi Shamir) 、レオナルド・エーデルマン (Len Adleman) の頭文字です。

 

さて、ここからがRSAの解き方ですが…

ここからは別の人にお任せします。

やはり、難しすぎましたね…

 

 

Q. サマーウォーズの暗号は京大生レベルの数学でも解けるのか?

A. 無理

 

 

この記事の目的はあくまで「みんなにわかりやすく」解説することを目的としているので、簡単にだけ。

まず、ケンジ君に送られてきた2054桁の数字がこちら↓

814381625757888867669235779923577997614666120182967212423625362561842935706935245733897830597123563958705058989075149759929002687954354162959592635382962929999373527393893015272028273730979383739039731352452762289782738269898221546122131360619421303021411333103461918121612113166613120121314764123131664436383883993965356373934846376383933154328878976238398563738365433423534644888463839384643839396476573748938457345564245126348446687582487268268599929226493922762658492645161381238929910492254753685216544526687633169497562621466262164751662165496216233621461156486215622262254897462256624662062148316547254564902302454621245456232245162312424565124345181640126512518124243216518454246124324649155489615622654043145149481612161465225465454643245189159164648464546424211515912121512512462155666156124173641635467148361593823787985896185613764728526928789895656425257381651935613893981991374836873823541837167837898784e765434576345637173823138479813768765238613741311236937264827654778277325473898928152422542515522536131313315113131436465191945461216494600604573790464767487277872182954748299792393745245635321521251762851642417215462185215216524128156631535133635135624373234146484945914624245144655937545243151552364728646254632586421653765268752146364216452966051582166316165298691556167867525411656512513466425667026216616514563466741256352312000214153442514256547456176523156416857441156514555136515571345216351461342355314575145551352534665275245434123524164512514854135513552515115617195661675681735681361373613725382416248275264278352381658327184562416554631567452166375415676516659156451553145235234613252553232516852127126451621572321315221367251321433642212341623226546564323221637261423214278263167424542351254254143654215461524423554259418149422453565065652624639606225635206461462565251661258214063232062267640333141325426372633225334823727365243212325634253834253324362370285630743325310023223052360452321456631647857143521514557163023223522423243624702260270285607962516432235723674724715613526215523165518237142314221623715637261634153471

改めて見たらすごいですね。

これを前半部分と後半部分に分けます。

前半部分:

814381625757888867669235779923577997614666120182967212423625362561842935706935245733897830597123563958705058989075149759929002687954354162959592635382962929999373527393893015272028273730979383739039731352452762289782738269898221546122131360619421303021411333103461918121612113166613120121314764123131664436383883993965356373934846376383933154328878976238398563738365433423534644888463839384643839396476573748938457345564245126348446687582487268268599929226493922762658492645161381238929910492254753685216544526687633169497562621466262164751662165496216233621461156486215622262254897462256624662062148316547254564902302454621245456232245162312424565124345181640126512518124243216518454246124324649155489615622654043145149481612161465225465454643245189159164648464546424211515912121512512462155666156124173641635467148361593823787985896185613764728526928789895656425257381651935613893981991374836873823541837167837898784

後半部分:

765434576345637173823138479813768765238613741311236937264827654778277325473898928152422542515522536131313315113131436465191945461216494600604573790464767487277872182954748299792393745245635321521251762851642417215462185215216524128156631535133635135624373234146484945914624245144655937545243151552364728646254632586421653765268752146364216452966051582166316165298691556167867525411656512513466425667026216616514563466741256352312000214153442514256547456176523156416857441156514555136515571345216351461342355314575145551352534665275245434123524164512514854135513552515115617195661675681735681361373613725382416248275264278352381658327184562416554631567452166375415676516659156451553145235234613252553232516852127126451621572321315221367251321433642212341623226546564323221637261423214278263167424542351254254143654215461524423554259418149422453565065652624639606225635206461462565251661258214063232062267640333141325426372633225334823727365243212325634253834253324362370285630743325310023223052360452321456631647857143521514557163023223522423243624702260270285607962516432235723674724715613526215523165518237142314221623715637261634153471

さて、ここから前半部と後半部、どちらが鍵でどちらが元の文かということを考えます。そして、

この場合鍵は後半部です!

ここで「どうして前半と後半の分かれ目はそこなの?」とか、「なんで鍵が前半と後半のどちらかがわかるの?」とかは割愛します。

さて、ここからどうするかですが、もちろん秘密鍵を盗み取るようなことはしません。

 

本物のハッキングではこの秘密鍵をどうにかして手に入れることを考えますが、ケンジ君の場合はそうではありませんでした。

それを、計算でやります。どういうことかというと、この鍵、掛け算によってできています。ともすると語弊があるかもしれませんが、今はそういうことにしておきます。

鍵がA×B、という形のかけ算で表すことができればその数と公開鍵を使って秘密鍵を作り出すのです。これを因数分解と言います。

 

タネがわかれば簡単な話。要するに

21というのが説明書だとしたら

21=7×3というのを元に

秘密鍵を見つけるのです。

21くらいなら簡単ですが、相手はなんと1138桁。解けるのかと言われると、

正直、無理です。

 

いろんな工夫をして解いても、1日とか2日とかでは求まらないでしょう。

家庭用のパソコンでやろうとするとなんと

10000000000000000000000000000年(10の28乗年)かかると言われています。

パソコンに計算させようと思うと無理があるようですが…

 

小まとめ

けんじくんは人間ではなくて、量子コンピュータ以上の頭脳を持った生命体だった(?)

↑冗談です

 

 

最後に

暗号を解いた家族

 

いやぁ、調べてみて改めて思ったのですが、けんじくんはすごいですね。友達に数学オリンピックの人がいるのですが、その人からみても異次元みたいですね…

なんでケンジ君は数オリの日本代表になれなかったんでしょう…

 

作品の中では、50人くらいがこの問題を解いていたとされていますが、こんな問題を世界で50人も解けてしまったら、暗号の意味がなくなってしまうかもですね…

ま、そういう難しい話は抜きにしても、サマーウォーズ、面白いですね!

何回も見たくなります。

 

最後はなんかグダグダになってしまいましたが、そこらへんはご愛嬌で!

ではまた、あの夏でお会いしましょう!

バイバイ!

 

 







関連記事 & スポンサーリンク






自宅で勉強するのに最適
スタディサプリ

コロナウイルスが蔓延するこんな状況下で、非常におすすめなのが「スタディサプリ」です。

オンライン学習だからできる、史上最強の講師とレベルの高い学びを、あなたに。