假设我想编写一种加密算法,以便在我和我的朋友之间进行交流,以供私人使用。那有多糟糕?

例如我可以使用Hello这个单词并使用简单的算法对其进行加密-例如,将每个字母的值乘以2并加13,这样它就变得完全不可读。

正在编写一个私有加密,留在两个人之间是否灰心?怎么了?

评论

评论不作进一步讨论;此对话已移至聊天。

似乎必须重复一遍才能清楚:请使用专用的聊天室进行讨论,骚扰和/或狂欢。从这一点开始,所有不要求澄清或建议对问题本身进行改进的评论都可以并且将被删除。感谢您的认可…

编写自己的加密IFF不错,这是为了获得编程/加密技能或娱乐乐趣。您不应该使用它来处理任何敏感的事情,并期望它是安全的。

要求澄清:您是否需要“加密”以确保安全?它只是朋友之间的一种娱乐玩具(对于某个人是否可以破坏加密,您真的不在乎),还是您要求它不能被各种攻击和攻击者破坏? (我的印象是,许多答案都假定是后者;只有少数几个答案很明显,即玩具本身并没有错。)

作为切线,您应该将实现已知安全加密算法的任务视为编写自己的加密的一种形式。进行正确操作比较“容易”,因为已知正确的实现已经解决了这个问题,但是也很容易出错,而且即使使用AES破坏了AES的方式,您也会感到安全,因为您使用了AES它的安全性。同样需要注意的是,所有赌注都是出于教育目的,但在未经审核的情况下也不敢将其运送给客户。

#1 楼

您的问题,MikeAzo的评论以及您的答复实际上不可能是实践中Schneier法则的一个更好的例子。 Schneier说:

任何人,从最笨拙的业余爱好者到最好的密码学家,都可以创建自己无法破解的算法。

回答您的答复

如果我将通过简单算法加密的“ QTCPIGXKUXTGG”密文发送给您,您不知道如何加密,该怎么解密?

因为即使我们可能不完全知道您的秘密算法是什么,攻击者首先要攻击的是攻击替代密码或多字母密码的常用工具。即使给出几个密文句子也可能足以完全恢复每个明文。
您不知道如何破解它的事实是无关紧要的。创建自己无法破解的密码很简单,但是创建他人无法破解的密码完全是另一回事。当您甚至不知道针对数百年历史的密码的最基本攻击时,您就有能力做到这一点-更不用说在不同攻击模型下无法区分的现代概念了-与密码相比,您处于无法克服的劣势由在该领域具有数十年经验的研究人员设计,他们是在现代安全性概念的基础上构建的,并丢弃了之前成千上万个失败的密码的遗骸。
举例来说,即使您的密码在某种程度上可以抵御纯密文攻击(不是),但如果我可以诱骗您加密自己选择的消息,它是否安全?如果我可以欺骗您解密我选择的消息怎么办?如果我知道您已发送的特定加密邮件的部分或全部纯文本怎么办?如果您使用相同的密钥加密多封邮件怎么办?如果我可以连续数百次甚至数百万次执行任何或所有这些操作,该怎么办?这些都是现实世界中极为普遍的情况,在这种情况下,现代密码仍然完全安全。
我将为您提供另一本Schneier经典作品,《给业余密码设计师的备忘录》:

一位密码学家朋友讲述了一个业余爱好者的故事,他一直用他发明的密码打扰他。密码学家将破解密码,业余爱好者将进行更改以“修复”它,密码学家将再次破解它。这种交换进行了几次,直到密码学家受够了。当业余爱好者拜访他,听到密码学家的想法时,密码学家将三个信封面朝下放在桌子上。 “在这些信封中的每一个中,都有一个针对您的密码的攻击。请阅读并阅读它。在您发现另外两个攻击之前,请不要回来。”从此再也没有听到这个业余爱好者的消息。

