SM9学习笔记与图解(合集)

本文详细介绍了SM9密码算法的整体架构及其四大应用场景:数字签名、密钥交换、密钥封装和加解密过程。着重解释了SM9算法中各部分的具体实现流程和技术要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 整体架构

整体架构分三层(如图1):

l  接口层:提供对外接口以完成SM9功能。主要分为:

n  系统接口:主要完成KGC参与的工作。

n  功能接口:主要完成KGC不参与的工作。

l  SM9功能层:提供SM9的功能模块。主要分成:

n  主密钥生成:KGC公私钥的生成。

n  用户密钥生成:生成用户私钥,用户公钥任意设定。

n  加密和解密。

n  签名和验签。

n  密钥协商。

l  底层模块:为完成SM9功能所需的各种模块。

n  核心模块:大整数运算、椭圆曲线运算和配对运算是其中最重要也是最核心的模块,将是本次开发的难点和重点。特别是配对模块,是SM9的特色。

n  密钥导出函数KDFH1H2SM3为密码辅助函数。

n  随机数生成器PRN

整体架构

 

A.1. 系统基本功能

A.1.1 主密钥生成

主密钥生成

数字签名

密钥交换

加解密/封装

主私钥

s∈[1, N−1]

s∈[1, N−1]

s∈[1, N−1]

主私钥长

L

L

L

主公钥

Ppub=[s]P2G2

Ppub=[s]P1G1

Ppub=[s]P1G1

主公钥长

4LE(Fq2)点)

2LE(Fq)点)

2LE(Fq)点)

私钥生成函数识别符

hid,一个字节

hid,一个字节

hid,一个字节

调用库

EC- E(Fq2)

EC- E(Fq)

EC- E(Fq)

 

A.1.2 用户公私钥生成

用户公私钥生成

数字签名

密钥交换

加解密/封装

主私钥

s∈[1, N−1]

s∈[1, N−1]

s∈[1, N−1]

主私钥长

L

L

L

用户公钥

用户标识IDA

用户标识IDA

用户标识IDA

用户公钥长

任意长度

任意长度

任意长度

用户私钥

dA∈G1

t1=H1(IDA||hid, N)+s mod N,

t2=s×t1-1 mod N

dA=[t2]P1

dA∈G2

t1=H1(IDA||hid, N)+s mod N,

t2=s×t1-1 mod N

dA=[t2]P2

dA∈G2

t1=H1(IDA||hid, N)+s mod N,

t2=s×t1-1 mod N

dA=[t2]P2

用户私钥长

2LE(Fq)点)

4LE(Fq2)点)

4LE(Fq2)点)

 

 

A.2 第2部分——数字签名算法

A.2.1 签名(User A)

 


 

A.2.2 验签(User B)

 

 

A.2.3 原理

关键是考虑签名时w的生成和验签时w的生成。

签名时:

验签时

由上面推导知,签名和验签计算的w相等,所以由w计算出来的h相等。

 

A.3 第3部分——密钥交换协议

A.3.1 密钥交换(User A & User B)

 

A.3.2 原理

首先,用户A(B)私钥的生成方式为

从以上推导可知,两个用户生成的g1,g2,g3相等,所以KDF计算出来的密钥相等。

可选步骤中的Hash比较,原理很简单。

 

A.4 第4部分——密钥封装和加解密

A.4.1 密钥封装(User A)

K是用户A的生成密钥,C是封装信息,用于对方解封得到相同的密钥K。

A.4.2 密钥解封(User B)

A.4.3 密钥封装原理

从以上推导可知,双方计算出来的w相等,C是一样的,所以KDF计算值相等

A.4.4 加密(User A)

 

流加密

分组加密

klen

k1长度+k2长度

k1长度+k2长度

k1长度

M长度

对称密码算法的密钥长度

k2长度

未定义,测试向量中为256

未定义,测试向量中为256

C2

C2=K1M

C2=Enc(K1M)

 

 

A.4.5 解密(User B)

 

流加密

分组加密

klen

k1长度+k2长度

k1长度+k2长度

k1长度

C2长度

对称密码算法的密钥长度

k2长度

未定义,测试向量中为256

未定义,测试向量中为256

C2

M =K1C2

M=Enc(K1C2)

 

 


 

 

A.4.6 加解密原理

同密钥封装原理

 

 

A.4.6 加解密原理

同密钥封装原理

 

03-19
### IEEE 802.1Q VLAN Tagging Protocol Standard IEEE 802.1Q 是支持虚拟局域网(VLAN)的标准协议之一,通常被称为 Dot1q。该标准定义了一种用于以太网帧的 VLAN 标记系统以及交换机和桥接器处理这些标记帧的操作流程[^2]。 #### 协议结构概述 IEEE 802.1Q 的核心功能在于通过在以太网数据帧中插入特定字段来实现 VLAN 标签的功能。这种标签使得网络设备能够识别哪些流量属于哪个 VLAN,并据此执行转发决策。具体来说: - **Tag Header**: 在原始以太网帧头部增加了一个额外的 4 字节字段作为 VLAN 标签头。这四个字节包含了以下部分: - **Priority Code Point (PCP)**: 使用 3 比特表示优先级级别,范围从 0 到 7,主要用于 QoS 控制。 - **Canonical Format Indicator (CFI)**: 这是一个单比特位,在传统以太网环境中设置为零。 - **VLAN Identifier (VID)**: 使用 12 比特标识具体的 VLAN ID,理论上可以支持多达 4096 个不同的 VLAN(编号从 0 至 4095),其中某些特殊值保留给内部用途或管理目的。 #### 数据包处理机制 当一个带有 VLAN tag 的数据包进入支持 IEEE 802.1Q 的交换机时,它会依据此标签决定如何路由或者过滤该数据流。如果目标端口不属于同一 VLAN,则不会传输至其他无关联的物理接口上;反之亦然——只有相同 VLAN 成员之间才允许互相通信除非经过路由器跨网段访问[^1]。 此外,为了简化管理和配置过程并增强互操作性,还引入了一些辅助性的子协议和服务组件比如 GARP(通用属性注册协议)。GARP 可帮助分发有关 VLAN 成员资格的信息到各个连接节点以便动态调整其行为模式而无需频繁手动干预[^3]。 以下是创建带 VLAN TAG 的 Python 示例代码片段展示如何模拟构建这样的 Ethernet Frame: ```python from scapy.all import Ether, Dot1Q, IP, sendp def create_vlan_packet(src_mac="00:aa:bb:cc:dd:ee", dst_mac="ff:ff:ff:ff:ff:ff", vlan_id=100, src_ip="192.168.1.1", dst_ip="192.168.1.2"): ether = Ether(src=src_mac, dst=dst_mac) dot1q = Dot1Q(vlan=vlan_id) ip_layer = IP(src=src_ip, dst=dst_ip) packet = ether / dot1q / ip_layer return packet packet = create_vlan_packet() sendp(packet, iface="eth0") # Replace 'eth0' with your network interface name. ``` 上述脚本利用 Scapy 库生成包含指定源地址、目的地址及所属 VLAN 编号的数据报文并通过选定的网卡发送出去测试实际效果。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值