2021SC@SDUSC
写了这么多篇文章,也该最后做个总结了。这学期无论是课程也好,写这些文章也好,对密码、对openssl、对gmssl都有了相应的一定的认识。作为软件工程应用与实践这门课的最后一篇文章,我将总结一下我在这学期的所学、所理解、所感悟。
关于密码
有幸认识一位公司里的前辈领导,他曾经问过我:“能用一句话概括密码吗?”我当时想了很久,感觉并没有能得到一个比较合适的答案。最后前辈告诉了我他对于密码的理解,即“让正确的的人看见正确的事”。
回去仔细想了想,前辈总结的确实非常的精炼且确切。保密性、认证、访问控制、数据完整性和不可否认性作为五大网络安全服务,密码技术都在其中扮演着非常重要的角色,也正是这五大安全服务,确保了“让正确的人看见正确的事儿”。
作为刚刚接触密码的小白,对密码的理解可以说是非常浅薄,通过课程的学习以及自己的学习,对密码学这个发展已经较为完善的安全领域的体系有了一定的认识。从古典密码、到恩格玛机、到DES AES、到RSA、到我国的SM2/3/9系列、到全同态密码、再到最先前沿的量子密码……可以看出,密码技术在上个世纪70年代左右到现在飞速发展,密码体制的整体革新,新算法的不断发明,都要归结于网络的发展与普及。Internet的发明,使得数据不再拘泥于以往的纸质形式,可以通过电缆发送到大洋彼岸,连接到你想发去的地方。数据传送的便捷性和网络基础设施的建设成本越来越低,使越来越多的人接入到世界互联网中,数据的吞吐量越来越大,用户对于隐私的要求也越来越大,于是诞生了上文所说的安全服务,而解决问题的最基础的方法就是“加密”,也就逐步诞生了安全性越来越高的密码算法。
网络传输需要遵守一系列的网络协议,将这些传输的协议与加密的技术相结合,就诞生了一种安全传输协议——SecureSocketLayer缩写SSL,即安全套接层协议。为了与编程相结合,OPENSSL开源代码应运而生。GMSSL作为集成了国密算法的开源库,在OPENSSL的基础架构上,增加了国密的算法,为国密在实际编程的应用做出了贡献。
关于OPENSSL\GMSSL
开题的时候,我和组员已经确定好了主要的分析方向。我们聚焦于SM2和SM9算法,先阅读了国家发布的国标白皮书里的内容进行密码算法的初步学习,再对下载的源代码进行逐步分析,学习他们对于具体算法步骤的代码实现。
我针对SM9所构造的公钥密码体制,初步学习了SM9的数字签名算法、密钥交换协议、密钥封装机制和加解密算法,并分析了GMSSL中具体实现的代码,细节情况可参考之前的文章。SM9算法利用了在椭圆曲线有限域上离散对数的困难性问题,构造了一个公钥密码体制。而现阶段的密码体制,对大整数大素数的使用非常频繁。而计算机对于大整数的处理,并不像对普通整数那样进行简单的加减乘除取模乘幂指数等的运算,而是需要一些算法来加快其运算速度。听了指导老师的提示后,我便转向了对于大整数运算的代码分析中去。由于GMSSL是基于OPENSSL架构的,其\crypto\bn文件夹内没有任何的文件,所以我转去了OPENSSL中分析bn文件夹内的代码。
我主要针对大整数的加减乘运算进行了相关算法的学习,然后进行了OPENSSL的代码分析,详情可以参阅之前的文章https://blog.csdn.net/m0_51588039/article/details/121341857。由于大素数在其中的重要性,我进一步分析了大素数相关的问题,包括随机数的产生、Miller-Rabin素性检测等,详情可见:https://blog.csdn.net/m0_51588039/article/details/121401846
在阅读代码分析代码的过程中,为了封装在实际问题中不同情况的不同解决方案,OPENSSL\GMSSL使用了ctx的方法来为函数传递不同的参数,来控制源代码回调不同的函数。但是由于OPENSSL\GMSSL的封装性确实做的很好,把一些参数变量都进行宏定义、进行封装,当我直接对默写具体函数进行阅读分析时,时常不是很能理解一些参数变量函数的意义。
以上主要就是这一段时间内我对GMSSL和OPENSSL的相关学习情况。我这段时间主要专注于SM9以及其他少部分的密码算法的底层代码的实现,也就是Gmssl-master\crypto和openssl-master\crypto内的文件。由于该开源代码库实在是过于庞大,对于SSL协议的实现、engine模式的引入和运行模式等我都没有进行进一步的学习份代码的分析。
关于自己
无论是一开始的GMSSL的安装与编译过程、还是后面对源代码的阅读或者对于相关算法的理解,我都多多少少遇到了一些困难。利用现有的网络资源,可以搜索到非常多的相关内容,在搜素搜到的内容中进行浏览并筛选自己认为正确的内容进行精读和学习,是我解决近期所有问题的一个基本的方法。而且,在解决问题的过程中学习,要比在课堂上把知识“硬塞给我”学到的东西更多。
在这门课的契机下,使我对密码学有了进一步较为深刻的认识,让我领略了密码的奥秘所在。由于我对密码方向有着一定的兴趣,在今后的学习中,我也会不断的对密码知识进行进一步的学习与挖掘,争取进一步掌握openssl的源码内容。学习过网络协议相关内容后,争取能做到熟练运用openssl进行编程。同时,对国密的相关其他密码算法,我也会逐步去了解一些相关的内容,学习与掌握SM系列算法。
以上就是这段时间我在学习OPENSSL\GMSSL中所领会到的内容,期望对以后想要对OPENSSL\GMSSL进行学习的小伙伴有所启发。
欢迎批评指正!