2018年です。私たちは未来に生きています。ピザを注文し、作られて、家に届けられるのを見ることができます。では、なぜオンラインで投票できないのですか?

プログラミング言語とは何か、なぜそれが必要なのかという背景から始めましょう。すぐに、オンラインで投票したくない理由がわかります(そして、投票中に近くのコンピューターを使用したくない理由がわかります)。

おそらく、コンピューターがバイナリ、1および0で実行されることをご存知でしょう。そして、バイナリで書くのは難しいです。実際、非常に難しいので、基本的に誰もそれを望んでいません。たとえ成功したとしても、作成しているのは数字の束に過ぎず、コードを理解するのは、数週間後にあなたを含めてだれにとっても非常に困難です。実際に。

代わりに、コンピューター科学者は「機械言語」を発明しました。これらは、バイナリコードを、人間が話す言語に少なくとも少し近いものに変換する抽象化です。それらはまだ基本的ですが、正しい方向への一歩です。機械語は、設計対象の機械のハードウェアに基づいており、それに結び付けられています。したがって、「10と20を加算してその結果を画面に出力する」などの簡単なことは言えませんが、「レジスター1に値10を入れ、レジスター2に値20を入れ、これら両方のレジスターをマシン言語は、コンピューターで実際に実行するために必要なバイナリ1と0に変換されます(これは「コンパイル済み」と呼ばれます)。 。

ここには明らかな欠点があります。機械語で書くには、コンピューターのハードウェアに精通する必要があり、すべてのコンピューターのアーキテクチャはわずかに異なります。さらに、プロセスのすべてのステップを明示的に指定する必要があります。それは苦痛です。しかし、利点は、将来的に機械語で書かれたプログラムを見るとき、特にバイナリで1と0の無限のストリームを見るのに比べて、何が起こっているかがより明確になることです。

あなたが何を書いたとしても、あなたはコンパイラがあなたが書いたものをバイナリコードに正確に変えることを信頼しています。結果を台無しにしたい場合は、コンパイラを台無しにするだけです。

次のステップはハードウェアを抽象化することです。したがって、「加算器」や「レジスタ」などの場所を実際に知る必要はありません。十分にスマートなコンパイラを構築すれば、マシンに依存しないプログラミング言語を設計でき、 「10と20を加算し、その結果を画面に出力する」などのことを簡単に処理できる、より抽象的な命令を使用します。その後、コンパイラに依存してそれを機械語に変換し、バイナリに変換します。

これらのプログラミング言語はすべて、この問題を解決するために異なるアプローチを採用していますが、同じ目標を共有しています。人間がコンピューターコードを読みやすくすることです。これにより、理解と保守が容易になります。今日のプログラミング言語では、10 + 20の結果を次のように簡単に印刷できます。

印刷10 + 20

コンピューターを信頼できない理由を見つけましたか?

ヒントをお伝えします。コンパイラーにあります。

あなたが何を書いたとしても、あなたはコンパイラがあなたが書いたものをバイナリコードに正確に変えることを信頼しています。結果を台無しにしたい場合は、コンパイラを台無しにするだけです。

たとえば、「print」コマンドを変更して、指定した数値に常に1を加算すると、プログラムは正しくプログラムされていても、プログラムは正しく実行されません。ソースコードを見ただけではグリッチを見つけることはできません。グリッチが存在する場所ではないからです。コンパイラには隠されています。

この例は基本的なものであり、プログラムが明らかに破損するため、かなり早く検出できます。しかし、もっと微妙なことをしたらどうなるでしょうか? 「print」コマンドをいじる代わりに、パスワードを含むコードを検出するたびにパスワード「ryaniscool」も機能するようにコンパイラを変更した場合はどうなりますか?

私のピザが配達されているのを誰かがハックして見たら、それは世界の終わりではありません。誰もそれを破ろうとするほど気にしません。しかし、投票はこれらのケースの1つではありません。

そうすれば、コンパイラでビルドするすべてのコンピュータープログラムに「バックドア」と呼ばれるものができます。つまり、必要に応じて玄関のドアをロックできますが、誰も知らない奥に秘密のドアがあるので、それは重要ではありません。何を書いても、パスワードコードがどれだけ安全であっても、「ryaniscool」というパスワードは機能します。あなたもそれを知りません。

明らかに、これは問題です。そして、あなたは思うかもしれません、「しかし、コンパイラは他のようなコンピュータプログラムです。コンパイラのソースコードを調べて、悪意のあるコードがないことを確認できます。私がする必要があるのは、パスワードとして「ryaniscool」を追加することについて話している部分を見つけて、それを取り出して、私は大丈夫でしょう。右?"