这是您的第一个信封:给定一两段密文,您的密文将无法进行基于语言的频率分析。
让我知道您何时已经找出另外两种攻击方式。
编辑:关于在不同攻击模型下的不可区分性的评论是大多数“解密此消息加密挑战”完全铺张的原因之一。他们通常只是给攻击者一些密文,要求他们解密,并在经过一段时间后没有人产生明文时宣告胜利。不幸的是,事实并非如此。攻击者在实践中还有很多技巧。他们可以欺骗计算机来加密他们选择的数据,可以欺骗计算机来解密他们选择的数据,并且他们通常甚至可以做数千,数百万或数十亿次这样的事情。 Moxie的帖子显示,当您将攻击者限制为仅一个密文形式的攻击时,哪怕是最可怕,最恐怖且最明显的不安全密码都可以有效地不可渗透,而这并不代表攻击者针对密码的能力,因为它们实际上是密码在实践中部署。

评论


$ \ begingroup $
创建自己无法破解的密码很简单:如果您是Bruce Schneier(或Chuck Norris),则不会。
$ \ endgroup $
–mikeazo
17年1月25日在19:05



$ \ begingroup $
我们了解密码安全的方法是观察它多年来如何抵抗来自整个密码学界的攻击。除非密码系统经受了那种要求公开的并且值得这种程度的审查的加密检查,否则您不能依靠它。您可以开发自己想要的任何东西,然后随心所欲地玩,但是如果您一直依赖它直到经受住了如此严格的审查,那么您就是一个傻瓜-很有动力的对手可能会破坏它。
$ \ endgroup $
– David Schwartz
17年1月25日在21:11



$ \ begingroup $
仅当您假设按该度量标准对密码学家进行严格排序时,这是荒谬的。您不能严格命令网球或国际象棋棋手互相击败。我认为您也很难证明密码学家的身份。
$ \ endgroup $
–斯蒂芬·托瑟
17年1月25日在23:19



$ \ begingroup $
QTCPIGXKUXTGG可能意味着MARVEL US ALL。
$ \ endgroup $
– Stig Hemmer
17年1月26日在11:07

$ \ begingroup $
@mikeazo:我听说布鲁斯·施耐尔(Bruce Schneier)曾经创造出一种他无法破解的密码。然后他打破了它。
$ \ endgroup $
–杀人罪
17年1月29日在21:32

#2 楼

我实际上认为这是一个非常好的问题。答案是因为密码术是一项技能,并且像任何其他技能一样,开发也需要时间。此外,您将把自己的(经验)经验与那些试图破坏您的算法的人的技能相提并论。

这是真正的原因:不是因为你不应该这样做,经期。就是说,如果您确实编写了自己的算法,则需要意识到,创建能够真正抵御现实世界中的专门对手的信息的任何东西都将花费很长时间。

密码学就像剑术。您不会削竹棒,将其摆动几次,然后挑战一堆打手去打架。其原因应该很明显。尤其是当有问题的那帮暴徒可能是一个3字母的实体,例如DJB或其他国家级对手时。 -我写了很多算法,但是没有提出和使用它们。直到您掌握了以下几点:1.比AES或Salsa / ChaCha更快。2.可能比AES或Salsa / ChaCha更安全,为什么要提出或使用有问题的算法?

最后,您会可能喜欢学习信息理论。您将了解到,将算法保密并不有效,因为算法本身具有表示它所需的最少位数。这些位(算法)只是成为关键。众所周知,最好使用公共算法将保密性集中到适当的小密钥中。如果您的密钥被盗用,则只需更改密钥即可。如果算法是关键,那么,您需要一个全新的算法。


我不同意您不应编写自己的算法,因为您需要有充分明确的理由来使用/提出自己的算法。我个人会鼓励您编写自己的书,因为它会教您了解什么有效,什么无效以及为什么。这样做将帮助您理解各种数学和信息论(基本上是因为/因为密码学而学到的所有数学知识)。

评论


$ \ begingroup $
+1指出构建自己的算法(和破解它们)与实际使用它们之间的重要区别。建立起您内心的内容,但不要天真地将其用于有意义的事情,也请不要成为那种不负责任的人,不要随便发布它,而要花哨的外观鼓励他人使用它。
$ \ endgroup $
–斯蒂芬·托瑟
17年1月25日在21:24



$ \ begingroup $
还有+1提到了Kerckhoffs原理的Kolmogorov复杂性解释。好点。
$ \ endgroup $
– outis nihil
17年1月25日在21:57

