17

多年来,也许是 10 年,我一直对密码学着迷。我读了一本关于基于 XOR 位的加密的书,从那以后就迷上了。

我想更公平地说,我对那些可以破解各种加密方法的人着迷,但我离题了。

直截了当——你在编写密码学时使用什么方法?混淆在密码学中好吗?

我使用两个基于密钥的 XOR 加密、密钥上的各种散列技术 (SHA1) 以及简单的东西,例如在这里和那里反转字符串等。

我很想看看其他人在编写一种不那么开箱即用的加密方法时的想法和尝试。此外——任何关于专业人士如何“破解”各种密码技术的信息也会很有趣。

澄清一下——我不想在任何生产代码或我的任何代码中使用它。我很感兴趣通过玩弄而不是重新发明轮子来了解它是如何工作的。:)

伊恩

4

19 回答 19

34

我能给你的最好建议是:抵制重新发明轮子的诱惑。密码学比你想象的要难。

获取 Bruce Schneier 的《应用密码学》一书并仔细阅读。

于 2008-09-23T00:20:26.783 回答
24

与迄今为止其他人所说的相矛盾,去吧! 是的,您的代码中可能存在缓冲区溢出漏洞,并且可能很慢、有错误等,但您这样做是为了好玩!我完全理解玩加密货币的娱乐乐趣。

话虽如此,密码学根本不基于混淆(或至少不应该)。良好的加密将继续工作,即使Eve已经通过你的混淆代码并完全理解正在发生的事情。IE:许多报纸都有替代代码谜题,读者在早餐时尝试破解。如果他们开始做一些事情,比如反转整个字符串,是的,这会更难,但 Joe Reader 仍然能够打破它,neve tuohtiw gnieb dlot。

好的加密基于被认为非常困难的问题(尚未证明,AFAIK)。这方面的示例包括因式分解素数查找对数或任何其他NP 完全问题。

[编辑:snap,这些都没有被证明是NP完全的。它们都未经证实,但又不同。希望你仍然明白我的观点:加密是基于单向函数的。这些操作很容易做,但很难撤消。即乘以两个数字与找到产品的主要因素。好赶上tduehr ]

玩弄一个非常酷的数学分支给你更多的力量,只要记住加密是基于困难而不是复杂的东西。许多加密算法,一旦你真正理解它们,就会简单得令人难以置信,但仍然有效,因为它们基于一些困难的东西,而不仅仅是交换字母。

注意:话虽如此,一些算法确实添加了额外的怪癖(如字符串切断),以使暴力强制它们变得更加困难。我的一部分感觉就像我在某个地方读到了这个引用DES,但我不相信它...... [编辑:我是对的,请参阅本文的第 5 段,以获取对排列无用的引用。]

顺便说一句:如果你以前没有找到它,我猜TEA / XTEA / XXTEA系列算法会很有趣。

于 2008-09-23T04:17:14.843 回答
15

正确的答案是不要做这样的事情。最好的方法是为此目的选择众多密码库之一,并在您的应用程序中使用它们。通过默默无闻的安全永远不会奏效。

选择当前加密算法的最高标准。AES 用于加密,SHA256 用于散列。Elgamal 用于公钥。

阅读应用密码学也是一个好主意。但是本书的大部分内容是大多数应用程序不需要的实现细节。

编辑:扩展编辑中给出的新信息。当前的绝大多数密码学都涉及许多复杂的数学。即使是看起来像是各种比特币的分组密码也是一样的。

在这种情况下,请阅读应用密码学,然后获得可以免费下载的应用密码学手册。

这两者都有很多关于密码算法的信息。对差分和线性密码分析等事物的一些解释。另一个资源是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

以上所有建议都是合理的。混淆不好。在没有先让公众对其进行抨击的情况下,不要将自己的加密货币投入生产。

