我在读一个有趣的问题:

我的开发人员的自制密码安全性是对还是错,为什么?

它显示了由“戴夫(Dave)”开发的弱的自制算法”,答案讨论了为什么这是一个坏主意。 (实际上是哈希算法而不是加密算法,但是我的问题同时适用于这两种算法。)

对我来说,自制算法是一个非常糟糕的主意,但这是我不理解的一件事。

假设我是攻击者,并且面临“戴夫”开发的一种弱但未知的加密算法。我将如何破解?我什至不知道从哪里开始。这将是一个看似毫无意义的字符串。

例如,说自制的算法是这样的:


使用弱的众所周知的加密原始数据的算法,然后:
对文件中序列号具有重复的数字和为素数的任何字节进行按位负运算。 (或者其他任何这样的数学操作,这只是一个例子。)

如果不事先知道,该如何破解这种算法产生的文件?

编辑:大家,请不要试图说服我保守算法秘密是多么困难。尽管在现实生活中要实现这一目标有多么困难,但请假设该算法是完全保密的,请回答此问题。

此外,假设我根本无法访问该算法,只有到结果数据。

评论

如果您正在寻找与密码分析有关的回复,则可能需要指定一些其他信息。首先,攻击者可以访问多少个密文,其次攻击者可以访问多少个密文,其次是密文加密哪种类型的数据(例如,二进制数据或文本)。

好吧,看来您已阐明了自己的观点。就是这样,您赢了。安全站点上的一群人无法破解您的“加密”。

你好,RamRachum,挑战解码某些样式问题在这里被认为是不重要的。

嗨,拉姆,我认为您有一些错误的假设。首先,据我了解,您只是在询问密码分析的纯数学方面。如果是这种情况,那么问题可能应该转移到密码学上,而不是仅仅停留在信息安全上-在这里,我们确实要查看整个图片,并且我们绝对会保留在现实世界中,而不是完美的球形鸡(作为一个整体)提到的评论者)。

在实际情况下,如果数据的机密性取决于加密算法的保密性,那么窃取该算法的详细信息可能会更容易(假设算法并非微不足道)。最弱的链接,等等。此外,在非平凡的实际使用场景中,即使没有攻击者的参与,也几乎不可能将算法保持在任何保密级别-无论是算法的其他使用者,有权访问源代码存储库的开发人员,或其他内部攻击者。

#1 楼


假设我是攻击者,并且面临“戴夫(Dave)”开发的弱但未知的加密算法。我将如何破解?我什至不知道从哪里开始。这将是一个看似毫无意义的字符串。


这是正确的,但事实并非如此。这是一些加密的数据(4587556841584465455874588)。知道什么意思?绝对不是。

但是,您缺少将密码学结合在一起的宇宙的核心,最基本的,最重要的中心支柱。这个想法很简单:

the key is everything


就这样。那就是您必须保护的位。您必须捍卫自己的生活,并希望没有人会用锤子敲打您,直到您告诉他们这是什么。

在此基础上,您必须假设您的算法可以被读者理解。攻击者。他们知道它是如何工作的。他们可以记录其过程。如果有任何弱点,他们会找到。他们会利用它们。就像来自Taken的那位愤怒的CIA爸爸一样。

事实证明,这不是一个假设,而是更多的实际案例。家庭酿酒密码学家Dave希望在其程序中包含加密算法。他决定避开密码学家多年来免费为他完成的所有测试和设计工作,他写了一些涉及奇异或的东西,编译了他的程序并将其有用地提供给了朋友。

该算法现在在他们手中。游戏结束。

现在,您可能会问:“我不能只对算法保密吗?可以,对吗?”哦,戴夫,停下。不不不。秘密算法的问题在于它们更容易被盗。毕竟,每个用户的密钥都是不同的(实际上,这不是必需的,但是,为了简单起见,我们假设它是不变的),但是算法保持不变。因此,您只需要向攻击者公开自己的一种实现,就可以重新进行游戏。


编辑:好的,以响应OP的更新问题。让我们暂时假设该算法是完全未知的。加密对话中的两个参与者中的每一个都对其算法实现具有完美的安全性。

在这种情况下,您需要分析数据。您可以执行以下任一操作:


分析常见的字母。这是您破解典型凯撒移位密码的方法。
尝试猜测密钥的长度。有了这些信息,您就可以寻找可能与相同的明文相对应的重复密文块。
巧合的尝试索引和用于破坏虚拟密码的其他此类度量,因为许多多字母密码(可能)只是变体
注意模式。任何模式都可能为您提供钥匙。
寻找其他线索。长度是否对应于某个度量,例如是否是某个值的倍数(例如字节边界),并且(可能)被填充?
尝试使用一种对称密码密码分析技术进行分析。这些在很多情况下都依赖于了解算法,因此可能不适用于这里。
如果您认为所讨论的数据代表密钥交换,则可以尝试使用多种破解公钥算法的技术之一。

