web-dev-qa-db-ja.com

自分の暗号化アルゴリズムを書く

私は現在、カレッジ(イギリスのカレッジ、つまり大学ではありません)でITを勉強しています。私はしばらくの間、主にOO C#やJavaなどの言語でコーディングを行っていますが、その大部分が私が嫌いなUIの退屈なもの、思いついたプロジェクトはコードの設計と実際にアルゴリズムを作成することとほとんど関係ありません。独自の種類のアルゴリズムを書き始め、ユーザーフレンドリーから離れ、次のことを学びたいと思います。つまり、暗号化と圧縮です。ファイルまたは文字列のバイトを暗号化するために、独自の暗号化アルゴリズムを記述したいと思います。いくつか質問があります。

  • これからどこから始めますか?暗号化から始めるために推奨される書籍/資料は何ですか?
  • 基本的なアルゴリズムを開始するには、広範な暗号化の知識が必要ですか?
  • 暗号化アルゴリズムを実践するためにC#で問題はありませんか?

どんな助けでも心から感謝します。私はコードを書き始めたいので、それがuniに適用することになると、私のアプリケーションに関する大胆な主張のすべてを示すための何かがあります!

51
Confuto

もちろん、小さなものから始めて、独自のアルゴリズムを実装することもできます。ただし、難読化を超えるセキュリティを提供するとは限りません。

暗号化に関して難しいことは、何かが実際に安全である理由を見つけることです。あなたは数ヶ月以内にそれを決定することができず、あなたがその時点にいるように感じた場合、あなたはおそらくおそらく間違っています。

安全ではない理由よりも、安全でない理由を見つける方がはるかに簡単です。どこかから始めたい場合は、安全だと思うまで独自のアルゴリズムを開発し、そうでない理由を見つけて、その方法を見つけてください。それらを攻撃します。

アルゴリズムを実装するとき、ほとんどの間違いがなされます。したがって、給料の高い仕事をしたい場合は、その方法を正しく実装する方法を学ぶことができます。

AESのようなものの実装を開始し、CBCやCCMのようなさまざまな操作モードを続行して、ランダム性が重要である理由を見つけることをお勧めします。 SHA-2とHMACを続行して、非対称暗号化に進みます。常に他の人が何をしたのか、なぜそれをしたのかを確認し、サイドチャネル攻撃とその実行方法を特別に調べます。あなたがその時点でいるならば、あなたは先へ進むあなたの道を見つけるでしょう。

最初に参照するは、「HAC」であり、オンラインで自由に入手できます。 http://cacr.uwaterloo.ca/ hac /

[編集]コメントに埋め込んではならないJRszからの提案。初心者のための良い本: http://crypto-textbook.com/

137
fr00tyl00p

コースラ

これが私の2セントです。

Coursera暗号化オンラインクラスに参加してください:

クラスは6週間かかります。毎週、いくつかの講義ビデオ、段階的なクイズ、およびオプションのプログラミング課題があります。 (これらの割り当てには、暗号化部分の実装が含まれます。)

6週間の終わりにテストがあります。

挑戦したい場合は、これが正しい方法です。大変な作業です。毎週10時間以上を計画することをお勧めします。あなたも同様にプログラミングの割り当てをしたい場合はもっと。

編集:これは このクラスの前回の実行の目次)です。

明確化:プログラミングの割り当ては、トピックをより深く理解するためにあります。それらは、実際にリリースすることを意図したものではありません。
逆に:「これを自分で実装しないでください!」メッセージが何度も繰り返されます。 (そしてあまり多くのことを与えることなく:「自分で実装するだけ!」が多肢選択テストの1つにあるときはいつでも間違っています。)

37
StackzOfZtuff

自分で構築するのではなく、破壊することから始めます。独自のアルゴリズムを作成した人によると、気になるほど多数のstackexchange投稿があります。周りを見て、何が悪いのかを理解してください。 (投稿された回答を見てはいけません。)[適切な検索には、「これは安全ですか」および「このアルゴリズムの何が悪いのか」が含まれます。]