そして、できます。あなたが言ったように、コンパイラは他のコンピュータプログラムとは異なります。そして、それは彼ら自身がコンパイルされることを意味します。

これを活用するために必要なことは次のとおりです。

ステップ1

以前と同様に、コンパイルするものすべてに「ryaniscool」を有効なパスワードとして追加するコードを記述し、これをコンパイラーに入れます。この時点で、コンパイラがコンパイルするものにバックドアを追加していますが、誰かが私のコンパイラのソースを見ると捕まってしまいます。そこで、ステップ2に進みます。

ステップ2

コンパイラー自身のコンパイル時を検出するコンパイラー用のコードを作成し、それが発生すると、ステップ1のコードをコンパイラーに追加します。これで、コンパイラーをコンパイルすると、コンパイラーが再ビルドされるたびに「ryaniscool」パスワードを挿入する方法をコンパイラー命令に追加する新しいバージョンが作成されます。そして、私のトラックをカバーするために、コンパイラソースから悪意のある命令を削除するだけでいいのです。

コンパイラがリビルドされるたびに、バックドアを追加するための指示が含まれるように、コンパイラがビルドされます。そのコンパイラが何か他のものを構築するときはいつでも、それらの指示に従い、バックドアをすぐに構築します。そして、それを明らかにするソースコードに悪意のあるコードが一行も残らないでしょう。

このバグを検出する唯一の方法は、自分でバイナリコードを調べることです。これは、プログラムが複雑になると、ハードに始まり文字通り不可能になるタスクです。 William Shakespeareの全作品は6メガバイト未満で入っています。 Firefoxブラウザーだけでも、インストールするために200メガバイトが必要です。これはコンピューター上の1つのプログラムにすぎません。そのコードの200メガバイトすべてを読んだ人間は生きていません。人間が読むことができるように設計された言語でさえ書かれていません。

なぜこれらの悪夢のマシンを使用しているのですか?

これは新しいものではありません。 1984年、ケントンプソン(ほとんどのコンピューターと携帯電話が動作するオペレーティングシステムの先駆者であるUnixを設計および実装した男性)は、「Reflections on Trusting Trust」という論文を発表し、この結論に達しました。

道徳は明らかです。自分で完全に作成したわけではないコードを信頼することはできません...ソースレベルの検証や精査を行っても、信頼できないコードの使用から保護されることはありません。

「完全に自分自身を作成する」とは、Kenは単にあなたが書いたプログラムを意味するのではなく、あなたがスタック全体を書いたプログラムを意味します。コンピューターを一から構築する時間、スキル、お金を持っている人はほとんどいません。コンピューターに含まれるすべてのソフトウェアも含まれます。これは、コンピューターを何でも信頼するための頭の中の弾丸のようです。

それでも、私たちはあらゆる種類のコンピューターを信頼しています。それで、何が得られますか?なぜこれらの悪夢のマシンを使用しているのですか?

まあ、一つには、コンピューターは本当に楽しくて便利です。そして、多くの点で実用的です。その上、コンパイラーのハックは実際に実行するのが難しい場合があります。誰かを標的とするには時間と動機が必要です。真実は、コンピューターに絶対的な信頼を必要としない場合が多いということです。結局のところ、誰かがハッキングして私のピザが配達されているのを見たとしても、世界の終わりではありません。誰もそれを破ろうとするほど気にしません。

しかし、投票はこれらのケースの1つではありません。

コンピューターで投票する唯一安全な方法は、投票者の目に紙の投票用紙を印刷し、承認してから投票箱に保存する方法です。

投票は、ハッキングの結果が大きな影響を与える可能性がある場合です。また、投票のターゲット設定は比較的簡単です(いつ、どこで行われるかがわかります)。結果を変える非常に強力な動機があります。 「ryaniscool」パスワードを追加するのと同じくらい簡単に、「add」コマンドを変更して、票を集計するときに、選択したパーティーに追加のコマンドを追加できるようにしました。

どのくらい追加する必要がありますか?正直なところ、この時点で、それは完全に私次第です。したがって、この結論:オンライン投票は決して安全ではありません。コンピューターの投票は決して安全ではありません。

コンピューターで投票する唯一安全な方法は、投票者の目に紙の投票用紙を印刷し、承認してから投票箱に保存する方法です。そうすれば、誰かがコンピューターシステムが危険にさらされていると考えた場合(誰かが投票を不適切に追加したと思われる理由がまったくない場合)、紙の証跡があります。言い換えれば、投票を合計するコンピューターは便利であり、それ以上のものではありません。本当の投票、本当の力は、まだ紙の投票にあります。

その紙の証跡がなければ、あなたはコンピューターを信頼したままです。