事实是,未知算法中的一小段数据很可能无法解密。但是,这并不意味着您应该依靠这种情况。密码分析者可以恢复的数据越多,破坏算法的可能性就越大。如果不进行认真的密码分析,您可能不知道该边界是什么-例如,可以合理假设一个人可以对三个字母单词实施caeser-cipher算法,因为几乎没有什么意义。

您也面临重用问题。在第二次世界大战中,Engima通过对其秘密算法进行可编程设置来克服了这个问题,但这也被打破了。

还需要考虑加密的人为因素。我意识到锡罐上的标签上写着“使用一次,不消化”等,但是人类是人类,可能会使用两次,三次等。任何这种行为都会在密码分析家的手中。

评论


您已经提出一个论点,即保持算法的保密性非常困难。我完全同意。但是,这不是问题所在,因此此答案没有帮助。

–Ram Rachum
13年3月18日在15:51

@RamRachum:您可能需要更新答案,以指定我们的初始假设是在无摩擦平面上的完美球形鸡。

–斯科特包
13年3月18日在15:57

斯科特:通常,鸡只占一个点,因为空气阻力真的很复杂,而且所有的羽毛都是这样。 @Ram好的,我已经更新了答案,为您提供了一些一般性的指导,以指导您从哪里开始使用一些随机数据,以及什么构成“随机”数据的风险。免责声明:如果您依赖该信息,则后果自负。

–user2213
13年3月18日在16:18



@Ram。每字节位置更改一个文件可能会使某些文本混乱,但是如果有足够的内容,您很快就会得出结论,那就是这种模式,尤其是当出现部分单词时。您实际上将其分为两个阶段:1)弱算法,然后2)好的,我有单词的一部分,现在,剩下的单词的模式是什么?

–user2213
13年3月18日在16:35

如果您不了解该算法,并且取决于其设计的好坏,它也不是小菜一碟,但是事实证明,您只需要足够的加密消息或一些清晰的消息及其加密版本即可消除干扰并进行推断。通过在加密消息及其最可能的解密之间应用相关算法来进行转换(如果可用,则使用已知消息作为训练序列)。如果您对所涉及的数学感兴趣,那么阅读有关信息论,信号处理和机器学习的信息可能会对您有所帮助。

–NotGaeL
13年3月18日在21:32



#2 楼

历史上,至少一次实现了未知的“加密”算法。我说的是Minoan Linear B脚本,这是一种在公元前1300年左右在克里特岛使用的书写方法。几个世纪以后,这种方法就消失了,因为所有从业者的死亡以及所谓的希腊黑暗时代期间文明的全面崩溃。 19世纪末,当考古学家开始在克诺索斯(Knossos)和其他地方对土地进行筛分时,他们所得到的只是一堆标牌不明的药片,却不知道用于生产它们的书写系统。

这里有趣的故事是,线性B于1950年代被解散,使用的分析工具与当时的加密系统相同。实际上,该文字被视为“未知加密算法”。它屈服于统计分析,连锁推论和一些关于纯文本的假设(基本上是假设希腊语的基本语言是变体)。这是关于密码分析如何针对“手动密码系统”进行的经典而精湛的说明。


当然,假设可以使用密码算法并且仍然保持秘密,这是不可信的。出于相同的假设,视频游戏或媒体内容没有盗版。现实世界不可避免地提醒我们这是不正确的。可以将算法保密的唯一已知方法是杀死其发明者和从业者,销毁其设备并等待几个世纪。这有一些不便的副作用。

即使在给定的特定情况下,算法的详细信息尚未泄漏,也无法量化算法的秘密程度,即进行逆向工程,贿赂或有益健康的盗窃将花费多少时间来重建算法。算法。这是大约40年前密码学家决定拆分密钥和算法的主要原因,其中密钥是秘密的,算法是非秘密的:您可以量化密钥的保密性,而不是算法的保密性。

这使我们可以深入了解您的特定问题。您的“秘密算法”取决于“数学操纵”的概念。它们有多少?您可以估计或描述“数学操作”集吗?您会发现加密算法本身就是一种“数学操纵”,因此您的问题相当不确定。

评论


+1这会带来一些不便的副作用。

– Mindor先生
13年3月18日在18:47

出色的答案清楚地说明了为什么问题本身是“有缺陷的”。

–马夫
13年3月18日在20:02

