我可以在哪里学习密码学/密码分析,而无需上学?有什么好书?

信息安全 密码学 密码分析 理论
2021-08-13 19:07:41

我数学不是很差:

我知道什么是 p-list 和 p-combinations,我知道矩阵代数,我知道 XOR 是什么,我知道如何判断数字是否是素数,等等:我不是因为数学不好而讨厌数学的程序员在那里,但无论如何我都没有博士学位。

我的计算机科学也不错,至少在一般计算机科学文化方面:

我知道 C、C++(都在学校学过)、python、一些 haskell、有哪些文本编码、UNICODE 是如何工作的、我知道如何压缩或加密文件、有哪些常用算法(diffie-hellman、 LZMA 算法、DES、AES、Serpent、Blowfish、SHA、MD5...)。我对维基百科或其他网站上的密码学很感兴趣,但我认为如果没有详细的算法或没有实践,维基百科就无法教我密码学;例如,我知道什么是同步加密,什么是异步(公钥/私钥)。

我想学习如何正确和安全地实现最流行的算法,以及如何使它们可靠:一本书或好的教程或课程。我很快搜索了可汗学院,但这个主题并不简单,需要数学、计算机科学和/或电子学方面的知识。

我不想阅读关于我可能已经知道或可能与当今密码学并不真正相关的基本知识的理论页面,就像研究人员写的论文,只是一些实用的,有问题和密码分析问题的东西,为学生。

我现在有很多空闲时间,我只有 26 岁,而且我确信我可以学习这些东西,不仅是因为它可以给我带来加薪,而且因为我一直对密码学着迷,但实际上并没有真正理解它,我只是找不到任何好的材料。

4个回答

(LZMA 是一种压缩算法,不是加密算法。)

为了实现加密算法,通用方法是获取相关的描述性标准,抓住你的键盘,然后尝试。大多数标准包括“测试向量”,即让您知道您的实现是否返回正确答案的样本值。到那时,情况会有所不同,具体取决于您正在考虑的算法类型。

对称密码学:

对称算法包括对称加密、散列函数和消息认证码 (MAC)。你不需要知道太多的数学来处理这些;其中大部分是关于 32 位和 64 位整数的加法(即模运算,以2 322 64作为模数)和按位运算(XOR,AND ...)。

此类代码通常用 C 语言编写。通过了解 C 编译器如何理解并将代码转换为 CPU 指令的一些概念,可以获得良好的性能。装配知识不是严格强制性的,但非常有用。一个重要的参数是缓存:循环展开通常是一个很好的工具,但如果你过度使用它,性能会急剧下降。

我建议从实现经典散列函数(SHA 系列,在FIPS 180-3中描述)开始,并尝试使它们变得更快。作为比较点,获取OpenSSL并使用命令行工具openssl speed查看可以获得什么样的性能(这个工具已经包含在任何像样的 Linux 发行版中,它也适用于 Windows 和 MacOS)。例如,在我的电脑上:

$ openssl speed sha256
Doing sha256 for 3s on 16 size blocks: 4842590 sha256's in 3.00s
Doing sha256 for 3s on 64 size blocks: 2820288 sha256's in 2.99s
Doing sha256 for 3s on 256 size blocks: 1262067 sha256's in 2.99s
Doing sha256 for 3s on 1024 size blocks: 395563 sha256's in 3.00s
Doing sha256 for 3s on 8192 size blocks: 53564 sha256's in 3.00s
OpenSSL 0.9.8o 01 Jun 2010
built on: Wed Feb 23 00:47:27 UTC 2011
options:bn(64,64) md2(int) rc4(ptr,char) des(idx,cisc,16,int) aes(partial) blowfish(ptr2) 
compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN
-DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -O3 -Wa,--noexecstack -g -Wall -DMD32_REG_T=int
-DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM
available timing options: TIMES TIMEB HZ=100 [sysconf value]
timing function used: times
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
sha256           25827.15k    60367.37k   108056.57k   135018.84k   146265.43k