$ \ begingroup $
Solitaire是组成加密算法的一个绝佳的现实示例,Solitaire是Bruce Schneier为Neil Stephenson的书《 Cryptonomicon》开发的一种加密算法。作为该领域的专家,他将其设计为比普通的纸笔密文更安全,但明确表示不做任何保证。公众花了好几年的时间才发现有人说说笑话的对称性问题,时不时地泄露一些关键数据。甚至布鲁斯本人也没有理由认为算法是有缺陷的,直到本书出版很久以后。
$ \ endgroup $
–Cort Ammon
17年1月25日在22:04



$ \ begingroup $
我不确定我在评论中说的话与那有什么关系。也就是说,高度优化的ChaCha20版本每字节四个周期,或者在现代硬件上甚至更快。您甚至可以使用缩减轮次版本(ChaCha12或ChaCha8),该版本每字节占用不足2个周期。在这一点上,没有任何借口可以滚动自己的加密货币以在生产设备中使用。
$ \ endgroup $
–斯蒂芬·托瑟
17年1月25日在23:15



$ \ begingroup $
等效:没有理由不将自己的降落伞构造成一种学习练习,但有充分的理由不跳出佩戴降落伞的飞机。坚持从阳台上扔鸡蛋。加密还有一个额外的困难,那就是您无法像轻松地将鸡蛋扔到阳台上并观察其是否粉碎那样轻松地测试算法的优劣。
$ \ endgroup $
–史蒂夫·杰索普(Steve Jessop)
17年1月31日,11:26



#3 楼

不鼓励这样做是因为(A)从统计上讲,初学者不太可能提出强密码,并且(B)缺乏对密码分析技术的实用知识,因此初学者不会知道其密码容易受到攻击。

由于安全性之外的大多数工程问题,当事情不正常时,这将是显而易见的。如果您的视频编解码器无法正常工作,则整个显示屏上都会出现奇怪的绿线。如果您的楼梯感应器不起作用,则机器人会掉下楼梯等。但是,如果您的密码在密码上易受攻击,您仍然可以很好地加密和解密消息。唯一的问题是没有密钥的人也可以解密消息,他们不一定会急于通知您。

评论


$ \ begingroup $
很好。在StackOverflow上大约有90%的加密“有效”。但是实际上不到10%是安全的,这简直是无稽之谈。我已经指出了90多个投票中的漏洞,而没有投票,因为它们有效。
$ \ endgroup $
–马腾·博德威斯♦
17年2月1日在16:13

#4 楼

出于同样的原因,“不鼓励”编写自己的编译器,框架或操作系统。如果您想将其作为学习体验,出于个人满意度或好奇心而去,那就去吧。如果您想要某种能够真正达到预期目的的产品,并且比现在早得多,则请理解已经有人花了很长的时间从事这项工作,此后您犯了许多成千上万的错误在生产某些东西时会比他们已经拥有的东西少得多。

我不会“劝阻”您写自己的交响曲,但是如果您还没有学习音乐理论,作曲和器乐,那么我可能对坐在那儿不感兴趣,我怀疑除了爱母的母亲以外的其他人会不会也是..

评论


$ \ begingroup $
+1!莱纳斯·托瓦尔兹(Linus Torvalds)就是这样,他出于好奇而编写了一个操作系统。但!他是该规则的例外,并且他偶然跌入了市场的巨大空白,并且他迅速加入了一支不断壮大的团队,并且还需要10到20年的时间才能做好生产准备(取决于您的实际情况) “生产”和“就绪”的定义)。
$ \ endgroup $
–‐Jörg W Mittag
17年1月27日,0:59

$ \ begingroup $
最大的不同是,您注意到上述问题之一失败时。另一方面,不良的加密效果很好,但并不安全。
$ \ endgroup $
– CodesInChaos
17年1月27日在9:56

$ \ begingroup $
@JörgWMittagLinus Torvalds实际上只是写了内核。而且他并没有加入一个不断壮大的团队。该团队已经存在,并且已经为GNU操作系统创建了数百个程序。但是他们没有内核,因此当Linus将操作系统与Linux捆绑在一起作为内核的演示时,人们认为整个过程都称为Linux,并且全部由Linus Torvalds创建,Linus Torvalds曾在Linux上工作。 GNU项目感到恼火(因为Linus的理想与他们的理想不同,这是他们创建GNU的原因)。有人称其为GNU / Linux。
$ \ endgroup $
– wizzwizz4
17年1月28日在8:16

