17

何年も、おそらく 10 年間、私は暗号化に魅了されてきました。XOR ビットベースの暗号化に関する本を読んで以来、夢中になっています。

さまざまな暗号化方式を破ることができる人に魅了されたと言ったほうが正しいと思いますが、それは脱線します。

要点を言えば、暗号を書くときにどのような方法を使用しますか? 難読化は暗号化に適していますか?

2 つのキーベースの XOR 暗号化、キーに対するさまざまなハッシュ技術 (SHA1)、およびあちこちで文字列を逆にするなどの単純なことを使用します。

それほど独創的ではない暗号化方法を作成するときに、他の人が何を考え、試しているかを知りたいと思っています。また、プロがさまざまな暗号化技術を「破る」方法についての情報も興味深いでしょう.

明確にするために、私はこれを製品コード、またはその点での私のコードで使用したくありません。車輪を再発明するのではなく、いじくり回すことでそれがどのように機能するかを学ぶことに興味があります。:)

イアン

4

19 に答える 19

34

私があなたにできる最善のアドバイスは、車輪を再発明する誘惑に抵抗することです. 暗号は思ったより難しい。

Bruce Schneier の本Applied Cryptographyを入手して、注意深く読んでください。

于 2008-09-23T00:20:26.783 に答える
24

他のみんながこれまでに言ったことと矛盾するために、それを行ってください! ええ、あなたのコードにはバッファオーバーフローの脆弱性があり、遅い、バグがあるなどの可能性がありますが、あなたは楽しいためにこれをやっています!私は暗号で遊ぶことに見られるレクリエーションの楽しみを完全に理解しています。

そうは言っても、暗号化は難読化にまったく基づいていません(または少なくともそうすべきではありません)。Eveが難読化されたコードを調べて、何が起こっているのかを完全に理解した後でも、優れた暗号は引き続き機能します。IE:多くの新聞には、読者が朝食を破ろうとする換字式暗号パズルがあります。もし彼らが文字列全体を逆にするようなことを始めたら、そうです、それはもっと難しいでしょう、しかしジョー・リーダーはそれでもそれを壊すことができるでしょう、neve tuohtiwgniebdlot。

優れた暗号化は、(まだ証明されていない、AFAIK)本当に難しいと思われる問題に基づいています。この例には、素数の因数分解、ログの検索、またはその他のNP完全問題が含まれます。

[編集:スナップ、どちらもNP完全であることが証明されていません。それらはすべて証明されていませんが、異なっています。うまくいけば、あなたはまだ私のポイントを見るでしょう:暗号は一方向性関数に基づいています。これらは簡単に実行できる操作ですが、元に戻すのは困難です。つまり、2つの数値を掛けて、製品の素因数を求めます。グッドキャッチtduehr ]

数学の本当にクールなブランチで遊ぶためのあなたへのより多くの力、ただ暗号が複雑ではなく難しいものに基づいていることを覚えておいてください。多くの暗号化アルゴリズムは、一度実際に理解すると、驚くほど単純ですが、文字を切り替えるだけでなく、難しいものに基づいているため、それでも機能します。

注:これが言われていると、一部のアルゴリズムは、ブルートフォース攻撃をはるかに困難にするために余分な癖(文字列の分離など)を追加します。私の一部は、 DESを参照してこれをどこかで読んだように感じますが、信じられません... [編集:私は正しかった。順列が役に立たないことについては、この記事の5番目の段落を参照してください。]

ところで:もしあなたがそれを以前に見つけたことがなければ、私はTEA / XTEA / XXTEAシリーズのアルゴリズムが興味深いだろうと思います。

于 2008-09-23T04:17:14.843 に答える
15

正しい答えは、このようなことをしないことです。最善の方法は、この目的のために多数の暗号化ライブラリから 1 つを選択し、それらをアプリケーションで使用することです。あいまいさによるセキュリティは決して機能しません。

暗号化アルゴリズムの現在のトップ スタンダードも選択します。暗号化には AES、ハッシュには SHA256。公開鍵はElgamal。

Applied Cryptography を読むのも良い考えです。しかし、本の大部分は、ほとんどのアプリケーションで必要としない実装の詳細です。

編集: 編集で与えられた新しい情報を拡張します。現在の暗号化の大部分には、多くの複雑な数学が含まれています。あらゆる種類のビットを変更しているように見えるブロック暗号でさえ同じです。

