跳转至

1708411050

密码学

IS 专业必修

课程学习内容

计算机学院开设的密码学课程主要学习:

  • 古典密码:包括替换密码(凯撒密码)、仿射密码、Vigenere 以及 Enigma,其中 Enigma 是重点内容,会有一次编程实现以及期末大题计算,也算是白洪欢老师一大特色;
  • Hash 函数:主要包括 MD5 SHA-1
  • 分组密码:包括分组密码工作模式(ECB、CBC、CFB)、流密码(主要是 RC4),重点介绍两种经典的加密算法 DES AES 的详细步骤;
  • 公钥加密算法:主要介绍 RSA ECC,以及相应的数字签名方式。

学习内容偏重于各种加密算法的细节与代码实现,以及 OpenSSL 库函数的介绍。数学原理方面都是很基本的,只有简单的初等数论和有限域(概率论部分完全不涉及),且只要求掌握一些计算性质。其他的关于信息论、密码分析、安全性、密码设计等方面都是不涉及的,如果对这方面比较感兴趣的建议选择数学科学学院冯涛老师的《计算机密码学》课程。

任课教师

2020 级为白洪欢老师和张帆老师,开设两个平行班,授课内容基本一致,张帆老师可能会多一些理论性拓展,白洪欢老师更多讲解代码而张帆老师基本不讲,考核方式完全一致,并且这门课评分没有主观因素,所以分数上没有太大差别。

白洪欢老师上课是按照他的文档进行,然后也会经常展示代码等,讲解还是很清楚的。张帆老师的 PPT 是白老师文档加上少量补充内容,上课比较沉闷。如果还是按照白洪欢老师的体系授课还是推荐白洪欢老师。

课程教材

  • 《现代密码学》(第二版)陈鲁生 沈世镒

    一本古老的中文密码学教材,内容虽然陈旧但是还算完整。白老师整体架构按照这本教材,但是内容重点等有较大区别,还是建议参考白洪欢老师个人主页上的讲义

分数构成

2021 级的密码学作业有些改变,考试也简单了非常多,具体情况如下:

  • 作业(40%)

    五次编程作业,分别是放射密码破解、Enigma 破解、MD5 CFB 综合应用、补全 AES 部分代码、调用 OpenSSL 实现 RSA 签名验证。都在 PTA 上完成,除了补全 AES 函数是函数题以外都是多文件编程题的形式,但只要求编写一个文件(可能是白老师需要多文件编程题的特性来进行评测所以选择了多文件)。时间都比较长,代码也都不复杂,白老师也会根据完成情况延 ddl、增加提示等。

  • 考试(60%)

    仍然是偏重记忆。从 21 级开始,白老师为了防止回忆卷流出,采用了机考随机分配题目的方式,可能也是因为机考所以难度低了很多。有三类题目:

    • 选择题是一些概念、算法的实现、简单计算一类的题目,难度都不大,但分值比较高;
    • 两道函数题,基本就是讲过的比较重要的算法(比如扩欧、农夫算法)的实现,靠背就可以;
    • 两道程序填空题,但 PTA 上的形式是多文件编程题,需要在给定的文件中补全空缺再交上去,好处是可以即时看到评测结果并修改。考察的也都是 RSA 实现、ECC 签名等比较简单的内容,而且小白也说过了所有要填的部分用到的函数一定会在代码中其他位置有使用过,基本上没什么难度。

    少了简答题、计算题、证明题等,难度照 20 级大大降低,大部分同学都可以取得将近满分的成绩,可以不用太担心了。

2020 级白洪欢老师和张帆老师分数构成一致,具体情况如下:

  • 作业(40%)

    一共四次编程作业,分别是实现 Enigma、重写 DES 部分函数、重写 AES 部分函数以及调用 OpenSSL 库实现 RSA ECC 的加密和解密。所有的作业都在 PTA 上完成,其中第四次是一个多文件编程(虽然实际上只有一个文件)。

  • 考试(60%)

    考试题目偏重于记忆,选择题常考密钥位数、分块块数等记忆性内容以及白洪欢老师上课讲解的 OpenSSL 库函数的功能。简答题可能考察一些填充规则,说明一些算法过程等,注意可能有手写代码,例如手写查 sbox 函数、农夫算法等作业中写过的代码。计算题顾名思义,考察内容包括 EnigmaECC 或者农夫算法的计算等。证明题每年都是四选二,包括扩展欧几里得算法、欧拉准则、中国剩余定理以及 RSA,这些内容都在白老师的文档中。