そして、誰もコンピューターを信頼するべきではありません。

更新:

このエッセイの周りの議論にはいくつかの繰り返しのテーマがあったので、ここでそれらをQ + A形式で組み込むと思いました!上記のエッセイは変更されていませんが、このテーマについてさらに読みたい場合は、以下が役立つと思います!

Q:コンピューター投票とはどういう意味ですか?

A:私はあなたがコンピューターに排他的に投票するシステムについて話している。紙の証跡は生成されない。この場合、コンピューターはあなたが投票したものに対する権威です。あなたが再確認できる他の情報源はありません。

投票でコンピューターを使用する倫理的で安全な方法は、権限としてではなく、利便性としてコンピューターを使用することです。紙の投票に投票し、コンピューターがそれをスキャンして結果を追加する場合、何かがうまくいかなくても物理的な紙の痕跡があるので、あなたはより安全に感じることができます。コンピューターに投票しても、投票が記録される前に正確であることを確認する必要がある紙の投票用紙を印刷する場合は、どちらの場合もコンピューターが便利であるため、より安全に感じることができます。問題が発生するのは、コンピューターが権威者になるときです。

Q:秘密のコードまたは何らかのキーを投票する各人に与えることでこれを修正することはできませんか、あるいは、生体認証で目や指紋などをスキャンできますか?または、2番目に投票が行われたときにインターネット上のどこかに投票をバックアップした場合はどうなりますか?

A:いいえ。コードとキーは傍受または複製される可能性があり、生体認証スキャナーはコンピューターであり、ここで説明したものとまったく同じ問題に対して脆弱です。そして、ネットワーク化されたシステム(コンピューターが共有し、どこかで「バックアップ」する)は、改ざんされていないことに依存しています。ごめんなさい。

Q:わかりましたが、プログラムをテストして、コンパイルしたコードの動作が予想と異なるかどうかを確認できますか?

A:これはいくつかの理由で機能しません。確かに、私の「10 + 20の合計値を変更する」例では、変更を簡単にテストしてキャッチできます。しかし、そもそもそれをテストすることを考えていたとしても、なぜそうするのでしょうか? —それでも問題は解決しません。私の悪意のあるコードは、テストされていることを検出し、悪いことは何もせず、見ていなければアクティブになります。

フィクションのようですね。

まあ、それはすでに行われています:2015年のフォルクスワーゲン排出物スキャンダルでは、排出量がテストされているときに車のオンボードコンピューターが検出され、低電力の環境に優しいモードで実行され、テストが終了すると高電力汚染モードに切り替わりました。コンピューターはテスト中に検出し、最善の動作を実行し、テストが終了すると停止しました。ちなみに、このスキャンダルは、フォルクスワーゲンが修正するために183億2000万ドルを費やしましたが、28億ドルの罰金は含まれていません。

フォルクスワーゲンがそもそもこれを行う唯一の理由は、それが彼らにとって有益であり、彼らが捕まることはないと思ったからです。同じインセンティブが選挙にも適用されます。

Q:コンピューターでの投票を余儀なくされた場合、それは投票すべきではないということですか?

A:いいえ、とにかく絶対に投票する必要があります。選挙で干渉する目的は、あなたの権利を奪うことです。投票しないと、すでに100%の効率で自分の権利を奪っています。投票に行き、その後、コンピュータ投票を二度と使用する必要がないようにするために必要なことを行います。

Q:これは、コンピューターを信頼するべきではないということですか?

A:絶対的な意味で:はい。どのコンピューターシステムにも100%の信頼を置くべきではありません。しかし、それは明らかに実用的ではなく、ほとんどの場合、コンピューターを100%信頼する必要はありません。あなたが投票する数少ないケースの一つです。次の質問はこれにさらに詳しく入ります。

Q:さあ。私たちはオンラインで銀行取引を行っており、毎日数十億ドルがデジタルで動き、さらにあなたはこれをコンピューターで書きました。確かにあなたは警戒心や偽善者ですか?

A:これは絶対的な信頼のアイデアの出番です。私はコンピューターを絶対に信頼しているわけではありませんが、オンラインで銀行を利用しています。しかし、それは何かがうまくいかない場合、銀行が後でそれを修正できるからです。情報が盗まれる可能性があることを知っているクレジットカードを使用しますが、その場合は、クレジットカード会社がそれを修正することを信頼しています。そして、彼らはそうします—カードを毎日使ってあなたから得た利益は、詐欺や壊れたソフトウェアをカバーするための費用を補うからです。

しかし、事実の後に壊れた選挙を修正する方法はありません。