补充几点:

  • 编码不是加密。由于开发人员在这里的误解,我最近绕过了一个网站的身份验证系统。

  • 学习如何打破最基本的系统。您会惊讶于简单旋转密码的知识实际上有用的频率。

  • A^B = C。您说您一直在使用两个密钥 XOR 加密。在构建密码系统时,请始终检查您的步骤是否确实在完成某些事情。在两键异或的情况下,您实际上只是使用了不同的键。

  • A^A = 0。XOR 加密对已知或选择的明文攻击非常弱。如果您知道全部或部分明文,则可以获得全部或部分密钥。明文 ^ 密文 = 密钥

  • 另一本值得阅读的好书是 Simon Singh 的 The Code Book。它回顾了密码学的一些历史以及破解他所涵盖的大多数密码系统的方法。

  • 两种学习算法(学习它们及其背后的历史):

    • 3DES:是的,它已经过时了,但它是学习 fiestel 和块密码的一个很好的起点,并且从 DES 中创建它有一些很好的教训。此外,所使用的加密、解密、加密方法的推理是一件值得学习的事情。
    • RSA:我将在这里展示我内心的数学极客。可能是当今使用的最简单的加密算法。破解它的方法是已知的(只考虑密钥),但计算起来非常困难。m^d mod n 其中 n = p*q(p 和 q 素数)且 gcd(d,n)=1。一点群/数论解释了为什么在不知道 p 和 q 的情况下不容易逆转。在我的数论课程中,我们至少以六种方式证明了这背后的理论。

PhirePhly 的注释:

素数分解和离散对数不是 NP-Complete 或 NP-Hard 的。它们的复杂性都未知。我想你只要弄清楚那部分就会获得相当大的名气。也就是说,您的其余断言是正确的。好的加密是基于容易做但没有密钥很难撤销的事情。

于 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

为了呼应其他所有人(为了后代),永远不要实施自己的加密货币。使用图书馆。

也就是说,这是一篇关于如何实现 DES 的文章:

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

排列和噪声对许多加密算法至关重要。重点不在于模糊事物,而是在过程中增加步骤,使蛮力攻击变得不切实际。

另外,获取并阅读Applied Cryptography。这是一本很棒的书。

于 2008-09-23T00:32:42.603 回答
2

必须同意其他海报。除非你正在写一篇关于它的论文并且需要做一些研究或其他事情,否则不要这样做。

如果您认为自己对此了解很多,请阅读应用密码学一书。我知道很多数学,那本书仍然让我很兴奋。你可以从他的伪代码中阅读和分析。如果您愿意,这本书的后面还有大量参考资料可以深入挖掘。

加密是很多人认为很酷的东西之一,但概念背后的实际数学超出了他们的掌握。我很久以前就决定,为了达到那个水平,我不值得付出精神上的努力。

如果您只是想看看它是如何完成的(研究代码中的现有实现),我建议您看看Crypto++ 库,即使您通常不使用 C++ 编写代码,它也可以很好地了解实现加密的主题和部分.

布鲁斯也有一个很好的资源列表,你可以从他的网站获得。

于 2008-09-23T00:34:01.883 回答
2