学习建议

这门课偏重于介绍算法流程,考试也偏重于记忆,相当于密码算法简介。完成作业可以在一定程度上增进对算法的理解,当然白老师的作业也是较难 debug 的,上课的细节一定要听清楚。考试难度也一般,白老师也会在最后复习的时候告知重点,考试与重点比较一致。

然而,这门课缺乏真正密码学理论与应用研究需要的知识体系,属于是犯了整个国内本科密码学课程的通病,甚至也不一定能赶上一般水平。在这门课中,白老师只少量提及密码分析的内容,关于以信息论、概率论等为基础的安全性部分以及密码学基本设计思想基本未提,导致学完所谓“密码学”后连 DES AES 为什么这么设计,安全性如何没有深刻的理解。简单的例子,DES 基于 Feistel Network,然而上课只字未提,这样如何知道 DES 为何如此设计,又为何经过看起来乱七八糟的变换能保证安全呢?又怎么知道 sbox 设计的缺陷在哪里呢?除此之外,公钥密码学部分内容比较少且陈旧,就学了两种完全不标准的加密方式(所谓教科书式的 RSA 就是最典型的例子),甚至密钥交换都没有讲,可能需要自己学习更多的知识了解认证、密钥分发等内容,这一部分甚至在计算机网络课程中都有较多介绍。总而言之课程虽然名字叫密码学,但内容完全就是简单介绍几个老掉牙的密码算法是怎么实现的,以及一些 OpenSSL 库函数怎么调用,属实配不上密码学这三个字的内涵与思想。

对密码学真正感兴趣的同学可以选择看斯坦福大学著名的 Dan Boneh 教授在 coursera 上开设的密码学(b 站有中文字幕版本),是一个完全不同于国内风格的密码学入门课程。整门课都是都是以可证明安全为核心展开的,也就是建立了安全模型,有严格的证明的真正的现代密码学思想。开头就是伪随机,PRP,PRF 等,然后非常形式化地定义各种安全模式,例如选择明文攻击、选择密文攻击等,并且对于各种密码的安全性有更准确、更形式化的讲述,而非一天到晚只会盯着那些无趣至极且没什么用的几种密码算法的具体实现,是真正的让人明白这些密码为何如此设计,为何密码会安全或者不安全,怎么用密码才是安全的。下面推荐几本教材,如果对密码学感兴趣可以进一步学习:

  • 《密码学原理与实践》(第三版)道格拉斯 R. 斯廷森

    一本经典的密码学教程,数学科学学院冯涛老师的《计算机密码学》参考本教材进行。这本书可以作为这门课的补充,因为对于原理的介绍比较完整,并且也介绍了很多密码分析、安全性的内容以及在网络安全等方面的应用,但是仍然不够现代。

  • 《现代密码学及其应用》 布拉胡特

    优点在于是机械工业翻译的教材,但起手就是抽象代数介绍数论定理,有点抽象,但内容也不是现代的,虽然确实讲得很数学,比较深入。

  • 《Introduction to Modern Cryptography》 Jonathan Katz

    如果你想入门真正的现代密码学,那么这本书一定是很好的选择,因为这本书数学并不深奥,但也是按照现代的方式展开的,能学到更为本质的思想。

如果你希望在密码学方向进一步深造,事实上还有很多适合于研究生进一步学习和研究的教材:

  • A Graduate Course in Applied Cryptography Dan Boneh and Victor Shoup

    前半部分和 Dan Boneh 的课程是对应的,因此严谨性和现代性毋庸置疑,后半部分内容也是相当丰富。

  • Fundations of Cryptography Oded Goldreich

    两卷本的巨著,论述相当严谨,因此不适合于入门,但对于提升观点加强理解很有帮助。

当然,学习深入的密码学不可或缺的有线性代数、概率论以及抽象代数的基础,前两门课正常跟上课程学习就足够,关于抽象代数可以参考相关的页面。