(LZMA 是一种压缩算法,不是加密算法。)
为了实现加密算法,通用方法是获取相关的描述性标准,抓住你的键盘,然后尝试。大多数标准包括“测试向量”,即让您知道您的实现是否返回正确答案的样本值。到那时,情况会有所不同,具体取决于您正在考虑的算法类型。
对称密码学:
对称算法包括对称加密、散列函数和消息认证码 (MAC)。你不需要知道太多的数学来处理这些;其中大部分是关于 32 位和 64 位整数的加法(即模运算,以2 32或2 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 来开始密码学......