web-dev-qa-db-ja.com

学校に行かずに、暗号化/暗号解読を難しい方法でどこで学ぶことができますか?良い本はありますか?

私は数学がそれほど得意ではありません。

PリストとP組み合わせとは何か、行列代数は知っています。aXORとは何か、数値が素数であるかどうかを知る方法などを知っています。私は違います。彼は数学が苦手なので数学が嫌いなプログラマーですが、いずれにせよ博士号はありません。

私はコンピュータサイエンスも悪くありません。少なくとも、一般的なコンピュータサイエンスの文化に関して言えば、

私はC、C++(どちらも学校で学んだ)、python、いくつかのhaskell、どのテキストエンコーディングがそこにあるのか、UNICODEがどのように機能するのか、ファイルをどのように圧縮または暗号化できるのか、どの一般的なアルゴリズムがあるのか​​(diffie-hellman、 LZMAアルゴリズム、DES、AES、Serpent、Blowfish、SHA、MD5 ...)。私はウィキペディアや他のWebサイトの暗号に非常に興味を持ちましたが、ウィキペディアがアルゴリズムの詳細や実践なしに暗号を教えてくれるとは思えません。たとえば、私は同期暗号とは何か、非同期(公開/秘密鍵)とは何かを知っています。

最も人気のあるアルゴリズムを適切かつ安全に実装する方法と、アルゴリズムを信頼性のあるものにする方法、つまり本または優れたチュートリアルまたはコースを学びたいと思います。私はすぐにカーンアカデミーで検索しましたが、このテーマは簡単なものではなく、数学、コンピューターサイエンス、電子工学の両方の知識が必要です。

私がすでに知っているかもしれない、または研究者が書いた論文のように、今日の暗号法にあまり関係がないかもしれない基本的なことについての理論のページや、実用的で問題のある、解読の問題を読みたくない学生のための。

私には現在多くの自由時間があり、私はたったの26歳です。このことを学ぶことができるのは確かです。昇給によってもたらされるだけでなく、実際に理解することなく常に暗号に魅了されているからです。良い資料が見つからないだけです。

39
jokoon

(LZMAは暗号化ではなく圧縮アルゴリズムです。)

暗号化アルゴリズムを実装するために、一般的な方法は、関連する記述標準を取得し、キーボードを取得して、試行します。ほとんどの標準には「テストベクタ」、つまり実装が正しい答えを返すかどうかを知らせるサンプル値が含まれています。その時点では、検討しているアルゴリズムの種類によって状況が異なります。

対称暗号:

対称アルゴリズムは、対称暗号化、ハッシュ関数、およびメッセージ認証コード(MAC)をカバーします。これらを処理するために多くの数学を知る必要はありません。そのほとんどは、32ビット整数と64ビット整数の加算に関するものです(これは2を使用したモジュラー演算です)32または264モジュラスとして)およびビットごとの演算(XOR、AND ...)。

このようなコードは通常Cで行われます。Cコンパイラがコードをどのように理解し、CPUの命令に変換するかについていくつかの概念を持つことで、優れたパフォーマンスが得られます。アセンブリに関する知識は必須ではありませんが、非常に役立ちます。重要なパラメータはキャッシュメモリです。通常、ループのアンロールは優れたツールですが、やり過ぎるとパフォーマンスが急激に低下します。

まず、古典的なハッシュ関数(SHAファミリー、 FIPS 180- で説明)を実装し、高速化することをお勧めします。比較ポイントとして、 OpenSSL を取得し、コマンドラインツールopenssl speedを使用して、どのような種類のパフォーマンスが得られるかを確認します(このツールは、適切なLinuxディストリビューションにすでに含まれており、機能します) WindowsおよびMacOSでも)。たとえば、私のPCでは:

$ openssl speed sha256
Doing sha256 for 3s on 16 size blocks: 4842590 sha256's in 3.00s
Doing sha256 for 3s on 64 size blocks: 2820288 sha256's in 2.99s
Doing sha256 for 3s on 256 size blocks: 1262067 sha256's in 2.99s
Doing sha256 for 3s on 1024 size blocks: 395563 sha256's in 3.00s
Doing sha256 for 3s on 8192 size blocks: 53564 sha256's in 3.00s
OpenSSL 0.9.8o 01 Jun 2010
built on: Wed Feb 23 00:47:27 UTC 2011
options:bn(64,64) md2(int) rc4(ptr,char) des(idx,cisc,16,int) aes(partial) blowfish(ptr2) 
compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN
-DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall -DMD32_REG_T=int
-DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM
available timing options: TIMES TIMEB HZ=100 [sysconf value]
timing function used: times
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
sha256           25827.15k    60367.37k   108056.57k   135018.84k   146265.43k

つまり、OpenSSLには、アセンブリで手動で最適化されたSHA-256実装が含まれ、8 kBメッセージの処理時に146 MB /秒を達成します。同じマシンで、純粋なC実装は少なくとも130 MB/sに到達するはずです。

CおよびJavaでハッシュ関数を実装する方法の例と、ハッシュ速度を意味のある方法で測定する方法の例については、 sphlib を参照してください。

その後、対称暗号化、特にAES( FIPS 197 )を試すことができます。これは、特性2の有限体とは何かを理解するのに少し役立ちますが、標準は、おかしな実装をガイドするのに十分明確です。次に、物事を最適化してみてください。 OpenSSLは比較ポイントとして機能し、 Brian GladmanのAES実装 からインスピレーションを得ます。セキュリティに関しては、実装でのルックアップテーブルの使用を通じてどのキーに依存する情報が漏洩するかについて、いくつかの懸念がありました(「AESキャッシュタイミング攻撃」を検索してみてください)。この種の攻撃を再現しようとすることは非常に良い演習です(覚えておいてください、簡単ではありませんが、実験室での実証に成功すれば、暗号化の実装がどのように機能するかについてかなり理解できます)。

非対称暗号:

非対称暗号化とは、複数の当事者が関与するアルゴリズムに関するものです。これには、非対称暗号化(RSA、ElGamal)、鍵交換(Diffie-Hellman)、デジタル署名(RSA、DSA ...)が含まれます。そこでは数学の内容がはるかに大きく、単一の「明白な」実装パスの代わりに各アルゴリズムを実装する方法がいくつかあるため、最適化は対称暗号法よりもはるかに広い主題です。

参考になるのは 楕円曲線暗号のガイド です。主に楕円曲線についてですが、有限体での演算の実装の一般的な扱いが含まれているため、上記のリンク先のURLから無料でダウンロードできるサンプルの章です。入手して今すぐ読んでください。もう1つの不可欠なリファレンスは、自由にダウンロードできる 応用暗号のハンドブック です。特に第14章では、効率的な実装について説明しています。

RSAは非常に単純で、 PKCS#1 で適切に記述されています。 RSAには タイミング攻撃 があり、マスキングによって対抗されます(そうです、これは「研究者によって書かれた」論文ですが、暗号学の主題では、研究者は何が起こっているかを理解している人です)オン)。モジュラー演算のコツがわかったら、DSA( FIPS 186- )を実装してみてください。 Diffie-Hellmanは数学的には単純ですが(DSAを実装するために必要なものだけです)、その記述標準(ANSI X9.42)は無料でダウンロードできません。

楕円曲線は、モジュラー演算の将来の人気のある代替品です。 DSAとDiffie-HellmanのECバリアントはより高速であり、短い公開鍵でより安全であると考えられています。しかし、それはより多くの数学です。ここでも、Elliptic Curve Cryptographyのガイドは必須のリファレンスです。

他の種類の非対称暗号化アルゴリズムがあります。 McEliece 暗号システム(非対称暗号化。 Niederreiter )および 格子簡約に基づくアルゴリズム で記述された署名のバリアントがあります。しかし、それらは実装の詳細を処理する公開された標準から(まだ)利益を得ておらず、比較する既存の実装はそれほど多くありません。まずはRSAとDSAから始めます。