他の人の作業に問題を見つけた場合にのみ、他の人のアルゴリズムを実装しようとするべきです。 (@stackzofztuffのCourseraに関するコメントは悪くありません-私が覚えているとしたら、Dan Bonehはそのように始めています。

21
Adam Shostack

Bruce SchneierのApplied Cryptographyは、このフィールドの学習を開始する場合に必読です。これまで誰も提案していないことに驚いています。

そして、はい、あなたは楽しみのためにあなた自身のアルゴリズムを転がそうとする前にさえ暗号について多くを知る必要がある必要があります。ただし、実際の問題にそれらを使用することさえ考えないでください- bad crypto はすでにたくさんあります。

プログラミングに関しては、ペストのような独自の言語を避けてください。 CまたはC++をお勧めします。

13
dr_

良いスタートは、既存のアルゴリズムを実装し、それらがどのように深く機能するかを学ぶことです。たとえば、ワンタイムパッドアルゴリズムは学習と実装が簡単であり、その長所と短所を研究することから始められます。また、暗号化で重要な一種のビットいじりにも慣れるでしょう。 「ワンタイムパッド」の検索を実行すると、開始できます。

10
Scott C Wilson

ここにあるすばらしい答えに山積みするために、何か別の角度から。

V1アルゴリズムが安全でなくてひどいものになると仮定すると、v100はほんの少しだけ良くなりますが、同様に安全ではありません。 (v1000も同様)

その前提を念頭に置いて、暗号化が今日の科学になるために解決する必要がある問題を解決することで、多くを学ぶことができます。つまり、ホイールを再発明します。

個人的には、ホイールを再発明することは、複雑なタスクを学ぶための優れた方法だと思います。それはあなたに解決する何かを与えます。それがあなたの場合、暗号化よりも解決するのが難しい問題の数は少なくなります。

そうすれば、大学に行くことができます。難しい問題を解決する方法を学ぶ手段として、私は自分の暗号アルゴリズムを設計しています。 v50ではアルゴリズムはうまくいきませんが、これらは私が学んだ教訓、私が見つけた解決策であり、これが現実の世界で解決された方法です。

「良い」暗号化プロトコルを書いたと言うことと、ほぼ間違いなく非常に弱いプロトコルを書いたと言うことには大きな違いがありますが、目的は安全なプロトコルを作成することではありませんでした。個人的に私は後者を言った誰かに大きな敬意を払うでしょう。 (私はおそらく前者にうなずきます-そしてすぐに彼にドアを見せます)

6
Michael B

既存の暗号化アルゴリズムを実装できますが、独自の暗号化アルゴリズムを設計することは、対処できる最も複雑な問題の1つです。一般的な紹介として、このチャンネルを強くお勧めします: https://www.youtube.com/channel/UC1usFRN4LCMcfIV7UjHNuQg/videos またはChristoph PaarとJan Pelzlによる本「Understanding Cryptography」( http://crypto-textbook.com/ )。私はあなたが対称アルゴリズムを目指していると思います、そしてそれらについて多くの理論を読み始めることをお勧めします、何が安全で、安全でなかったか(歴史)、そして現在の最先端のアルゴリズムがそれらが何であるかへの道をどうやって作ったかを明確に(AESはどのように開発、選択されたかなど)。

対称部分であっても、さまざまな攻撃者モデルを扱う場合、多くの数学の問題が発生します。非対称暗号化は、数学の問題に基づいた男らしく、非対称暗号化に対して非常に強力ないくつかの非常にトリッキーな攻撃があります。

肝心なのは、長年の経験があり、トピック(そのすべての部分)に精通している場合を除いて、独自のアルゴリズムを開発しないことです。それでも、それらのいくつかを実装するのは良い考えですが、ある種のプロジェクトを探している場合は、既存のアルゴリズムを使用していくつかのデータを復号化するプログラムを作成しないでください。安全なアルゴリズムは安全な暗号化を保証するものではないので、それに対処するのに十分な問題があります。この問題や他のいくつかの問題については、異なる動作モードが重要になります。

3
JRsz

ワンタイムパッドに関するスコットウィルソンの提案に従うことができますが、実際のランダムデータを使用します。たとえば、コンピュータのウェブカメラからのノイズを考慮してください。 Webカメラで静止シーンの写真を数枚撮影し、画像を32ビット浮動小数点画像に変換し、同じ明るさに画像を正規化し、平均を取り、平均から画像の1つを差し引きます。負のピクセル値を0に、正のピクセル値を1にマッピングすると、ほぼ完全にランダムなビットが得られます。これは、ピクセルが近すぎない場合は無相関です。フォンノイマンのアルゴリズムを遠方のピクセルから取得したビットのペアに適用する:

(0,1)---> 0

(1,0)---> 1

(0,0)と(1,1)は破棄されます

0と1が完全にランダムなビットを生成し、確率はちょうど50%になります。

2
Count Iblis

先に進んで、アルゴリズムを記述しますが、最後に、暗号化を定期的に扱っている友人/フェローの1人にタスクを割り当てます。可能であれば暗号化を解除するように伝えます。

あなたは彼らがほんの数分でそれを破ることができることに気づくでしょう、そしてあなたはゲームを広範な暗号の知識(あなたの言葉を引用する)

これは、私がずっと前にプログラミングを学んでいて、そのようなことを賢くしている人に挑戦したくて、私が惨めに失敗したときに私に起こったこととまったく同じです。紙に印刷されたメッセージを自分の心とスキルだけで解読することもできました。

あなたは確かにそれを書いて、それを時間をかけて完璧にすることができますが、決してその知識を持つ人々に対してすぐに安全になることは決してありません。

それはあなた自身のアルゴリズムを書くためのあなたの探求の良い出発点(あるいはおそらく停止点)です:)

2
Hanky Panky