在编写自己的加密方法时,我们使用什么技术?
多年来,也许是10年,我一直对加密技术着迷。我读了一本关于基于XOR位的加密的书,从那以后就迷上了。
我想可以说,我对那些可以打破各种加密方法的人着迷,但我离题了。
直截了当-编写密码学时,我们使用什么方法?混淆在密码学上好吗?
我使用了两种基于密钥的XOR加密,密钥上的各种哈希技术(SHA1),以及一些简单的操作,例如在此前后颠倒字符串等。
我很想看看其他人的想法,并在编写一种不太常用的加密方法时尝试一下。同样,关于专家如何"突破"各种加密技术的任何信息也将很有趣。
需要澄清的是-我不想在任何生产代码或者我的任何代码中使用此代码。我很有趣地学习如何通过玩转而不是重新发明轮子来工作。 :)
伊恩
解决方案
我能给最好建议是:抵制重塑车轮的诱惑。密码学比我们想象的要难。
获取Bruce Schneier的书Applied Cryptography,并仔细阅读。
除非我们成为该领域的专家,否则请勿在生产产品中使用自制的加密货币。说够了。
正确的答案是不要做这样的事情。最好的方法是为此选择众多加密库之一,并在应用程序中使用它们。默默无闻的安全性永远行不通。
还要为加密算法选择当前的最高标准。 AES用于加密,SHA256用于哈希。 Elgamal公钥。
阅读应用密码学也是一个好主意。但是本书的绝大部分内容是大多数应用程序不需要的实现细节。
编辑:扩展编辑中给定的新信息。当前的密码学绝大多数涉及许多复杂的数学。即使是看起来像各种纠缠比特的分组密码也是一样的。
在这种情况下,请阅读《应用密码学》,然后获得《应用密码学手册》,我们可以免费下载。
两者都有很多有关加密算法的内容的信息。对差分和线性密码分析之类的一些解释。另一个资源是Citeseer,其中有两本书都引用了许多学术论文供下载。
密码学是一个很难的领域,它具有广阔的学术历史,可以运往任何地方。但是,如果我们具备这些技能,那将是我发现的相当丰厚的回报。
别!
即使是专家,也很难知道他们是否做对了。在加密CS类之外,只需使用其他人的代码即可。仅在绝对必要时才移植代码,然后使用已知的良好代码对其进行测试。
我同意不重新发明轮子。
请记住,通过隐蔽性实现安全根本不是安全。如果安全机制的任何部分使用了短语"没有人会解决这个问题!",那是不安全的。考虑一下AES-该算法是公开可用的,因此每个人都确切知道它是如何工作的,但是没有人可以破坏它。
大多数专家都认为,在开发密码方法和算法时,开放性比混淆性更有价值。
换句话说,每个人似乎都能够设计出一个新的代码,除了他们之外,每个人都可以破坏它。最好的加密技术可以经受住算法和一些加密消息的发布,并由最好的加密黑客尝试破解它。
通常,大多数混淆方法和简单哈希(我自己做过很多)很容易被破坏。这并不意味着他们没有兴趣进行试验和学习。
密码学书籍清单(来自维基百科)
这个问题引起了我的注意,因为我目前正在重新阅读Neal Stephenson的Cryptonomicon,尽管它是一本新颖的小说,但它本身并不是一个糟糕的概述...
为了呼应其他所有人(为了后人),请不要实施自己的加密货币。使用图书馆。
也就是说,这是有关如何实现DES的文章:
http://scienceblogs.com/goodmath/2008/09/des_encryption_part_1_encrypti.php
排列和噪声对于许多加密算法至关重要。重点并不是要使事物难以理解,而是要在流程中增加一些步骤,使暴力攻击变得不切实际。
另外,获取并阅读应用密码学。这是一本好书。
必须同意其他海报。除非我们正在写论文并且需要做一些研究或者其他工作,否则不要做。
如果我们认为我们对此有很多了解,请阅读《应用密码学》一书。我知道很多数学知识,而那本书仍然让我大吃一惊。我们可以从他的伪代码中读取和分析。本书的后面还提供了大量参考资料,供我们深入研究。
加密是很多人认为很酷的事情之一,但是概念背后的实际数学却是他们无法掌握的。我很久以前就决定,要达到这个水平并不值得我费脑力。
如果我们只是想知道它是如何完成的(研究代码中的现有实现),即使我们通常不使用C ++编写代码,我也建议我们看一看Crypto ++库,它是实现加密的主题和部分的很好的见解。
布鲁斯(Bruce)也提供了不错的资源清单,我们可以从他的网站上获得这些资源。
在今年的Aus TechEd上,我参加了一次代码安全会议。在谈论.Net中的AES算法以及如何选择它时,演示者(Rocky Heckman)告诉我们一种用来破坏以前的加密的技术。在加密数据时,有人设法使用热像仪记录cpu的热特征。他们能够使用该记录来确定芯片正在执行什么类型的计算,然后对算法进行反向工程。他们手上的时间太多了,我非常有信心,我永远不会聪明到能击败这样的人! :(
- 注意:我衷心希望我能正确地讲故事,如果不是的话-这个错误很可能是我的,而不是提到的主持人的错误。
非专家应该能够期望得到的唯一加密技术是简单的一次性密码。
CipherTextArray = PlainTextArray ^ KeyArray;
除此之外,任何甚至值得一看(甚至用于娱乐)的事物都需要高水平的数学知识。
每隔一个答案,发明一个加密方案绝对是专家们要做的事情,任何新提出的加密方案确实确实需要进行公开审查,以寻求任何合理的验证希望和对其鲁棒性的信心。但是,实现现有的算法和系统是一种更加"实用的尝试",并且所有主要标准都具有良好的测试向量,可帮助证明实现的正确性。
话虽如此,对于生产解决方案来说,现有的实现方式很多,因此通常没有理由需要自己实施系统。
在这里做练习:
http://www.schneier.com/crypto-gram-9910.html#SoYouWanttobeaCryptographer
首先,请查看多维数据集攻击论文(http://eprint.iacr.org/2008/385),然后尝试破坏一些算法。在我们熟悉破解密码方案之后,我们将可以更好地创建它们。
就生产代码而言,我将重复已经说过的话:仅使用市场上可用的东西,因为所有主流方案都已经经历了多轮密码分析。
通常,我首先获得数字理论博士学位。然后,我进行了大约十年的研究,并随后进行了大量的出版和同行评审。就我使用的技术而言,它们是我和同行研究中的各种技术。有时,当我在深夜醒来时,我将开发一种新技术,加以实施,在其中找到漏洞(借助我的数论和计算机科学同行),然后从中进行完善。
如果给鼠标一个算法...
到目前为止,与其他所有人的说法相矛盾,请继续努力!是的,代码中可能包含缓冲区溢出漏洞,并且运行缓慢,有故障等,但是我们正在这样做是为了乐趣!我完全理解在玩加密货币时会发现的娱乐乐趣。
话虽这么说,加密技术根本不是基于混淆(或者至少不应该基于混淆)。即使Eve遍历我们混淆的代码并完全了解发生了什么,优质的加密货币也将继续起作用。 IE:许多报纸都有替代代码难题,读者可以尝试打破早餐。如果他们开始做诸如反转整个字符串之类的事情,是的,这会比较困难,但乔·雷德(Joe Reader)仍然可以打破它,而必须是tuohtiw gnieb dlot。
好的加密算法是基于被认为确实困难的问题(尚未证明,AFAIK)。这样的示例包括因数分解,查找对数或者其他NP完全问题。
[编辑:按扣,这些都不是证明是NP完整的。他们都未经证实,但有所不同。希望我们仍然明白我的观点:加密基于单向功能。这些操作很容易执行,但是很难撤消。即,将两个数字相乘,然后求出乘积的素因。好赶上]
玩弄真正酷的数学分支会给我们带来更大的力量,只要记住加密是基于困难而不是复杂的事物即可。一旦真正理解了许多加密算法,它们简直令人难以置信,但仍然可以工作,因为它们基于困难的事物,而不仅仅是切换字母。
注意:话虽这么说,某些算法的确增加了额外的怪癖(例如字符串截断),使蛮力迫使它们变得更加困难。我的一部分感觉就像我在某处读到了有关DES的内容,但我不相信它……[编辑:我是对的,请参阅本文的第5段,以了解对排列的引用无用。]
顺便说一句:如果我们以前没有找到它,我想可能会对TEA / XTEA / XXTEA系列算法感兴趣。
我不想深入探讨已经给出的正确答案(不要将其用于生产;简单逆转还不够;混淆不好;等等)。
我只想补充一下Kerckoff的原理:"即使系统的所有内容(除了密钥之外)都是公共知识,密码系统也应该是安全的"。
在讨论过程中,我还要提到Bergofsky的原理(Dan Brown在Digital Fortress中引用):"如果计算机尝试了足够多的键,就可以从数学上保证找到正确的键。代码安全性并不是它的通过键是无法找到的,但是大多数人没有时间或者设备去尝试。"
只是天生就不正确。丹·布朗(Dan Brown)弥补了。
以上所有建议都是正确的。混淆不好。在未让公众对其进行一段时间的宣传之前,请勿将自己的加密货币投入生产。
要添加的几件事:
- 编码不是加密。由于开发人员在这里的误解,我最近绕过了网站的身份验证系统。
- 了解如何平衡最基本的系统。我们会惊讶于简单旋转密码的知识实际上是有用的。
- A ^ B =C。我们说过我们一直在使用两个密钥XOR加密。在构建密码系统时,请始终检查步骤是否确实在完成某些工作。在两个密钥XOR的情况下,我们实际上只是在使用其他密钥。
- A ^ A =0。对于已知或者选定的明文攻击,XOR加密非常弱。如果我们知道全部或者部分纯文本,则可以获取全部或者部分密钥。明文^密文=键
- 另一本好书是西蒙·辛格(Simon Singh)的《密码书》。它涵盖了一些密码学的历史以及打破他所涵盖的大多数密码系统的方法。
- RSA:我将在这里展示我的内心数学极客。可能是当今使用的最简单的加密算法。破解它的方法是已知的(只需考虑密钥),但是计算上却非常困难。 m ^ d mod n其中n = p * q(p和q素数)和gcd(d,n)= 1. 组/数理论的一点点解释了为什么在不知道p和q的情况下不容易逆转这一现象。在我的数论课程中,我们至少证明了这六种方法背后的理论。
给PhirePhly的说明:
质分解和离散对数不是NP-Complete,也不是NP-Hard。它们的复杂性都不为人所知。我想我们只要弄清楚那部分就能获得相当大的名声。也就是说,其余断言是正确的。好的加密是基于容易完成但没有密钥很难撤消的事情。
我们不应该在产品中使用本地种植的加密货币已经被处以死刑。但是我已经阅读了问题,并且我们清楚地声明我们只是在做有趣的事情。在我看来,这听起来像是真正的怪胎/黑客/学术精神。我们知道它有用,我们想知道它为什么起作用,并尝试看看是否可以使它起作用。
我完全鼓励这样做,并为娱乐而编写的许多程序都这样做。我建议在一个名为" rootlabs"的博客上阅读这篇文章(http://rdist.root.org/2008/09/18/dangers-of-amateur-cryptography/)。帖子中有一系列链接,我们应该会发现它们非常有趣。一个对数学/加密感兴趣并获得计算机科学博士学位的人,他在Google工作,决定写一系列有关加密编程的文章。他犯了一些不明显的错误,这些错误都是行业专家内特·劳森(Nate Lawson)指出的。
我建议你阅读。如果它不鼓励我们继续尝试,那么毫无疑问它仍然会教我们一些东西。
祝你好运!
我同意所有答案,"不要编写自己的加密算法供生产使用"和"是的,为自己的教育而努力",但我想起了一些我相信古老的布鲁斯·施耐尔经常写的东西。 :"某人创建自己无法破坏的东西很容易。"
响应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完全的。我宁愿等待证明;-)