2021年西北工业大学网络空间安全学院暑期夏令营
由于疫情今年大多数高校的夏令营还是线上进行的,我有幸参加西工大网安院的夏令营,并顺利拿到了优秀营员。下面对西工大夏令营情况做一下存档。
今年同去年差不多,两个题目二选一,我选择的是第一个做密钥分发和传输的一个小项目,因为去年就只给的RSA和AES完成,所以我今年就选择使用SM2和SM4完成。仅用了两三天左右的时间,所以完成的也是很一般,这篇文档主要留作纪念,仅供参考。
一、设计内容与要求:
编写一段程序,实现两个主机之间的密钥分发和安全传输。
要求:
(1)用 RSA 算法实现两个主机之间的密钥分发,分发的密钥为0x 01 23 45 67 或0x 01 23 45 67 89 AB CD EF;
(2)用分发的密钥和 AES 加密算法,实现两个主机之间的加密数据传输,测试数据是“NPU-SCS”和其他自己构造的 7 条消息;
(3)以上2 个步骤在程序中自动执行完,无手动参与;程序可以在 同一台主机上完成,但数据必须经过网络传输(可以本地发送,本地接收);
(4)密码算法必须是源码编译得到,不能直接用编译过的库文件; RSA 和 AES 算法的源码可以来自于网络或其他任意渠道;
(5)以上算法选择国密算法实现更佳;
二、基本思路与实现:
1、选择使用国密算法SM2和SM4替代RSA和AES进行加密。
2、因为分组算法SM4的密钥长度为16个字节的16进制,所以选择分发的密钥为:0x 01 23 45 67 89 AB CD EF 01 23 45 67 89 AB CD EF。
3、测试的数据信息为(共8条):
NPU-SCS
1.Today is July 7th,2021.
2.My name is Joimy DiCaprio.
3.Be about to graduate from Hebei University.
4.Major in Information Security.
5.Be Participating in the summer camp of nwpu.
6.Have a great yearning for Cyberspace Security Institute.
7.Hope to get the “excellent camper” strongly.
4、使用Python语言编写两台主机( PC1 和 PC2 )程序,利用socket 实现数据在网络中的传输,实现密钥分发和数据加密。
5、密钥的分发基于SM2算法实现,PC1 依据SM2算法生成公私密钥对,并将公钥(Px , Py)传输给PC2。PC2 利用PC1的公钥对分组密码SM4的密钥进行加密,并将加密后的密钥传输给PC1。
数据加密基于SM4算法实现,PC2利用SM4算法对8组数据进行加密并实时传输给PC1。PC1先利用自己的SM2的私钥将前面获得的加密后的SM4密钥进行解密,再对PC2传输过来的数据进行解密。最终PC1端得到了最终的8条数据。
三、设计原理与流程:
3.1 总体流程:
3.2 设计原理:
3.2.1 建立套接字连接:
(1)、套接字连接原理:
PC1,创建 Socket对象,绑定地址(host, port)到套接字,开始TCP 监听,最大连接数量为6,等待连接,利用 recv() 和 send() 函数来接和发送数据;PC2,创建Socket对象,建立与PC1的连接。利用 recv() 和 send() 函数来接收和发送数据。客户机/服务器模式 在 TCP/IP 网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式。
(2)、套接字连接流程图:
3.2.2 根据SM2算法实现密钥加密及密钥分发:
(1)、SM2算法原理:
RSA算法的危机在于其存在亚指数算法,对ECC(Elliptic Curve Cryptosystem) 算法而言一般没有亚指数攻击算法 SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较其他公钥算法所需密钥长度小很多。
(2)、SM2加密流程:
(3)、SM2解密流程:
3.2.3 根据SM4算法实现数据加密:
(1)、SM4算法原理:
国密SM4(无线局域网SMS4)算法, 一个分组算法, 分组长度为128bit, 密钥长度为128bit。加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭代运算均为一轮变换函数F。SM4算法加/解密算法的结构相同,只是使用轮密钥相反,其中解密轮密钥是加密轮密钥的逆序。
(2)、SM4算法流程:
①、参数产生
字节由8位2进制数表示,字由32位2进制数表示;S盒为固定的8bit 输入和输出置换;加密密钥长度为128bit,表示为,其中MKi (i=0,1,2,3)为字。轮密钥表示为rki(i=0,1,2…,31)为字。FK=(FK0,FK1,FK2,FK3)为系统参数,CK=(CK0,CK1 ,…,CK31)为固定参数,都为字。
②、轮函数整体的加密函数为:
其中T 为一个合成置换,由非线性变换和线性变换复合而成。非线性变换由4个平行的S盒构成,S盒的数据均采用16进制。线性变换公式如下,其中B为非线性变换得到的字。
③、密钥扩展
已知加密密钥MK = (MK0,MK1,MK2,MK3),系统参数FK=(FK0,FK1,FK2,FK3),固定参数CK=(CK0,CK1,…,CK31)。rki为轮密钥,轮密钥由加密密钥生成。
④、加密/解密过程
加密最后一轮变换时,输出为:(Y0,Y1,Y2,Y3) = R(X32,X33,X34,X35) = (X35,X34,X33, X32)
四、实验过程与运行结果:
4.1 socket网络传输连接的建立
通过socket套接字建立客户端与服务器之间的网络传输连接。当开启windows的socket后定义一系列参数,然后通过 connect() 函数建立与服务器之间的数据连接。建立连接后的运行结果如下:
当客户端与服务器建立socket套接字连接后,便可以相互发送消息,且IP地址都为环回地址127.0.0.1。
4.2 SM2算法
4.2.1 获取公私密钥对并传输
在PC1端根据SM2算法获取公私密钥对,并将公钥(Px , Py)传输给PC2。
4.2.2 利用SM2公钥进行密钥加密并分发密钥
在PC2端,根据PC1端发送来的SM2的公钥对已有的SM4_Key = “0123456789ABCDEF0123456789ABCDEF”进行加密。并将加密后的SM4_Key传输给PC1端。实现密钥加密及分发。因为SM2是非对称加密算法,因此即使攻击者截取到了加密的数据和公钥,也会因为没有私钥而无法解密,保证了密钥的安全传输。
4.2.3 SM2私钥解密
PC1端接收到PC2发送来的加密后的密钥后,利用SM2的私钥对其进行解密,得到原始SM4_Key。
4.3 SM4算法
4.3.1 SM4加密对8组消息进行加密并传输
PC2利用SM_Key以及SM4加密算法对8组消息进行加密,根据SM4加密特点,先得到加密密文分组,将分组传输给PC1端。
4.3.2 SM4解密
本程序设置为PC2端每加密一条消息就像PC1端发送一条,PC1端每接收到一条消息,就利用SM4对其进行解密。根据SM4解密特点,首先,先得到解密密文分组,进而得到原始数据。
至此,本程序基本结束了。
五、参考文献:
[1].duanhongyi.GMSSL[DB/OL].https://github.com/duanhongyi/gmssl/blob/master.
[2].yang3yen.SM4算法的实现[DB/OL].https://github.com/yang3yen/pysm4.
[3].yang3yen.SM2算法的实现[DB/OL].https://github.com/yang3yen/pysm2.
[4].huangbaoliu.SM2_SM3_SM4算法[DB/OL].https://github.com/huangbaoliu/sm2_sm3_sm4_tools/blob/master/sm_tools.py.
代码:
代码已在Github上公布:
https://github.com/JoimyDiCaprio/socket_sm2_sm4