暗号解析:

暗号解読では、実装よりもはるかに多くの数学を使用します。

対称暗号化の場合、2つの主なツールは微分および線形暗号解読です。 このチュートリアル を参照してください。

私自身の暗号化への道のりは、DESを実装することから始まり、次にDESの縮小バージョン(16ではなく8ラウンド)に松井の線形暗号解析を実装しました。 DESは FIPS 46- で説明されており、正式に撤回されますが、引き続き使用できます。 DESからはTriple-DES(3つのDESインスタンス、3つの異なるキー、中間のキーは「復号化」方向で使用される)を定義でき、公開されています testベクトル Triple-DES(「TDES」、「3DES」、または「DES」とも呼ばれ、紛らわしいこともあります)の場合。

非対称アルゴリズムの場合、暗号解読では、主にキーの数学的構造に取り組みます。 RSAバリアントを壊すために factor 大きな非素数の整数を試すことによって。ここでの数学の範囲は、自明ではないものからまったく想像もできないものまであります。そのため、RSAを破ろうとして暗号化を始めるには、学習曲線が急すぎる可能性があります...

46
Thomas Pornin

本当に2つのこと:

  1. 良い本を入手してください。 Bruce Schneierの「Applied Cryptography」で十分です。
  2. 「openssl」ツールを学び、それらの使用方法を学びます。

学ぶために暗号について最も重要なことは謙虚さです。問題に新しいソリューションを作成したくはありません。他のユーザーが十分にテストしたソリューションをできる限りコピーしたいと考えています。ほとんどの暗号化の失敗は、既存のソリューションを改善するために何らかの最適化を行うことができると考えている人々が優れたアイデアを持っていることが原因です。最終的に物事の新しい方法を見つけることに成功するのは非常に謙虚なことだけです。

次のレッスンでは、テレビや映画から得た偏見を忘れてしまいます。ハッカーがコンピューターの前に座り、暗号を破ります。これらは、暗号とは無関係であるか、実際に起こっていることのドラマ化です。たとえば、映画「スニーカー」は、誰かが大きな整数を因数分解できるチップを開発した場合に何が起こるかをドラマ化したものです。

暗号を学ぶ上で最も難しいことは、一般的な分野を理解するために必要な技術的概念と、狭い領域に特化した場合にのみ必要になる技術的概念を区別することです。たとえば、上記の高評価の投稿を見てください。 「対称」アルゴリズムと「非対称」アルゴリズムと「ハッシュ」の違いを理解する必要がありますが、その投稿の作成者が「特性2の有限体が何かを知るのに少し役立ちます」と言った場合、私はそうは思わないでしょう。それは、暗号を研究するPhDにとってのみ意味があり、それを正しく使用する方法を単に理解したい他の私たちにとっては意味がありません。

技術的な詳細を検討する良い方法は、ターゲットを選択して、逆に作業することです。たとえば、今日、AppleはiPhone/iPadオペレーティングシステムをバージョン4.3.5に更新して、X.509証明書チェーンの検証のバグを修正しました。問題とそれらを修正する必要がある理由を理解するX.509証明書とは何か、チェーンとは何か、チェーンを検証する必要がある理由、および検証しない場合はなぜハッカーが'sslsniff'のようなツールは暗号化を無効にすることができます。これらすべてを完全に理解すると、元の投稿で説明した目標の多くを達成できます。

別の例は Comodo Hackerのキーの検証に関するブログ投稿 です。

ここでも、Comodoハッカーが何をしたか(GoogleとYahooの署名付き証明書を作成した)、証明書の取り消しがどのように機能するか、およびツールを使用してその証明書を検証する方法を見つけます。私たちの業界で標準的な「openssl」ツールを使用するための良い出発点であるため、私はそれを良い投稿として提案します。

幸運を!

10

