在编写自己的加密方法时,您使用了哪些技术?

时间:2008-09-23 00:17:58

标签: security language-agnostic encryption cryptography

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

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

到目前为止 - 您在编写加密时使用了哪些方法?密码学中的混淆是否合适?

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

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

澄清 - 我不想在任何生产代码或我的任何代码中使用它。我很有兴趣通过玩弄来学习它是如何工作的,而不是重新发明轮子。 :)

伊恩

19 个答案:

答案 0 :(得分:34)

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

获取Bruce Schneier的书Applied Cryptography并仔细阅读。

答案 1 :(得分:24)

与其他人说到目前为止所说的相反,去吧!是的,你的代码可能有缓冲区溢出漏洞,可能很慢,有错误等等,但你正在做这对于有趣> !我完全理解在玩加密时发现的娱乐享受。

话虽如此,密码学根本不是基于混淆(或者至少不应该)。好的加密将继续有效,即使Eve已经在您的混淆代码中跋涉并且完全理解正在发生的事情。 IE:许多报纸都有substitution code个谜题,读者试图打破早餐。如果他们开始做翻转整个字符串的事情,是的,那就更难了,但Joe Reader仍然可以打破它,neve tuohtiw gnieb dlot。

良好的加密是基于假设(尚未证实,AFAIK)真正困难的问题。这方面的示例包括factoring primesfinding the log或任何其他NP-complete问题。

[编辑:快照,这些都不是已证实 NP-complete。它们都是未经证实的,但却不同。希望你仍然看到我的观点:crypto基于单向函数。这些操作很容易做,但很难撤消。即乘以两个数字vs找到产品的素因子。好抓tduehr]

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