我参加了今年 Aus TechEd 的代码安全会议。在谈到 .Net 中的 AES 算法以及如何选择它时,主持人 (Rocky Heckman) 向我们介绍了一种用于破解先前加密的技术。有人设法使用热像仪记录 CPU 在加密数据时的热特征。他们能够使用此记录来确定芯片正在执行哪些类型的计算,然后对算法进行逆向工程。他们手头有太多的时间,我相当有信心我永远不会聪明到打败那样的人!:(

  • 注意:我真诚地希望我已经正确地传达了这个故事,如果没有 - 错误很可能是我的,而不是提到的主持人的错误。
于 2008-09-23T00:36:01.723 回答
2

你不应该在产品中使用本土加密货币已经被打死了。但是我已经阅读了您的问题,并且您明确表示您只是为了好玩。对我来说,这听起来像是真正的极客/黑客/学术精神。您知道它有效,您想知道它为什么有效,并尝试看看您是否可以使它有效。

我完全鼓励这样做,并且对我编写的许多程序也这样做只是为了好玩。我建议在名为“rootlabs”的博客上阅读这篇文章 ( http://rdist.root.org/2008/09/18/dangers-of-amateur-cryptography/ )。帖子中有一系列链接,您应该会发现它们非常有趣。一个对数学/加密感兴趣的人,拥有计算机科学博士学位并为谷歌工作,他决定写一系列关于编程加密的文章。他犯了几个不明显的错误,行业专家 Nate Lawson 指出了这些错误。

我建议你阅读它。如果它不鼓励你继续尝试,它无疑仍然会教给你一些东西。

祝你好运!

于 2008-09-25T23:39:18.277 回答
1

我同意不重新发明轮子。

请记住,默默无闻的安全根本不是安全。如果您的安全机制的任何部分使用“没有人会弄清楚这一点!”这样的短语,那么它就是不安全的。想想 AES——该算法是公开可用的,所以每个人都知道它如何工作的,但没有人能破解它。

于 2008-09-23T00:28:27.000 回答
1

根据其他答案 - 发明加密方案绝对是专家的事情,任何新提出的加密方案确实需要接受公众审查,以获得任何合理的验证希望和对其稳健性的信心。然而,实现现有的算法和系统是一项更实际的“为了好玩”的努力,所有主要标准都有很好的测试向量来帮助证明你的实现的正确性。

话虽如此,对于生产解决方案,现有的实现很多,通常没有理由您需要自己实现一个系统。

于 2008-09-23T00:57:40.080 回答
1

我同意所有答案,“不要为生产使用编写自己的加密算法”和“地狱是的,为你自己的教育而努力”,但我想起了一些我相信可敬的 Bruce Schneier 经常写的东西:“有人很容易创造出他们自己无法打破的东西。”

于 2008-09-25T23:50:20.933 回答
0

非专家应该能够期望得到正确的唯一密码是简单的一次性密码。

CipherTextArray = PlainTextArray ^ KeyArray;

除此之外,任何值得一看的东西(即使是为了娱乐)都需要高水平的数学学位。

于 2008-09-23T00:39:05.303 回答
0

我不想深入探讨已经给出的正确答案(不要为生产而做;简单的反转不够;混淆不好;等等)。

我只想补充一下 Kerckoff 的原则,“即使系统的所有内容(除了密钥)都是公共知识,密码系统也应该是安全的”。

当我谈到它时,我还会提到 Bergofsky 的原理(由 Dan Brown 在 Digital Fortress 中引用):“如果计算机尝试了足够多的密钥,它在数学上可以保证找到正确的密钥。代码的安全性并不在于它的通过-key 是找不到的,而是大多数人没有时间或设备来尝试。”
只是那本质上是不正确的。丹布朗弥补了这一点。

于 2008-09-23T05:03:48.973 回答
0

回应 PhirePhly 和 tduehr,关于保理的复杂性:

很容易看出,因式分解存在于 NP 和 coNP 中。我们需要看到的是问题“给定 n 和 k,找到 n 的质因子 p,1 < p <= k”和“表明不存在这样的 p”都在 NP 中(第一个是决策变体因式分解问题,第二个是补码的决策变体)。

第一个问题:给定一个候选解 p,我们可以很容易地(即在多项式时间内)检查是否 1 < p <= k 以及 p 是否整除 n。解 p 总是比 n 短(在用于表示它的位数上),因此因式分解在 NP 中。

第二个问题:给定一个完整的素数分解 (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 回答
-1

通常,我首先获得数论博士学位。然后我进行了十年左右的研究,并随后进行了大量的出版和同行评审。就我使用的技术而言,它们是来自我的研究和我的同行的各种技术。有时,当我在半夜醒来时,我会开发一种新技术,实施它,找到其中的漏洞(在我的数论和计算机科学同行的帮助下),然后从那里改进。

如果你给鼠标一个算法......

于 2008-09-23T01:48:44.433 回答