2022_1_7_周汇报
一、进度
1.阅读参考书籍细化协议步骤
-
消息的编号或者说序列号需要递增,需要是唯一的,安全信道采用32位长度,1-2^32-1,溢出,必须停止使用现在的秘钥,接受者只会接受更大序号的消息《密码工程》P66
-
认证采用MAC,HMAC-sm3-256,输入由消息和额外的认证数据(一些上下文,用于解释消息含义,协议的标识、协议的版本号、所协商的域的长度)组成,《密码工程》P67
-
加密算法使用sm4-cbc
-
p,大素数,2000位-4000位
使用安全素数,a是素数,b=2*a+1也是素数
在2~b-2中选择一个随机数x,并计算g=x^2(mod b),检验g!=1并且g!=b-1(如果g等于这两个值,选择另外一个x重新尝试),这样产生的(b,a,g)就适用于DH协议(参考《密码工程》P123)
安全素数缺点,运算慢
---->解决:P123使用较小子群,具体实现P125,可能存在的问题P126 -
协议中的信任和风险,信任分级《密码工程》P143
-
协议顺序:IP头=>UDP头-》子协议头=》编码(TLV下的ASN.1或XML)
-
几个子协议的不同动向和运行状态,需要事件驱动编程和状态机(一个驱动和一个状态机)
-
要进行多种检查P147第一段,检查出问题,需要处理错误(原则:足够小心,泄露信息尽可能少)
-
重试:状态机里要有计数器,一定时间没收到回复就重新发送,UDP包几秒钟
-
一个密钥只使用在一个对象上
-
协议版本,需要协议转换器,暂时不考虑
-
认证的惯例P152
-
改进的DH协议最终版P155
-
内核模块的实现,参考:https://www.docin.com/p-169584129.html 中4.2;sm2,3,4实现,参考4.3
-
包处理的修改,参考4.4
-
Linux协议注册参考:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3627341
-
显示协议状态,使用消息驱动:参考:《密码工程》P166
-
包格式初步:UDP头=》子协议头(协议标识符,协议实例标识符,消息标识符{参考P167})=》消息
-
时间使用UTC时间:这只能尽最大程度避免时间的重复
-
带加密的签名《应用密码学》P30 2.7
-
连锁协议,抗中间人攻击:P35
-
或者数字签名,抗中间人攻击
-
SKEY鉴别程序,P38
-
消息鉴别,签名
-
密钥捏碎技术
-
不适用弱密钥
-
通行短语P124
-
DOD密钥产生P125
-
密钥传输过程中的纠错P128
-
端到端加密的缺点P155
-
将身份鉴别信息嵌入协议P363 21.1.4,21.1.5中FS协议
-
DH协议防中间人攻击 P369 22.2
-
协议EKE P372
-
加强的秘钥协商P374
2.整个实现思路
-
验证系统中需要注册,输入密码,生成一个UID(UID要满足整个系统的唯一性和随机性,64位)
根据UID生成sm2证书(根据密码,UTC时间以及一个随机数,证书有时间限制,一段时间后重新生成证书),根证书提前生成 -
协议:双方通信
查本地数据库(生成UID后创建相关数据库,设置密码为UID),若不存在会话密钥或者会话密钥过期
初始化DH协议,中间通过证书进行验证
。。。。。。
协商好会话密钥(会话密钥新生成,满足前项安全)后,生成加密秘钥,进行加密通信
通信完成后,结束协议通信 -
只有第一次才进行双向身份认证,后面不需要直接获取会话密钥有效期,无效则DH,有效生成加密秘钥进行通话
-
协议编译成动态库,验证系统进行加载运行
-
UDP可靠传输
实现确认机制、重传机制、窗口确认机制。
自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:
发送:包的分片、包确认、包的重发
接收:包的调序、包的序号确认(参考https://blog.csdn.net/gettogetto/article/details/76736365)
3.协议步骤
1.双向身份认证
- A生成随机数R1,发送给B
- B生成随机数R2,用B的私钥在sm2上将R1+R2签名发送给A
- A验证签名,通过A的私钥对R2签名并发送给B(A对B认证)
- B验证签名(B对A认证)
(这还得考虑一个CA服务器,存储证书)
2.公钥协商DH中的g和p(防DH的中间人攻击)
1.素数
p,大素数,2000位-4000位
使用安全素数,a是素数,b=2*a+1也是素数
在2~b-2中选择一个随机数x,并计算g=x^2(mod b),检验g!=1并且g!=b-1(如果g等于这两个值,选择另外一个x重新尝试),这样产生的(b,a,g)就适用于DH协议(参考《密码工程》P123)
安全素数缺点,运算慢
---->解决:P123使用较小子群,具体实现P125,可能存在的问题P126
2.传输
- 发起通信方A用B的公钥加密g和x发送给B
(另一种方法:连锁协议(防止中间人攻击)
A用B的公钥加密g和p,并将加密结果的一半发送给B
B用A的公钥加密g和p,并将加密结果一半发送给A
A将另一半发送给B
B用私钥解密;并将另一半发送给A
A用私钥解密(参考《应用密码学》P35)
加密算法可以用对称算法
)
3.DH协议(协商会话密钥)
- A生成随机数并将计算的x=g^ra(mod p)发送给B
- B生成随机数并将计算的y=g^rb(mod p)生成k ,把[y,Ek(Sb(x,y))]发送给A
- A计算K并将消息解密并验证签名,将Ek(Sa(x,y))发送B
B验证
(加入站间协议防止中间人攻击参考P369)
4.根据会话密钥生成加密秘钥
- 选择一个分组算法生成加密秘钥(参考P125 DOD秘钥)
5.数字信封传送消息
第一次传输可以添加验证秘钥的部分(参考P128 解密过程中的错误检测)
- A将信息用加密秘钥加密,并签名发送给B
- B验证签名,并解密
3.数据包格式
找到的格式,参考:http://icsisia.com/industry/content-2039.html
自定义协议标识 | 报文序号或时间戳 | 应答确认序号 | 首部长度 | 单元标识类型 | 功能码 | 数据 | 时间戳 | sm2签名值 | 保留字段 | END |
---|---|---|---|---|---|---|---|---|---|---|
2字节 | 4字节 | 4字节 | 1字节 | 1字节(如TCP中的ACK一类的) | 8字节 | 64字节 |
自定义协议标识,报文序号唯一标识,长度,生存时间,请求包序号,响应包序号,校验码,保留字段,数据包最大长度
二、遇到和解决的问题
协议的身份鉴别,密钥协商,数据的机密性、真实性、不可否认性保护,抗中间人攻击、重放攻击
参考《密码工程:原理与应用》、《应用密码学:协议、算法与C源程序》