多年,也许10年,我一直对密码学着迷.我读了一本关于基于XOR位的加密的书,并且从那以后就被迷住了.
我想我更加公平地说那些可以打破各种加密方法的人着迷,但我离题了.
至关重要 - 在编写加密时使用了哪些方法?密码学中的混淆是否合适?
我使用两个基于密钥的XOR加密,密钥上的各种散列技术(SHA1),以及诸如在这里和那里反转字符串等简单的事情.
我很想看到其他人的想法,并在编写一个不那么开箱即用的加密方法时尝试.此外 - 关于专业人士如何"打破"各种加密技术的任何信息也会很有趣.
澄清 - 我不希望在任何生产代码或我的任何代码中使用它.我很有兴趣通过玩弄来学习它是如何工作的,而不是重新发明轮子.:)
伊恩
我能给你的最好建议是:抵制重新发明轮子的诱惑.密码学比你想象的更难.
获得Bruce Schneier的书" 应用密码学"并仔细阅读.
为了反对其他人到目前为止所说的话,去吧! 是的,你的代码可能有缓冲区溢出漏洞,可能很慢,有问题等等,但你这样做是为了玩!我完全理解在玩加密时发现的娱乐享受.
话虽如此,密码学根本不是基于混淆(或至少不应该).好的加密将继续工作,即使一旦夏娃已经通过你的混淆代码,并完全理解正在发生的事情.IE:许多报纸都有替代码谜题,读者试图打破早餐.如果他们开始做翻转整个字符串的事情,是的,那就更难了,但Joe Reader仍然可以打破它,neve tuohtiw gnieb dlot.
好的加密是基于假设(尚未证实,AFAIK)真正困难的问题.这方面的例子包括分解素数,找到日志,或者实际上任何其他NP完全问题.
[编辑:快照,这些都没有被证明是 NP完全的.它们都是未经证实的,但却不同.希望你仍然看到我的观点:crypto基于单向函数.这些操作很容易做,但很难撤消.即乘以两个数字vs找到产品的素因子.好抓住tduehr ]
更多的力量让你玩一个非常酷的数学分支,只记得加密是基于困难而不复杂的事情.许多加密算法,一旦你真正理解它们,都是令人难以置信的简单,但仍然有效,因为它们基于一些困难的东西,而不仅仅是切换字母.
注意:有了这个说法,一些算法确实增加了额外的怪癖(如字符串切断),使得暴力迫使它们变得更加困难.我的一部分感觉就像我在某处引用DES一样阅读,但我不相信...... [编辑:我说得对,请参阅本文的第5段,以便将排列作为无用的参考.
顺便说一句:如果您以前没有找到它,我猜想TEA/XTEA/XXTEA系列算法会引起人们的兴趣.
正确的答案是不要做这样的事情.最好的方法是为此选择许多加密库中的一个,并在您的应用程序中使用它们.通过默默无闻的安全从未奏效.
选择当前的密码算法顶级标准.AES用于加密,SHA256用于散列.Elgamal公钥.
阅读应用密码学也是一个好主意.但本书的绝大部分内容都是大多数应用程序不需要的实现细节.
编辑:扩展编辑中给出的新信息.绝大多数当前的密码学涉及许多复杂的数学.即使是看起来像各种各样的位置的块密码也是一样的.
在这种情况下,然后阅读应用密码学,然后获得可以免费下载的应用密码学手册.
这两者都有很多关于加密算法的信息.对差分和线性密码分析等事物的一些解释.另一个资源是Citeseer,其中有许多学术论文被这两本书引用下载.
密码学是一个艰难的领域,具有丰富的学术历史,可以随时随地进行.但是,如果你掌握了这些技能,我会发现它是非常有益的.
这里做练习:
http://www.schneier.com/crypto-gram-9910.html#SoYouWanttobeaCryptographer
对于初学者,请查看多维数据集攻击文件(http://eprint.iacr.org/2008/385)并尝试使用它破解一些算法.熟悉破解加密方案后,您将更好地创建加密方案.
就生产代码而言,我将重复已经说过的内容:只使用市场上可用的内容,因为所有主流方案都已经过多轮密码分析.
以上所有建议都是合理的.混淆不好.如果没有让公众在一段时间内打败它,就不要把你自己的加密器投入生产.
要添加的几件事:
编码不是加密.由于开发人员误解,我最近绕过了网站的身份验证系统.
学习如何打破最基本的系统.你会惊讶于简单旋转密码的知识实际上是多么有用.
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.它们的复杂性都不为人知.我想你只要想出那个部分就能得到相当多的名声.也就是说,你断言的其余部分是正确的.好的加密是基于易于操作的东西,但没有密钥就很难撤消.