我不是很了解所有这些“现实世界无疑地提醒我们这不是真的。”在所有答案中。实际示例:使用可逆加密算法来保护服务器上的敏感用户数据。这意味着它不能像我们用来存储密码那样是单向算法,因此它必须具有密钥。那么现在保护这个密钥与保护算法有何不同呢?只需假设编写此算法的人员与生成/管理加密密钥的人员相同即可。贿赂,偷窃等将以相同的方式应用于两种方法。

– XzKto
13年3月19日在6:59

我并不是说这是要走的路,我绝不会在生产中使用这样的东西,但是所有的答案都是懒惰的,恕我直言。

– XzKto
2013年3月19日上午7:00

该算法以编译后的代码形式存在于文件中,并且还以源代码形式存在于开发人员的机器,修订控制软件,备份...中,并且还存在设计文档,例如印刷纸,电子邮件和几个人的头脑。要跟踪所有信息并确保保密性将非常困难。与此形成对照的是,密钥仅存在于RAM中,或者更糟的是存在于单个文件中,而不存在于我刚刚列出的所有其他介质中。您可以绑架所有开发人员,因为他们从来没有进入过他们的大脑,所以他们都不会对密钥的价值有丝毫的了解。

–汤姆韭菜
13年3月19日在12:16

#3 楼

要攻击密码协议,您可以使用以下攻击方法


已知的明文:试图找到您拥有的明文和相应的密文之间的相关性。
选择的明文:加密特定
选择密文:解密特定密文并研究明文和密文的变化。
已知密文:所拥有的就是密码文本,下面是一个简单的示例。

很久以前,我参加了一个密码学课程,在其中的一堂课中,我们学习了替代密码的密码学分析。这不是现在要做的事情,但这是密码学的起点,这也是密码分析的起点。

假设您可以浏览此密文。


Mx qeoiw wirwi xs qi xlex e lsqi-fvia epksvmxlq mw e zivc feh mhie,fyx xlivi'w sri xlmrk M'q rsx yrhivwxerhmrk。



你不穿不知道算法,不知道密钥。您应该如何开始?


分析字母频率:总长度为87个字母。我们看到i被使用了12次->〜13%。根据Wikipedia关于字母频率的文章,此字母很可能是e。我们的密文现在为:


Mx qeoew werwe xs qe xlex e lsqe-fvea epksvmxlq mw e zevc feh mhee,fyx xleve'w sre xlmrk M'q rsx yrhivwxerhmrk。



现在第二个最常见的字母是x被使用了11次->〜11%,所以很可能是t。我们的密文现在为:


Mt qeoew werwe tsqlett lsqe-fvea epksvmtlq mw e zevc feh mhee,fyt tleve'w sre tlmrk M'q rst yrhivwterhmrk。



现在我们开始看到模式。替换i->ex->t表示密钥可能是4。试试吧:


对我来说,自制算法是一个非常糟糕的主意,
,但是我不了解一件事。


阿哈!我们得到了它!现在,您已经完成了第一次密码分析。这是可以分析密文的一种方法。

#4 楼

我想这里没有人会大声说出来,所以我会。几乎不可能解密文本。唯一可行的方法是,如果密码处于替换密码的难度级别附近。

如果可以通过某种方式获得更多的密文,并且密码方式为足够长的时间,或者如果明文中有一些已知的部分可以提供帮助,那么经过足够的努力,很可能会破解该算法。

但即使如此,与这种努力相比,密码分析也需要付出很多努力从头开始创建一个简单的加密算法的过程,因此除非有充分的理由,否则不太可能有人会为此付出努力。

评论


嗯,所以最终的安全性安排是将一种众所周知的加密算法与一种自制加密算法结合在一起,对吗?因此,您将享受到两者的优点:享受了众所周知算法的安全性,但是,如果发现了漏洞,则仍然会受到自制软件的保护。没有?

–Ram Rachum
13年3月18日在20:22

如果您足够熟练地安全地组合算法而又不引入新的漏洞,那不是一个不合理的职位。如果您足够精通,另一种选择是对众所周知的算法进行微不足道的修改,并将修改保密。但是,在现实世界中,几乎可以保证您100%通过向其中添加某些内容来使情况变得更糟-加密很难,即使有时看起来并非如此。

–可以裸体
13年3月18日在20:34

如果在对称加密中,在自家算法之前或之后应用本地酿造算法,则绝不会使情况变得更糟。我认为,将自己的自酿算法应用于加密的知名算法之后(以及解密之前的知名算法之前)比应用知名算法之前的应用更好。拉姆,您在评论中所说的可能是正确的。

– Paul
2013年3月19日15:25