それはすべて妥協の問題です。これをオンラインで公開するのは便利で、自分の言葉が変わる可能性があることを知ってやったのです。リスクはありますが、最終的には世界の終わりではありません。低いステークスと利点はマイナス面を上回ります。同様に、オンラインバンキングも便利です。また、データやお金が盗まれる可能性はあるものの、銀行がそれをカバーできると確信しているため、妥協しても構わないと思っています。そして、はい、私は友人を夕食に返済するために10ドルを送るためにコンピューターを使用しますが、私は賭け金がとても低いのでそれをします。わずか10ドルです。

投票に関しては、賭け金は低くありません。

そして、選挙制度、つまり民主主義は、妥協したいものではありません。

Q:ブロックチェーンはどうですか?ブロックチェーンについて言及したはずです。これは、1984年には存在しなかった新しいテクノロジーであり、この問題を確実に解決することができます。

A:いや、いや、いや。ごめんなさい。私もそれがうまくいったことを望みます。

Q:何を話しているのか分からず、誰があなたを権威にしたのですかなぜ私はあなたを信頼する必要がありますか?

A:エッセイで述べたように、これらは私の素晴らしい独創的なアイデアではありません。私は基本的に、1984年にケン・トンプソンが「Trusting Trust on Trust」の論文で主張したことを言い換えています。ケンの議論は実に強力です。彼の例は、ほぼすべてのコンピューターで使用されるログインプログラムです。投票について話しているだけです。 Kenの論文は、30年以上にわたってコンピューターサイエンスの独創的な論文として知られていますが、コンピューターサイエンス界以外ではあまり知られていません。だからこのエッセイを書きたかったのです。

(ちなみに、Kenが提起した問題と私が言い換えた問題を修正する方法があります。コードを2回コンパイルできます。1回は新しいコンパイラで、もう1回は既知の正常なコンパイラで。2つの出力を比較して、もちろん、これはコンパイラが優れていることを知っています。これは、もちろん、その既知の優れたコンパイラをどこから入手するのかという疑問を提起します。このテーマに関する博士論文です。

Q:わかりました、確かにこれはかなり不愉快ですが、これはすべて仮説です。大声で叫ぶために、原子炉を制御するためにコンピューターを使用しています。物事が安全でない場合、私たちはそれを知っているでしょう。

A:ここで説明した攻撃と非常によく似た攻撃(攻撃の証拠が隠されています)は、ほんの数年前に2010年にStuxnutワームで実際に行われました。 。

これらの攻撃はすでに発生しています。おっと。

Q:コンピューターの投票は悪いかもしれませんが、紙の投票も変更される可能性があります。どちらも完璧ではありません。

A:もちろんです。しかし、紙の投票にはいくつかの大きな利点があります。欠点はよく理解されており(紙が信頼できない理由に関する大きな論文を書いている人はいません)、その脆弱性は物理的なアクセスに限定されます。

紙の投票選挙を台無しにしたい場合は、投票を盗むか、投票を変更するか、投票を詰め込む必要があります。どちらにしても、投票箱に物理的にアクセスする必要があります。そして、それは悪い俳優ができるダメージの量を制限します。世界の半分離れた退屈な10代は、彼の地下室からの紙の投票選挙には影響しません。コンピューターの投票でも同じことは言えません。

そして、これらすべてに加えて、単純な事実があります。プログラマーは完璧ではありません。このエッセイの攻撃が使用されていなくても、コンピューターの投票システムが安全であることを意味しません。ヘック、グーグル-とても賢い人を雇うことに私たち全員が同意できると思うが-彼らが自分たちのソフトウェアのバグを見つけるのを手伝ったら彼らがあなたに現金を払う報奨金制度がある。間違い。

ソフトウェアのプログラミングは難しいです。コンピューターは大変です。才能のある善意のソフトウェア開発者でさえ、ソフトウェアスタック全体を侵入にさらすという単一のミスを犯す可能性があります。 Heartbleedバグは、2011年に偶然に導入されました-理論上は地球上の誰もが見て、検査し、検出することができたオープンソースソフトウェアでしたが、インターネット上のサーバーの17%は2014年まで見つかりませんでした脆弱になりました。

それは偶然に行われました。彼らが試みていた場合、誰かが何ができるか想像してみてください。

見て、コンピューターの投票が悪いと聞くのは残念だ。昼休みにスマートフォンでアプリに投票するだけで簡単に想像できて、外の物理的な空間に並ぶのは面倒です。しかし、選挙が便利であるよりも重要なのは、正確であることであり、コンピューターによる投票は確かに便利ですが、正確であると信じてはならないことを納得していただければ幸いです。

Q:関連するxkcdはありますか?

A:関連するxkcdが常にあります。