SM2 -
1 符号和缩略语
2 素域
当
- 加法单位元是整数
; - 乘法单位元是整数
; - 域元素的加法是整数的模
加法,即若 ,则 ; - 域元素的乘法是整数的模
乘法,即若 ,则 ;
2.1 有限域上的椭圆曲线
有限域
2.1.1
定义在
椭圆曲线
椭圆曲线
2.1.2
椭圆曲线
; , ; , 的逆元素 , ;- 两个非互逆的不同点相加的规则:
点 , ,且 ,设 ,则 其中 - 倍点规则:
设 ,且 , ,
则 其中
2.2 素域
设
——加法:设
——乘法:设
记
2.3
2.3.1 概述
2.3.2 仿射坐标表示
当
; , ; , 的逆元素 , ;- 点
, , ,则 其中
2.3.3 射影坐标表示
2.3.3.1 标准射影坐标系
当
若
若
标准射影坐标系下,
; , ; , 的逆元素 , 且 ;- 设点
, , ,
若 ,则:
, , , , , , , , , , , , , ;
若 ,则:
, , , , , , , , 。
2.3.3.2 Jacobian加重映射坐标系
若
若
Jacobian加重射影坐标系下,
; , ; , 的逆元素 , 且 ;- 设点
, , ,
若 ,则:
, , , , , , , , , , ;
若 ,则:
, , , , , 。
2.4
若一条曲线的阶
3 椭圆曲线多倍点运算
3.1 概述
设
3.2 椭圆曲线多倍点运算的实现
椭圆曲线多倍点运算的实现有多种方法,这里给出三种方法,以下都假设
算法一:二进制展开法
输入:点
输出:
- 置
; 从 下降到 执行:
2.1. ;
2.2. 若 ,则 ;- 输出
。
算法二:加减法
输入:点
输出:
- 设
的二进制表示是 ,其中最高位 为 ; - 设
的二进制表示是 ,显然 或 ; - 置
; - 对
从 下降到 执行:
4.1. ;
4.2. 若 ,且 ,则 ;
4.3. 若 ,且 ,则 ; - 输出
。
算法三:滑动窗法
输入:点
输出:
设窗口长度
预计算
, ; 从 到 计算 ;- 置
, 。
主循环
- 当
执行:
4.1. 若 ,则 , ;
4.2. 否则
4.2.1. 令 是使 且 的最小整数;
4.2.2. ;
4.2.3. ;
4.2.4. 置 ; - 输出
。
4
椭圆曲线系统参数是可以公开的,系统的安全性不依赖于对这些参数的保密。
4.1
- 域的规模
, 为大于 的素数; - (选项)一个长度至少为192的比特串
; 中的两个元素 和 ,它们定义椭圆曲线 的方程: ;- 基点
, ; - 基点
的阶 (要求: 且 ); - (选项)余因子
。
4.2
椭圆曲线系统参数的生成者应验证下面的条件。椭圆曲线系统参数的用户可以选择验证这些条件。
输入:
输出:若椭圆曲线系统参数是有效的,则输出“有效”;否则输出“无效”。
- 验证
是奇素数(参见4.3节); - 验证
、 、 和 是区间 中的整数; - 若按照4.4节描述的方法拟随机产生椭圆曲线,验证
是长度至少为192的比特串,且 , 由 派生得到; - 验证
; - 验证
; - 验证n是素数,
且 (参见4.3节); - 验证
; - (选项)计算
,并验证 ; - 验证抗MOV攻击条件和抗异常曲线攻击条件成立(参见4.6.1和4.6.2节);
- 若以上任何一个验证失败,则输出“无效”;否则,输出“有效”。
4.3 概率素性检查
输入:一个大的奇数
输出:“概率素数”或“合数”。
- 计算
和奇数 ,使得 ; - 对
从 到 执行:
2.1. 在区间 中选取随机数 ;
2.2. 置 ;
2.3. 若 或 ,转到步骤2.6;
2.4. 对 从 到 执行:
2.4.1. 置 ;
2.4.2. 若 ,转到步骤2.6;
2.4.3. 若 ,输出“合数”并终止;
2.4.4. 下一个 ;
2.5. 输出“合数”,并终止;
2.6. 下一个 ; - 输出“概率素数”。
若算法输出“合数”,则
4.4
方式1:
输入:素域的规模
输出:比特串
- 任意选择长度至少为192的比特串
; - 计算
,并记 ; - 置
; - 置
; - 任意选择
的元素 和 ,使 ; - 若
,则转步骤1; - 所选择的
上的椭圆曲线为 ; - 输出
。
方式2:
输入:素域的规模
输出:比特串
- 任意选择长度至少为192的比特串
; - 计算
,并记 ; - 置
; - 置
; - 置
; - 取
中的元素 为某固定值; - 若
,则转步骤1; - 所选择的
上的椭圆曲线为 ; - 输出
。
4.5
方式1
输入:比特串
输出:输入参数“有效”或“无效”。
- 计算
,并记 ; - 置
; - 置
; - 若
,则输出“有效”;否则输出“无效”。
方式2
输入:比特串
输出:输入参数“有效”或“无效”。
- 计算
,并记 ; - 置
; - 置
; - 若
,则输出“有效”;否则输出“无效”。
4.6 安全椭圆曲线满足的条件
4.6.1 抗MOV攻击条件
A. Menezes、T. Okamoto、S. Vanstone、G. Frey和H. Rück的约化攻击将有限域
在验证抗MOV攻击条件之前,必须选择一个MOV阈,它是使得求取
下述算法用于验证椭圆曲线系统参数是否满足抗MOV攻击条件。
输入:MOV阈
输出:若
- 置
; - 对
从 到 执行:
2.1. 置 ;
2.2. 若 ,则输出“错误”并结束; - 输出“正确”。
4.6.2 抗异常曲线攻击条件
设
下述是否用于验证椭圆曲线系统参数是否满足抗异常曲线攻击条件。
输入:
输出:若
- 若
,则输出“错误”;否则输出“正确”。
5 密钥对的生成与公钥的验证
5.1 密钥对的生成
输入:一个有效的
输出:与椭圆曲线系统参数相关的一个密钥对
- 用随机数发生器产生整数
; 为基点,计算点 ;- 密钥对是
,其中 为私钥, 为公钥。
5.2
输入:一个有效的
输出:对于给定的椭圆曲线系统参数,若公钥P是有效的,则输出“有效”;否则输出“无效”。
- 验证
不是无穷远点 ; - 验证公钥
的坐标 和 是域 中的元素(即验证 和 是区间 中的整数); - 验证
; - 验证
; - 若通过了所有验证,则输出“有效”;否则输出“无效”。
6 曲线示例:
椭圆曲线方程为:
示例1:
素数 |
BDB6F4FE | 3E8B1D9E | 0DA8C0D4 | 6F4C318C | EFE4AFE3 | B6B8551F |
系数 |
BB8E5E8F | BC115E13 | 9FE6A814 | FE48AAA6 | F0ADA1AA | 5DF91985 |
系数 |
1854BEBD | C31B21B7 | AEFC80AB | 0ECD10D5 | B1B3308E | 6DBF11C1 |
坐标 |
4AD5F704 | 8DE709AD | 51236DE6 | 5E4D4B48 | 2C836DC6 | E4106640 |
坐标 |
02BB3A02 | D4AAADAC | AE24817A | 4CA3A1B0 | 14B52704 | 32DB27D2 |
阶 |
BDB6F4FE | 3E8B1D9E | 0DA8C0D4 | 0FC96219 | 5DFAE76F | 56564677 |
示例2:
素数 |
8542D69E | 4C044F18 | BF6FF7DE | 6F4C318C | 45728391 | 5C45517D | 722EDB8B | 08F1DFC3 |
系数 |
787968B4 | FA32C3FD | 2417842E | 73BBFEFF | 2F3C848B | 6831D7E0 | EC65228B | 3937E498 |
系数 |
63E4C6D3 | B23B0C84 | 9CF84241 | 484BFE48 | F61D59A5 | B16BA06E | 6E12D1DA | 27C5249A |
坐标 |
421DEBD6 | 1B62EAB6 | 746434EB | C3CC315E | 32220B3B | ADD50BDC | 4C4E6C14 | 7FEDD43D |
坐标 |
0680512B | CBB42C07 | D47349D2 | 153B70C4 | E5D7FDFC | BFA36EA1 | A85841B9 | E46E09A2 |
阶 |
8542D69E | 4C044F18 | E8B92435 | BF6FF7DD | 29772063 | 0485628D | 5AE74EE7 | C32E79B7 |
7 SM2椭圆曲线公钥密码算法的参数定义
SM2使用素数域256位椭圆曲线。
椭圆曲线方程:
曲线参数:
FFFFFFFE | FFFFFFFF | FFFFFFFF | FFFFFFFF | FFFFFFFF | 00000000 | FFFFFFFF | FFFFFFFF | |
FFFFFFFE | FFFFFFFF | FFFFFFFF | FFFFFFFF | FFFFFFFF | 00000000 | FFFFFFFF | FFFFFFFC | |
28E9FA9E | D9F5E34 | 4D5A9E4B | CF6509A7 | F39789F5 | 15AB8F92 | DDBCBD41 | 4D940E93 | |
FFFFFFFE | FFFFFFFF | FFFFFFFF | FFFFFFFF | 7203DF6B | 21C6052B | 53BBF409 | 39D54123 | |
32C4AE2C | 1F198119 | 5F990446 | 6A39C994 | 8FE30BBF | F2660BE1 | 715A4589 | 334C74C7 | |
BC3736A2 | F4F6779C | 59BDCEE3 | 6B692153 | D0A9877C | C62A4740 | 02DF32E5 | 2139F0A0 |
参考
GM/T 0003.1—2012
GM/T 0003.5—2012
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 想让你多爱自己一些的开源计时器
· 大模型 Token 究竟是啥:图解大模型Token
· 用99元买的服务器搭一套CI/CD系统
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争