再举一个“通过模糊实现安全性”和“众所周知的算法”组合方法的例子:在进行加密哈希时,在数据之前或之后对数据应用注入函数(如加盐或与常数进行异或运算)如果哈希函数没有弱点,则哈希不能降低安全性。

– Paul
13年3月19日在16:41

#5 楼

如果您要分发秘密算法,为什么不分发一次性便笺呢?这样更安全。

如果您不喜欢一次性填充的想法,因为有太多数据通过网络传输,那么您为什么要假设攻击者只有一个密文? />
假设某人只有一个密文,并且没有算法(两个错误的假设),那么您脆弱但众所周知的底层加密系统可能就没有任何漏洞。

#6 楼

有几种方法。

第一种,也是最明显的是,攻击者在设法获取源代码的范围内破坏了您的服务器。在这种特定情况下,您自己开发的方案就一无是处。

第二种方法是,攻击者可能能够将自己的值提交给算法,并查看前后结果。这称为“选择的明文攻击”。好的加密方案不应容易受到攻击。

即使没有选择的明文攻击,本地方案通常也很脆弱。像您和我这样的外行可能无法理解本土计划的结果。但是,有一类非常聪明的人通常会花时间和精力来破坏这种加密方案,以换取高薪。您可能听说过,我们称它们为密码学家。

评论


@AndySmith很好。 :P编辑。

–user10211
13年3月18日在15:32

@RamRachum对不起,为什么这没用?您不能指望我告诉您如何打破每个本土计划,您可以吗?问题的症结在于本土计划薄弱,并且有非常聪明的人打破了这些计划。

–user10211
13年3月18日在15:52

@RamRachum所以您想让我针对您的算法给出一个坦率地说非常不切实际的限制的答案吗?对不起,不能做。那将是“太本地化”。只要您生活在现实世界中,我的回答就是正确的。

–user10211
13年3月18日在16:01

@Ram-保持礼貌怎么样?

–Rory Alsop♦
13年3月18日在16:28

比什么都没有更糟,因为它滋生了错误的安全感。至少,如果您没有适当的控制,那么您将继续根据该假设合理化未来的安全决策,而不是依赖您拥有比实际要好的控制的假设。

– Rushyo
13年3月18日在17:17

#7 楼


请在假设算法完全保密的前提下回答此问题,尽管在现实生活中要实现该任务有多么困难。


这个问题是忽略了Kerckhoffs的原理,该原理说加密方案的安全性不应该取决于算法的保密性。 br />

评论


这是一个原则。它旨在指导决策。实际上,这不是法律,规则或理论。

– Rushyo
13年3月18日在17:18

这是规则。

–史密斯(Smit Johnth)
13年3月18日在23:09

@Rushyo鉴于Kerckhoff的原理在现代算法中的工作情况,我会说这是事实。

–user10211
13年3月19日在2:12

@SmitJohnth要成为一条规则,那就需要承担义务。您可以将规则应用于原则(即每个人都必须遵循Kerckhoff的原则才能在该库上工作),但这并不能使该原则本身成为规则。

– Rushyo
13年3月20日在13:53

@TerryChia原则可以100%地成功应用,但仍然没有成为事实。事实是不可行的,就像原理一样。您可以遵循原则来制定原则,而不能制定事实。您无需说“为此,我们需要应用重力定律”。您确实说过“我们需要为此应用Kerckhoff原理”。有人可以选择忽略Kerckhoff的原则(后果自负)。他们不能选择忽略重力定律。

– Rushyo
2013年3月20日14:07



#8 楼

既然没有被提及,这个问题已经存在了一段时间。
计算机科学家帮助破译了18世纪秘密学会的加密文本。文字非常华丽,带有符号和标志符号。它困扰了文学专家几个世纪。技巧是猜测一些字母及其代表的意思,并猜测原始语言,因为德语的字母频率与英语或意大利语不同。
这里是密文的说明及其用法被揭露了。
http://phys.org/news/2011-10-scientist-mysterious-copiale-cipher.html
http://stp.lingfil.uu.se/~bea/copiale /
http://www.wired.com/dangerroom/2012/11/ff-the-manuscript/all/(很长,很有趣。)

使用Copiale密码,密码破解团队甚至开始不了解加密文档的语言。但是他们对整个手稿中散布的罗马和希腊字符有预感,因此他们将这些字符与抽象符号隔离开来,并将其作为真正的代码来攻击。
“花了很长时间,导致完全失败,”骑士说。在尝试了80种语言之后,加密团队意识到罗马字符是“ null”,旨在误导读者。
然后,团队检验了假设,即形状相似的抽象符号代表相同的字母或一组字母。最终,德语出现了第一个有意义的词:“启动仪式”,然后是“秘密部分”。