注意:有了这个说法,一些算法确实增加了额外的怪癖(比如字符串切断),使得暴力迫使它们变得更加困难。我的一部分感觉就像是在某个地方引用DES而读到的,但我不相信...... [编辑:我是对的,请参阅5th paragraph of this article以获取无效的排列参考。

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

答案 2 :(得分:15)

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

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

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

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

在这种情况下,请阅读Applied Cryptography,然后获取您可以免费下载的书籍Handbook of Applied Cryptography

这两者都有很多关于加密算法的信息。对差分和线性密码分析等事物的一些解释。另一个资源是Citeseer,其中有许多学术论文被这些书籍引用以供下载。

密码学是一个艰难的领域,具有丰富的学术历史,可以随时随地进行。但是如果你掌握了这些技能,那就像我发现的那样非常有益。

答案 3 :(得分:9)

在这里练习:

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

对于初学者,请查看多维数据集攻击文件(http://eprint.iacr.org/2008/385)并尝试使用它打破一些算法。熟悉破解加密方案后,您将更好地创建加密方案。

就生产代码而言,我将重复已经说过的内容:只使用市场上可用的内容,因为所有主流方案都已经过多轮密码分析。

答案 4 :(得分:6)

以上所有建议都是合理的。混淆不好。如果没有让公众在一段时间内打败它,就不要把自己的加密投入生产。

要添加的几件事:

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

  • 了解如何打破最基本的系统。你会惊讶地发现简单旋转密码的知识实际上是有用的。

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

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

  • 另一本好读的书是Simon Singh撰写的The Code Book。它介绍了密码学的一些历史以及打破他所涵盖的大部分密码系统的方法。

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

    • 3DES:是的它已经过时,但它是学习fiestel和阻塞密码的一个很好的起点,并且从DES创建它有一些很好的经验教训。此外,使用加密,解密,加密方法的原因是一件好事。
    • RSA:我要在这里展示我内心的数学极客。可能是目前使用的最简单的加密算法。打破它的方法是已知的(只是关键因素)但计算上非常困难。 m ^ d mod n其中n = p * q(p和q prime)和gcd(d,n)= 1。一点组/数理论解释了为什么在不知道p和q的情况下不容易逆转。在我的数论课程中,我们至少有六种方法证明了这背后的理论。

PhirePhly的说明:

素数因子分解和离散对数不是NP-Complete,或NP-Hard。它们的复杂性都不为人知。我想你只要想出那个部分就能得到相当多的名声。也就是说,你断言的其余部分是正确的。好的加密是基于容易做的事情,但没有密钥就很难撤消。

答案 5 :(得分:4)

除非您(成为)该领域的专家,否则不要在生产产品中使用自制加密。够了。

答案 6 :(得分:3)

不要!

即使是专家也非常非常很难知道他们是否做得对。在加密CS类之外,只需使用其他人的代码。只有当你绝对必须使用已知的良好代码测试其中的鼻涕时才能使用端口代码。

答案 7 :(得分:3)

大多数专家都认为,在开发加密方法和算法时,开放性比混淆更有价值。

换句话说,每个人似乎都能够设计一个新的代码,除了它们之外每个人都可以破解。最好的加密在测试中得以存在,并且有一些加密的消息放在那里并且拥有最好的加密黑客试图打破它。

一般来说,大多数混淆方法和简单的散列(我自己也做过很多)很容易被打破。这并不意味着他们试验和了解它们并不好玩。

List of Cryptography Books(来自维基百科)

这个问题引起了我的注意,因为我目前正在重新阅读Neal Stephenson的Cryptonomicon,这本身并不是一个糟糕的概述,尽管它是一部小说......

答案 8 :(得分:2)

为了回应其他人(后代),永远不要实现自己的加密。使用图书馆。

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

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

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

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

答案 9 :(得分:2)

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

如果您认为自己了解很多,请阅读Applied Cryptography书。我知道很多数学,那本书仍然踢我的屁股。您可以从他的伪代码中读取和分析。如果你愿意,这本书还有很多参考资料可以深入挖掘。

Crypto是许多人认为非常酷的事情之一,但概念背后的实际数学是他们无法掌握的。很久以前我决定让我达到这个水平的心理努力是不值得的。

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

布鲁斯也有一个很好的list of resources你可以从他的网站上获得。

答案 10 :(得分:2)

我参加了今年的Aus TechEd代码安全会议。在讨论.Net中的AES算法及其选择方式时,演示者(Rocky Heckman)告诉我们一种用于打破先前加密的技术。在加密数据的同时,有人设法使用红外热像仪记录cpu的热量特征。他们能够使用这种记录来确定芯片正在进行什么类型的计算,然后对算法进行逆向工程。他们手上有太多时间,而且我相信我永远不会足够聪明地击败那样的人! :(

  • 注意:我真诚地希望我能正确地传达这个故事,如果没有 - 错误很可能是我的,而不是主持人提到的错误。

答案 11 :(得分:2)

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

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

我建议你看看。如果它不鼓励你继续尝试,毫无疑问它仍会教你一些东西。

祝你好运!

答案 12 :(得分:1)

我同意不重新发明轮子。

请记住,通过默默无闻的安全根本不是安全措施。如果您的安全机制的任何部分使用“没有人会想到这一点!”这句话,那就不安全了。想想AES - 这个算法是公开的,所以每个人都知道完全它是如何工作的,但是没有人可以打破它。

答案 13 :(得分:1)

其他答案 - 发明加密方案绝对是专家的事情,任何新提出的加密方案确实需要公开审查任何合理的验证希望和对其稳健性的信心。然而,实现现有的算法和系统是一种更加实用的“乐趣”,所有主要标准都有良好的测试向量来帮助证明实现的正确性。

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

答案 14 :(得分:1)

我同意所有答案,“不编写自己的加密算法供生产使用”和“地狱是的,为你自己的启发而去 “但我想起了一些我认为古老的布鲁斯施奈尔经常写的东西:”某人很容易创造出他们自己无法破解的东西。“

答案 15 :(得分:0)

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

可以很容易地看出,因子分解是NP和coNP。我们需要看到的问题是“给定n和k,找到n的主要因子p,其中1< p< = k”和“表明没有这样的p存在”的问题都在NP中(第一个是保理问题的决策变量,第二个是补语的决策变体。

第一个问题:给定候选解p,我们可以很容易地(即在多项式时间内)检查1 <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完全的证据;我宁愿等待证明; - )

答案 16 :(得分:0)

我不想深入研究已经给出的正确答案(不要用于制作;简单的逆转不够;混淆不好;等等)。

我只想添加Kerckoff的原则,“即使关键系统的所有内容都是公共知识,密码系统也应该是安全的。”

虽然我在谈论它,但我还会提到Bergofsky的原则(Dan Brown在数字堡垒中引用):“如果计算机尝试了足够的密钥,那么在数学上保证找到合适的密钥。代码的安全性不是它的通行证是不可取的,而是大多数人没有时间或设备去尝试。“ 只有那本身就不是真的;丹·布朗成功了。

答案 17 :(得分:0)

非专家应该能够做到的唯一加密是骨简单的One Time Pad密码。

CipherTextArray = PlainTextArray ^ KeyArray;

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

答案 18 :(得分:-1)

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

如果给鼠标算法......