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源程序》

三、下周计划

1.细化数据包格式

2.研究udp如何做到可靠传输

3.开始编程实现

posted @ 2022-01-07 12:55  20181324  阅读(66)  评论(0编辑  收藏  举报