$ \ begingroup $
实际上是GNU / Mozilla / Google / Apache / Oracle /.../ Linux,非常感谢。 /秒
$ \ endgroup $
–user253751
17年1月30日在5:23



$ \ begingroup $
@ wizzwizz4我想说Linus最重要的贡献就是普及。对于大多数人(甚至是“极客”)来说,GNU只是一堆通俗易懂的怪人,如果他们甚至听说过,那么胡子的人比例也要高得多。莱纳斯(Linus)是个大学生,他对整个怪胎社区说:看看我做的这件事很酷。它很小,简单,有趣-并且可以工作(尽管是一个相当裸露的〜386独占系统)。
$ \ endgroup $
–罗安
17年2月2日在15:14

#5 楼

除了关于密码复杂性的好答案之外,我认为应该提到的是,实现和利用密码的代码的安全工程(例如密钥交换,密钥选择和熵的产生)也非常困难。罗斯·安德森(Ross Anderson)撰写了一本关于安全工程的绝妙书籍,但他的较早论文(从1993年开始!)介绍了一些特定于密码学的要点(使用旧的ATM安全模型作为案例研究)“为什么密码系统失败”(第一届会议.- Computer and Comm。Security '93

评论


$ \ begingroup $
@PaulUszak我敢肯定,只要有足够的时间/动力,大多数专业程序员都可以实现椭圆形的加密应用程序,该应用程序可以加密和解密数据。但是,这样的应用程序不可避免地会受到许多侧信道攻击的攻击,因此实际上并不安全。实施加密并不是固有的困难,但是安全地实施加密并不那么容易,因此出于与发明自己的密码系统相同的原因而被劝阻。
$ \ endgroup $
–加文·扬西(Gavin S. Yancey)
17年1月31日,18:25



$ \ begingroup $
@PaulUszak如果您要实施加密以了解它,请继续。但是在生产应用程序中,如果可能的话,请使用由安全专家编写和验证的高质量加密库。除了实际的密码以外,还有很多棘手的问题,这可能会使您的加密货币不安全。 stackoverflow.com/questions/1914257/…
$ \ endgroup $
–加文·扬西(Gavin S. Yancey)
17年1月31日在21:04



$ \ begingroup $
@PaulUszak信息安全(无论是加密还是其他方式)的主要区别在于,失败的实现通常与成功的实现一样有效;直到有人利用了它,并且为时已晚,您所做的事情才能奏效,这不是很明显。
$ \ endgroup $
–熊佳亚诺夫
17年1月31日在21:18

#6 楼

不建议这样做,因为人们已经回答了您所有的充分理由(因此我不再重复)。

但是有一个转折(这就是答案的重点)-无论如何如果您的密码较弱(并且它很弱),则它有两个优点:


它比以前的明文更安全(即使只有一点点空白, (因为您没有使用加密技术的经验)。

(这将引起争议)


它实际上可能会给您带来更多的机会如果您尚未成为NSA或其他机构的目标,就不会受到监视。 (现在,在您让人们以“尽管默默无闻却无法实现安全性”将我推到地狱之前,请允许我解释一下:)

如上所述,如果您是有针对性的,请使用Toy-cipher根本无法帮助您,实际上您就像在使用未加密的通信时一样不受保护(或者甚至更糟,因为在相信自己受到保护时您可能冒更大的风险说话)。

但是,除了密码本身的安全性及其实现的安全性之外(或者有人可能会争辩说:之前)(这是两个非常不同的东西,例如,请记住Debian GNU / Linux OpenSSL惨败)。决定您的通信是否将被私有化的另一个关键因素。那就是“有人会尝试”吗?有人会尝试满足以下三项要求中的任何一项:


您自己就是一个有趣的目标(例如,顶级政治人物,金融访问/银行,名人身份,有机会获得稀有物品)信息等)
您也许对自己并不感兴趣,但是有很多使用相同安全方法的“您”。换句话说:人气。当然,Facebook并不包含很多绝密数据,但是拥有一种访问任何人的Facebook帐户的方式,将成为黑客试图破解其保护的一个很好的诱因。运气不好(例如,一些黑客很无聊,只是碰巧在您的网站上做出选择,将其转换为上述第1点)。

现在,请确保TLS1.3 + AES256-GCM / SHA512很棒今天的事情。没有人可以监视您(NSA和朋友除外,但是如果您成为他们的敌人,那么您就已经做好了)。但是有大量的人使用它,因此破解它变得非常有利可图。所以它会发生。

不是今天,也许不是在5年之内,但是在50年内,随机脚本小家伙可能只需单击一下就可以解密您的通信(因为您不使用PFS,do!)。 br />
但是,您的玩具加密聊天(仅由您和您的朋友在全世界使用,以谈论稍微令人尴尬的迷恋)可能对所有人(除了合法方)永远隐藏。仅仅是因为没有人关心它才能为破解它付出最小的努力,并且它还不够流行,因此被某些类似于PRISM的大规模监视默认解密。

但是其他答案正确吗?目前,进行持续秘密通信的最佳实践是:“ a)不要使TLA各政府机构成为敌人。b)使用由合格的程序员实施的安全流行密码。c)至少直到死亡之日,才继续升级密码和实现。” -尽管通常(带有危险的结果)通常会缩短到“使用安全的流行密码”(b)的一半。如果我们拥有数十亿只很少有人使用的晦涩和不安全的密码,那就更好了;而不是每个人都可以使用的所谓的坚不可摧的工具(但它们是秘密存在的缺陷-只有1984年代的政府和其他模糊的元素才知道。

作为(轶事)“证据”,我每个月都会帮助修复数十个损坏的WordPress / Joomla / etc网站,这些网站在几个月/年前就“非常安全”。但是奇怪的是,我时不时地偶然发现使用不安全的RC2甚至只是hackish的XOR正确编写(例如,验证输入:)旧的Perl甚至shell脚本,这种情况在几十年后仍然很强大。只是因为存在差异(而且不流行),而且没有人关心足够的时间来破解它们。

由于当今最大的问题可能不是目标明确,而是一些自动化机器人会利用流行软件中的一些漏洞,但补丁速度不够快。由于加密饼干数量有限,而且大多数时候都在追赶比您大的猫。因此,您很可能会成为优先级较低的门票,从而逐渐淡忘。

评论


$ \ begingroup $
“它比以前拥有的明文更安全”-这是有争议的。您可能很想在您看似“安全”的渠道(一种称为风险补偿)上讨论更多私人事务。
$ \ endgroup $
–杜布
17年1月26日在10:04

$ \ begingroup $
“它实际上可能会给您带来更多不被窥视的机会”-相反的情况也可能成立。正如NSA规则显然所说的那样:技术数据库的维护要求保留所有加密的通信。因此,您可能会逃避对数据的XKeyscore分析,但是由于它是加密的,因此可能会被存储(和分析)。
$ \ endgroup $
–杜布
17年1月26日在10:12



$ \ begingroup $
玩具密码:对不起,我错过了。是的,这就是我的意思。
$ \ endgroup $
–杜布
17年1月26日在13:57

$ \ begingroup $
Nitpick:TLS 1.3需要PFS。
$ \ endgroup $
–马腾·博德威斯♦
17年2月1日于16:19

$ \ begingroup $
@MaartenBodewes是的,不错。尽管仍然有0-RTT恢复,但仍然是非FS,对吗?
$ \ endgroup $
– Matija Nalis
17年2月1日在19:56



#7 楼

我同意已经提供的答案,但我想补充两点。 >
有两种类型的加密:一种可以防止您的妹妹阅读日记,另一种可以防止您的政府。没什么大不了的,您唯一要担心的是您的文本不会被Google引用,您可以使用自己的自制密码系统。我读到一些成人新闻组正是出于这个原因使用ROT13:没有添加机密性,但是没有人(尤其是孩子)会偶然发现内容。

但是,如果这样做,您必须假设从第一天开始就有人破坏了您的系统,而想要破坏它的任何人实际上都可以。更重要的是,密文类似于一个巨大的广告牌读物:“如果可以解密,请解密。”

但是,如果您想要真正的机密性,请不要使用没有密码的系统经过该领域专家的测试和批准。如果您不确定原因,请参阅其他答案。只是一个简单的算法,您不知道如何加密?”

这不符合Kerckhoff的原理:


[一种密码系统的算法]应该不需要保密,并且如果它陷入敌对状态也不成问题。手


或更明确地说,如果您的安全性取决于敌人不知道您使用的算法的事实,那么您的安全性就是废话。即使不知道您的算法,攻击者也能够完美地发现致命缺陷。

#8 楼

显而易见的答案是,制作玩具密码与朋友交换消息没有错-就像在您和朋友要玩的子手游戏中使用gets()没错。布鲁斯·施耐尔(Bruce Schneier)不会破坏您的大门并没收您的计算机。您与朋友一起做的事是您自己的事。

重要的条件:乘以2,再加上13就是玩具。
真正的错误是要对专业渎职行为进行错误处理,如果您对不信任客户的产品使用即席加密(就像在任何生产代码中使用gets()一样,都是错误的)。
虽然玩玩具密码或编写易受缓冲区溢出攻击的私人代码本身没有什么错,但这样做很容易成为一种习惯,并且习惯很难打破。如果您习惯于为自己的玩具项目使用gets()(臭名昭著的安全漏洞来源,但比安全替代品更容易使用),那么您将很想偷工减料并将其用于生产代码中。同样,如果您习惯于容易伪装消息,那么您可能会倾向于在生产代码中编写自己的加密货币,而不是进行学习如何正确使用工业强度加密货币API的繁琐工作。

总而言之,您所描述的场景(在朋友之间的玩具加密货币)本身没有什么问题,但是它仍然会发出警告标志,因为它可能会漂移到错误的地方。

gets API(已从最新的C规范中删除,并已在C ++中弃用):


从标准输入(stdin)读取字符并将其存储为C字符串转换为str直到到达换行符或文件末尾
...并且不允许为str指定最大大小(这可能导致缓冲区溢出)


几乎可以保证使用gets会使系统容易受到攻击。

#9 楼

晦涩可以提供一定的安全性,但是其用途非常有限。除其他外,


很难量化其提供的安全性。由于人类是非常糟糕的随机数生成器,所以想出一个看似原始想法的人很难知道别人会想到它的可能性。
虽然提出来并不难。在正确的条件下将是安全的算法,很难维持这些条件。对于永远不会被使用该算法发送的所有消息内容所信任的任何人,必须永远将该算法和所有纯文本保密。此外,必须将可用的密文总量保持在相当小的水平,但是很难量化它的大小。
划分风险的唯一方法是对不应该披露的每种不同类型的消息使用独立于密码的算法影响其他任何人。出于上述第一个原因,很难设计出真正独立的算法,并且大多数依靠模糊性来依靠安全性的方法都无法适当地划分风险。

尽管经常描述诸如DES,AES等内容作为“算法”,将它们视为“算法生成器”可能会更有用。如果一个人有一个很好的256位随机数源,那么在宇宙中任何地方匹配其他任何事物的可能性几乎为零,那么“将AES与我刚生成的这个数字一起使用”可以用作加密算法,该算法在密码学上独立于任何曾经存在过的其他算法。因此,使用这种方法来划分风险要比设计自己的加密方案要容易得多。

#10 楼

加密很难,而且很容易导致致命的错误。即使您甚至不买票,连续赢得彩票十次的机会也要比中途通过加密的机会高。

但是由于加密很难,您不会注意到您的加密将使任何业余密码学家花费半个小时的时间才能破解。这不仅是因为算法难于提出,而且对于完整的加密方案,还需要考虑模式,密钥长度,密钥交换和其他一百多种事项。即使您的方案在纸面上是好的,您仍需要进行一个不会增加缺陷的实现(例如,弱IV生成)。灰心丧气类似于询问为什么让乘客乘坐空客380是个坏主意。如果您实际上是密码学家,则可以尝试发明新的加密方案。如果不是,请高枕无忧,享受机上娱乐,并让拥有数千小时经验的人们来处理棘手的部分。