スタンフォード大学のオンライン 暗号化クラス に登録してください。これは無料のオンラインで、理論(ビデオ講義とクイズ)と実践(プログラミングの割り当て)の両方が含まれています。自分のペースで作業してみましょう。成功した場合は、達成についての声明が表示されます。スタンフォード大学の以前のオンラインコースセッションで得られたさまざまな反響を踏まえ、私は間違いなくこのクラス(およびコンピュータセキュリティのクラス)に登録しています。

  • 理論面では:

Niels Ferguson氏とBruce Schneier氏による暗号工学の設計原理と実用化。この本は、由緒あるApplied Cryptographyのアップデートを目的としています。著者はこの分野でよく知られており、レビューは優れています。

  • 練習側:

さまざまなCTF(Capture The Flag)ハッキング/セキュリティコンペティションを見ることができます。通常、暗号化の課題が含まれます。彼らは楽しいし、限られた時間内に問題を解決するためにあなたの快適ゾーンからあなたを連れて行きます。これが良い CTFs Calendar です。また、以前のCTFのいくつかの記事を見ると、多くの人が非常に教育的でよく説明されていることがわかりました。

10
kroosec

暗号アルゴリズムの場合:

Stinson's 暗号化:理論と実践

それがあなたがやりたいことなら、実装がかなり簡単になるような方法で多くの暗号アルゴリズムの数学を通過します。

Scheinerの Applied Cryptography もこのトピックに関する主要な本です。おそらくかなり重複していますが、いくつかの異なるアルゴリズムと重複しています。

それらを実装する方法を明確に説明している本に関する限り-私には何もありません。商業的には、これらは常にソフトウェアに実装されているわけではなく、かなりニッチな業界です。プレイアラウンドの観点から、アルゴリズムを説明した本を入手して実装し、同じアルゴリズムに一般的に使用されるライブラリと結果を比較します。

同様に、私は暗号解読について何も持っていませんが、「weakness in」や「weak keys」などのアルゴリズムを選択してグーグル検索すると、興味深い論文やその他の情報が見つかると思います。前回、このようなもの(10年以上前)について論文を書く必要があったとき、それは本質的に私がしたことです...

6
bethlakshmi

私はお勧めします 暗号工学:設計原則と実用的なアプリケーション 。それはあなたにとって完璧な本です。システム設計者と実装者の観点から、暗号システムを設計および実装する方法について説明します。作者の長年の経験から導き出された非常に実用的な本です。タイトルの「エンジニアリング」という言葉は本当に適切です。私はあなたがあなたがあなたが心配するあなたのエネルギーのほとんどを費やすべきであるもの、何がうまくいかないかもしれないか、そしてそれらの悪いことがあなたに起こらないことを確実にする方法を優先するのに役立つ貴重なリソースを見つけると思います。

4
D.W.

また、すでにいくつかのプログラミングスキルを持っているので、 Matasano暗号化チャレンジ もご覧ください。

彼らのウェブサイトから:

どのように多くの暗号を知る必要がありますか?無し。それがポイントです。

だから私は何を知る必要がありますか?あなたはどんな言語でも上手にコーディングできるようになりたいでしょう。 C、C++、Python、Ruby、Perl、Visual Basic、X86アセンブリ、Haskell、およびLISPで提出物を受け取りました。

それらの課題はすべて、実際の暗号の脆弱性に基づいているため、これらを解決するための素晴らしいことを学ぶ必要があります。

3
ack__

実践者がアクセスできるように記述された暗号理論について理解を深めたい場合は、KatzとLindellによる「Introduction to Modern Cryptography」を試してください。

3
user432944

暗号化を最初から学ぶことは難しいことのように感じることもありますが、適切なリソースがあれば、それを絶対に好きになります。以下は、あなたが今日暗号学を学び始めるのに私のお気に入りのサイトです。

  1. Kifangaで暗号を学ぶ 初心者から上級者まで。
  2. 実用的な暗号化 は暗号解読の記事に非常に適しています
  3. Learncryptography はハッシュ関数に最適です
0
chris pete