这意味着 OpenSSL 包含在汇编中手动优化的 SHA-256 实现,在处理 8 kB 消息时达到 146 MB/s。在同一台机器上,纯 C 实现应该至少达到 130 MB/s。

有关如何在 C 和 Java 中实现散列函数以及如何以有意义的方式测量散列速度的示例,请参阅sphlib

之后,您可以尝试对称加密,尤其是 AES ( FIPS 197 )。知道什么是特征 2 的有限域会有所帮助,但标准足够清晰,可以指导您完成一个敷衍的实现。然后,尝试优化事物。OpenSSL 可以作为比较点,并从Brian Gladman 的 AES 实现中获得灵感. 在安全性方面,有些人担心在实现中使用查找表可能会泄露哪些密钥相关信息(尝试搜索“AES 缓存定时攻击”);尝试重现这种攻击是一个很好的练习(请注意,这并不容易,但是如果您在实验室条件下成功演示了它,那么您将学到很多关于密码实现如何工作的知识)。

非对称密码学:

非对称密码学是关于涉及多方的算法。这包括非对称加密(RSA、ElGamal)、密钥交换(Diffie-Hellman)和数字签名(又是 RSA、DSA...)。那里的数学内容要大得多,优化是一个比对称密码学更广泛的主题,因为有几种方法可以实现每种算法,而不是单一的“明显”实现路径。

椭圆曲线密码学指南是一个很好的参考虽然它主要是关于椭圆曲线的,但它包含了对有限域中操作实现的一般处理,而且恰好这是可以在上面链接的 URL 上免费下载的示例章节。所以得到它并立即阅读。另一个不可缺少的参考资料是《应用密码学手册》,可以免费下载;特别是第 14 章是关于有效实施的。

RSA 很简单,在PKCS#1中有充分的描述。可能存在对 RSA 的定时攻击,可以通过掩码来应对(是的,这是一篇“由研究人员撰写”的论文,但在密码学主题中,研究人员是了解正在发生的事情的人)。如果你掌握了模运算的窍门,你可以尝试实现 DSA ( FIPS 186-3 )。Diffie-Hellman 在数学上很简单(它只需要实现 DSA 所需的东西),但它的描述标准 (ANSI X9.42) 不能免费下载。

椭圆曲线是模运算的未来流行替代品;DSA 和 Diffie-Hellman 的 EC 变体速度更快,并且使用更短的公钥被认为更安全。但这更多的是数学。同样,椭圆曲线密码学指南是必备参考。