この場合は、Applied Cryptography を読んでから、無料でダウンロードできるHandbook of Applied Cryptographyを入手してください。

これらは両方とも、暗号化アルゴリズムに何が入るかについて多くの情報を持っています。差分暗号解読や線形暗号解読などの説明。もう 1 つのリソースはCiteseerで、これらの本で参照されている多数の学術論文をダウンロードできます。

暗号は、巨大な学問的歴史を持つ、どこにでも行ける難しい分野です。しかし、あなたがスキルを持っていれば、私が見つけたように、それは非常にやりがいがあります.

于 2008-09-23T00:21:46.470 に答える
9

ここで演習を行います。

http://www.schneier.com/crypto-gram-9910.html#SoYouWanttobeaCryptographer

手始めに、キューブ攻撃の論文 ( http://eprint.iacr.org/2008/385 ) を見て、いくつかのアルゴリズムを破ってみてください。暗号化スキームの解読に慣れると、暗号化スキームの作成が上手になります。

本番コードに関しては、すでに述べたことを繰り返します。市場で入手可能なものを使用してください。すべての主流のスキームは、すでに複数回の暗号解読を行っているからです。

于 2008-09-23T01:04:29.987 に答える
6

上記のアドバイスはすべて適切です。難読化が悪い。最初に大衆にしばらくの間それを打ち負かすことなく、独自の暗号を生産に投入しないでください。

追加するいくつかのこと:

  • エンコーディングは暗号化ではありません。ここで開発者が誤解したため、最近、Web サイトの認証システムをバイパスしました。

  • 最も基本的なシステムでさえ壊す方法を学びましょう。単純な回転暗号の知識が実際に役立つことが多いことに驚かれることでしょう。

  • A^B = C. 2 つのキー XOR 暗号化を使用していると述べました。暗号システムを構築するときは、ステップが実際に何かを達成していることを常に確認してください。2 つのキーの XOR の場合、実際には別のキーを使用しているだけです。

  • A^A = 0. XOR 暗号化は、既知または選択された平文攻撃に対して非常に弱いです。平文の全部または一部がわかれば、鍵の全部または一部を取得できます。平文 ^ 暗号文 = キー

  • 読むべきもう 1 つの良い本は、Simon Singh の The Code Book です。暗号の歴史の一部と、彼がカバーするほとんどの暗号システムを解読するための方法について説明します。

  • 学ぶべき 2 つのアルゴリズム (それらとその背後にある歴史を学びます):

    • 3DES: はい、時代遅れですが、フィステルとブロック暗号を学習するための良い出発点であり、DES から作成されたいくつかの良い教訓があります。また、使用される暗号化、復号化、暗号化の方法論の理由を学ぶことは良いことです。
    • RSA: ここで私の内なる数学オタクを紹介します。おそらく、現在使用されている最も単純な暗号化アルゴリズムです。それを破る方法は知られていますが (鍵を因数分解するだけです)、計算上非常に困難です。m^d mod n ここで、n = p*q (p および q 素数) および gcd(d,n)=1 です。p と q を知らずにこれを簡単に元に戻せない理由は、群数/数論のほんの一部で説明できます。私の数論コースでは、この背後にある理論を少なくとも半ダースの方法で証明しました。

PhirePhly に関するメモ:

素因数分解と離散対数は、NP完全ではなく、NP困難でもありません。どちらも複雑さは不明です。その部分を理解するだけで、かなりの名声を得ることができると思います。とはいえ、あなたの主張の残りの部分は正しいです。優れた暗号は、キーなしでは簡単に実行できるが元に戻すのが難しいことに基づいています。

于 2008-09-23T15:02:29.520 に答える
4

あなたがその分野の専門家でない限り、生産製品で自家製の暗号を使用しないでください。十分に言った。

于 2008-09-23T00:20:59.497 に答える
3

しないでください!

専門家でさえ、それが正しかったかどうかを知るのに非常に苦労しています。暗号 CS クラスの外では、他の人のコードを使用してください。絶対に必要な場合にのみコードを移植し、既知の適切なコードを使用してコードをテストします。

于 2008-09-23T00:23:10.287 に答える
3

ほとんどの専門家は、暗号化手法とアルゴリズムの開発において難読化よりもオープン性の方が価値があることに同意しています。

つまり、誰もが自分以外の誰もが破ることができる新しいコードを設計できるようです。最高の暗号は、アルゴリズムといくつかの暗号化されたメッセージがそこに出され、最高の暗号ハッカーがそれを破ろうとするというテストに耐えます.

一般に、ほとんどの難読化手法と単純なハッシュ (私はかなりの数を自分で実行しました) は非常に簡単に破られます。だからといって、実験したり学んだりするのが楽しくないというわけではありません。

暗号書のリスト(ウィキペディアより)

この質問が私の目に留まったのは、小説であるにもかかわらず、概要自体は悪くない Neal Stephenson のCryptonomiconを現在再読しているためです...

于 2008-09-23T00:29:52.003 に答える
2

製品に自家製の暗号を使用するべきではないということは、すでに殴打されています。しかし、私はあなたの質問を読みました、そしてあなたはあなたがただ楽しみのためにそれをしているとはっきりと述べています。私には本当のオタク/ハッカー/アカデミックスピリットのように聞こえます。あなたはそれが機能することを知っています、あなたはそれが機能する理由を知りたい、そしてあなたがそれを機能させることができるかどうかを見ようとします。

私はそれを完全に奨励し、楽しみのために書いた多くのプログラムでも同じことをします。この投稿(http://rdist.root.org/2008/09/18/dangers-of-amateur-cryptography/)を「rootlabs」というブログで読むことをお勧めします。投稿には、非常に興味深いと思われる一連のリンクがあります。コンピュータサイエンスの博士号を持つ数学/暗号に興味があり、Googleで働いている人は、暗号のプログラミングに関する一連の記事を書くことにしました。彼は、業界の専門家であるネイト・ローソンによって指摘されたいくつかの明白でない間違いを犯しました。

読んでみることをお勧めします。それがあなたに挑戦し続けることを奨励しないならば、それは間違いなくあなたに何かを教えるでしょう。

頑張ってください!

于 2008-09-25T23:39:18.277 に答える
2

(後世のために)他のすべての人にエコーするために、独自の暗号を実装しないでください。ライブラリを使用します。

そうは言っても、DES の実装方法に関する記事は次のとおりです。

http://scienceblogs.com/goodmath/2008/09/des_encryption_part_1_encrypti.php

順列とノイズは、多くの暗号化アルゴリズムにとって重要です。要点は、物事を曖昧にすることではなく、ブルート フォース攻撃を非現実的にする手順をプロセスに追加することです。

また、 Applied Cryptographyを入手して読んでください。それは素晴らしい本です。

于 2008-09-23T00:32:42.603 に答える
2

他のポスターに同意する必要があります。あなたがそれについて論文を書いていて、何らかの調査や何かをする必要がある場合を除いて、そうしないでください.

それについてよく知っていると思われる場合は、Applied Cryptographyの本を読んでください。私は多くの数学を知っていますが、その本はまだ私のお尻を蹴った. 彼の疑似コードから読み取って分析できます。この本には、必要に応じてより深く掘り下げるための参考文献もたくさんあります。

暗号は、多くの人が非常にクールだと考えるものの 1 つですが、その概念の背後にある実際の計算は彼らには理解できません。私はずっと前に、そのレベルに到達するために精神的な努力をする価値はないと判断しました.

それがどのように行われるかを知りたいだけなら (既存の実装をコードで調べてください)、普段は C++ でコードを書かない場合でも、 Crypto++ ライブラリをざっと見てみることをお勧めします. .

Bruce には、彼のサイトから入手できるリソースの優れたリストもあります。

于 2008-09-23T00:34:01.883 に答える
2

今年の Aus TechEd のコード セキュリティ セッションに参加しました。.Net の AES アルゴリズムとその選択方法について話すとき、プレゼンター (Rocky Heckman) は、以前の暗号化を破るために使用された手法の 1 つを教えてくれました。データを暗号化している間に、誰かが熱画像カメラを使用して CPU の熱シグネチャを記録することに成功しました。彼らはこの記録を使用して、チップが行っていた計算の種類を確認し、アルゴリズムをリバース エンジニアリングすることができました。彼らはあまりにも多くの時間を手にしていたので、私はそのような人々を打ち負かすほど賢くないと確信しています! :(

  • 注: ストーリーが正しく伝えられていることを心から願っています。
于 2008-09-23T00:36:01.723 に答える
1

私はすべての答えに同意します。 「本番用に独自の暗号アルゴリズムを作成しないでください」と「ええ、あなた自身の啓蒙のためにそれを試してみてください」の両方ですが、由緒あるブルース・シュナイアーがよく書いていると思うことを思い出します:「誰かが自分では壊せないものを作るのは簡単です。」

于 2008-09-25T23:50:20.933 に答える
1

他の回答によると、暗号化スキームを発明することは間違いなく専門家のためのものであり、新しい提案された暗号化スキームは、検証の合理的な希望とその堅牢性に対する信頼のために、公開された精査にかけられる必要があります. ただし、既存のアルゴリズムとシステムを実装することは、「楽しみのため」のはるかに実用的な試みであり、すべての主要な標準には、実装の正確性を証明するのに役立つ優れたテスト ベクトルがあります。

そうは言っても、運用ソリューションの場合、既存の実装は豊富にあり、通常、システムを自分で実装する必要がある理由はありません。

于 2008-09-23T00:57:40.080 に答える
1

車輪の再発明をしないことに同意します。

また、あいまいさによるセキュリティは、セキュリティではありません。セキュリティ メカニズムのいずれかの部分で「誰もこれを理解できない!」というフレーズを使用している場合、それは安全ではありません。AES について考えてみてください。このアルゴリズムは公開されているため、誰もがその仕組みを正確に知っていますが、誰もそれを破ることはできません。

于 2008-09-23T00:28:27.000 に答える
0

すでに与えられている正解について深く掘り下げたくありません(本番用に行わないでください。単純な反転では不十分です。難読化が悪いなど)。

「キーを除いて、システムに関するすべてが公の知識であっても、暗号システムは安全でなければならない」というKerckoffの原則を追加したいと思います。

その間、Bergofskyの原則(DigitalFortressのDanBrownによる引用)についても言及します。「コンピューターが十分なキーを試した場合、正しいキーを見つけることが数学的に保証されました。コードのセキュリティは、そのパスではありませんでした。 -鍵は見つかりませんでしたが、ほとんどの人が試す時間や設備がありませんでした。」
それだけが本質的に真実ではありません。ダンブラウンはそれを作りました。

于 2008-09-23T05:03:48.973 に答える
0

因数分解の複雑さについて、PhirePhlyとtduehrに対応します。

ファクタリングがNPとcoNPにあることがすぐにわかります。私たちが見る必要があるのは、「nとkが与えられ、1 <p <= kでnの素因数pを見つける」と「そのようなpが存在しないことを示す」という問題は両方ともNPにあるということです(最初は決定バリアントです)因数分解問題の2番目は補数の決定バリアントです)。

最初の問題:候補解pが与えられると、1 <p <= kであるかどうか、およびpがnを除算するかどうかを簡単に(つまり、多項式時間で)確認できます。解pは常にnよりも短い(それを表すために使用されるビット数で)ため、因数分解はNPで行われます。

2番目の問題:完全な素因数分解(p_1、...、p_m)が与えられると、それらの積がnであり、1とkの間にあるものがないことをすばやく確認できます。PRIMESがPにあることがわかっているので、多項式時間で各p_iの素数性をチェックできます。最小の素因数は2であるため、有効な因数分解には最大でlog_2(n)の素因​​数があります。各係数はnより小さいため、最大でO(n log(n))ビットを使用します。したがって、nの素因数が1とkの間にない場合は、(多項式時間で)すばやく検証できる短い(多項式サイズの)証明があります。

したがって、ファクタリングはNPとcoNPにあります。NP完全である場合、NPはcoNPと等しくなります。これは、多くの場合、偽であると見なされます。これは、ファクタリングが実際にNP完全ではないという証拠と見なすことができます。証明を待つだけです;-)

于 2009-02-22T21:46:19.480 に答える
0

非専門家が正しく理解できると期待できる唯一の暗号化は、骨の折れる単純なワンタイムパッド暗号です。

CipherTextArray = PlainTextArray ^ KeyArray;

それとは別に、(レクリエーションのためであっても)見る価値のあるものはすべて、数学の高度な学位が必要になります。

于 2008-09-23T00:39:05.303 に答える
-1

通常、私は数論の博士号を取得することから始めます。それから私は10年ほどの研究を行い、それを多くの出版と査読でフォローアップします。私が使用している技術に関しては、それらは私の研究と私の仲間の研究からのさまざまなものです。時折、夜中に目が覚めたら、新しい技術を開発し、それを実装し、(数論とコンピューターサイエンスの仲間の助けを借りて)そこに穴を見つけ、そこから洗練していきます。

マウスにアルゴリズムを与えると...

于 2008-09-23T01:48:44.433 に答える