还有其他种类的非对称密码算法,例如McEliece密码系统(非对称加密;Niederreiter 描述的签名有一个变体基于格约简的算法但是他们(还)没有从关注实现细节的已发布标准中受益,并且没有太多现有的实现可以比较。您最好从 RSA 和 DSA 开始。

密码分析:

与实现相比,密码分析使用的数学量要高得多。

对于对称密码学,两个主要工具是差分密码分析和线性密码分析;请参阅本教程

我自己的密码学之路始于实现 DES,然后在 DES 的简化版本(8 轮而不是 16 轮)上实现 Matsui 的线性密码分析。DES 在FIPS 46-3中进行了描述,该文件已正式撤销,但仍然可用。从 DES 可以定义 Triple-DES(三个 DES 实例,具有三个不同的密钥,中间一个用于“解密”方向),并且有已发布的 Triple-DES测试向量(也称为“TDES”、“3DES” ,或者有时是“DES”,这可以说是令人困惑的)。

对于非对称算法,密码分析主要涉及研究密钥的数学结构,例如通过尝试分解大的非质整数以破解 RSA 变体。这里的数学范围从不平凡到完全无法想象,所以这可能是一个太陡峭的学习曲线,无法通过尝试破解 RSA 来开始密码学......

注册斯坦福大学将于明年 1 月开始的在线密码学课程它是免费的在线课程,包括理论(视频讲座和测验)和实践(编程作业),让您按照自己的节奏工作,如果成功,您将获得一份成就声明。鉴于我在斯坦福大学之前的在线课程中得到的各种回响,我肯定会注册这个课程(以及计算机安全课程)。

  • 在理论方面:

Niels Ferguson 和 Bruce Schneier 的密码学工程设计原则和实际应用。这本书旨在成为古老的应用密码学的更新,作者在该领域众所周知并且评论很好。

  • 在实践方面:

您可以查看各种 CTF(夺旗)黑客/安全竞赛。它们通常包括密码学挑战。它们很有趣,可以带你走出舒适区,在有限的时间内解决问题。这是一个很好的CTF 日历另外,看看以前 CTF 的一些文章,我发现很多都非常有教育意义并且解释得很好。

两件事,真的:

  1. 找一本好书。Bruce Schneier 的“应用密码学”就足够了。
  2. 学习“openssl”工具,并学习使用它们。

学习加密货币最重要的一点是谦虚。你永远不想为一个问题创造一个新的解决方案——你想尽可能地复制那些已经被其他人充分测试过的解决方案。大多数加密失败是由于人们有一个好主意,认为他们可以进行一些优化以改进现有解决方案。只有极其谦虚的人才最终成功地找到了新的做事方式。

下一个教训是,你已经忘记了你从电视和电影中获得的偏见,黑客坐在电脑前破解了加密货币。这些要么与加密无关,要么是对真实情况的戏剧化。例如,电影“运动鞋”就是对如果有人开发出一种可以分解大整数的芯片会发生什么的戏剧化。

学习加密货币最难的事情是区分一般理解该领域所必需的技术概念,以及只有在您专注于狭窄领域时才需要的技术概念。以上面评价很高的帖子为例。您需要了解“对称”算法与“非对称”算法与“哈希”之间的区别,但是当该帖子的作者说“了解特征 2 的有限域是什么”时,我不同意:它只对研究加密的博士有意义,而不是对我们其他只想弄清楚如何正确使用它的人有意义。

了解技术细节的一个好方法是选择一个目标,然后向后工作。例如,今天,Apple 将 iPhone/iPad 操作系统更新至 4.3.5 版本,以修复 X.509 证书链验证中的错误。了解问题以及他们为什么必须解决它正是您在原始帖子中讨论的那种事情。弄清楚 X.509 证书是什么,链是什么,为什么需要验证它们,以及为什么如果你不这样做,黑客使用像“sslsniff”这样的工具可以破解加密。一旦你完全理解了这一切,你就会实现你在原始帖子中描述的大部分目标。

另一个例子是关于验证 Comodo 黑客密钥的博客文章

再次了解 Comodo 黑客做了什么(为 Google 和 Yahoo 创建了签名证书)、证书吊销的工作原理以及如何使用这些工具来验证该证书。我建议将其作为一篇好文章,因为它是使用我们行业标准的“openssl”工具的一个很好的起点。

祝你好运!

对于加密算法:

斯廷森的密码学:理论与实践

以一种使它们相当容易实现的方式遍历许多加密算法的数学,如果这是你想做的。

Scheiner 的《应用密码学》也是该主题的主要书籍。可能重叠很多,但有一些不同的算法。

至于一本书明确告诉你如何实现它们——我什么都没有。在商业上,这些并不总是在软件中实现,而且它是一个相当小众的行业。从游戏的角度来看,我会说买一本解释算法的书,实现它,并将你的结果与相同算法的常用库进行比较。

同样,我对密码分析一无所知,尽管我怀疑如果你选择一种算法并在谷歌上搜索“弱点”和“弱密钥”之类的东西,你会发现一些有趣的论文和其他信息。上次我不得不写一篇关于这样的论文(10 多年前),这基本上就是我所做的......