GB/T 32918.5-2017 信息安全技术 SM2 椭圆曲线公钥密码算法 第 5 部分:参数定义
来源:GB/T 32918.5-2017 国家标准详情;封面发布日期:2017-05-12;实施日期:2017-12-01。 官方在线预览截图 SHA-256:b6ffc41f1d8079a8ff02fa63d28ae3c8f7ebb505505de42d27925d7cd870d08a。 转写说明:对照官方在线预览全部 15 页的页面图像校正文字、公式及附录 A、B、C 的测试向量;省略封面、目录、页眉、页脚和页码,合并跨页内容。附录中重复展开的拼接输入用对应的拼接公式表示。正式引用请核对原预览。
前言
GB/T 32918《信息安全技术 SM2 椭圆曲线公钥密码算法》分为 5 个部分:
- 第 1 部分:总则;
- 第 2 部分:数字签名算法;
- 第 3 部分:密钥交换协议;
- 第 4 部分:公钥加密算法;
- 第 5 部分:参数定义。
本部分为 GB/T 32918 的第 5 部分。
本部分按照 GB/T 1.1—2009 给出的规则起草。
请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任。
本部分由国家密码管理局提出。
本部分由全国信息安全标准化技术委员会(SAC/TC 260)归口。
本部分起草单位:北京华大信安科技有限公司、中国人民解放军信息工程大学、中国科学院数据与通信保护研究教育中心。
本部分主要起草人:陈建华、祝跃飞、叶顶峰、胡磊、裴定一、彭国华、张亚娟、张振峰。
引言
N. Koblitz 和 V. Miller 在 1985 年各自独立地提出将椭圆曲线应用于公钥密码系统。椭圆曲线公钥密码所基于的曲线性质如下:
- 有限域上椭圆曲线在点加运算下构成有限交换群,且其阶与基域规模相近;
- 类似于有限域乘法群中的乘幂运算,椭圆曲线多倍点运算构成一个单向函数。
在多倍点运算中,已知多倍点与基点,求解倍数的问题称为椭圆曲线离散对数问题。对于一般椭圆曲线的离散对数问题,目前只存在指数级计算复杂度的求解方法。与大数分解问题及有限域上离散对数问题相比,椭圆曲线离散对数问题的求解难度要大得多。因此,在相同安全程度要求下,椭圆曲线密码较其他公钥密码所需的密钥规模要小得多。
SM2 是国家密码管理局组织制定并提出的椭圆曲线密码算法标准。GB/T 32918 的主要目标如下:
- GB/T 32918.1—2016 定义和描述了 SM2 椭圆曲线密码算法的相关概念及数学基础知识,并概述了该部分同其他部分的关系。
- GB/T 32918.2—2016 描述了一种基于椭圆曲线的签名算法,即 SM2 签名算法。
- GB/T 32918.3—2016 描述了一种基于椭圆曲线的密钥交换协议,即 SM2 密钥交换协议。
- GB/T 32918.4—2016 描述了一种基于椭圆曲线的公钥加密算法,即 SM2 加密算法,该算法需使用 GB/T 32905—2016 定义的 SM3 密码杂凑算法。
- GB/T 32918.5—2017 给出了 SM2 算法使用的椭圆曲线参数,以及使用椭圆曲线参数进行 SM2 运算的示例结果。
1 范围
GB/T 32918 的本部分规定了 SM2 椭圆曲线公钥密码算法的曲线参数。
本部分适用于数字签名与验证(参见附录 A)、密钥交换与验证(参见附录 B)、消息加解密示例(参见附录 C)。
2 规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。
- GB/T 32905—2016 信息安全技术 SM3 密码杂凑算法
- GB/T 32918.1—2016 信息安全技术 SM2 椭圆曲线公钥密码算法 第 1 部分:总则
- GB/T 32918.2—2016 信息安全技术 SM2 椭圆曲线公钥密码算法 第 2 部分:数字签名算法
- GB/T 32918.3—2016 信息安全技术 SM2 椭圆曲线公钥密码算法 第 3 部分:密钥交换协议
- GB/T 32918.4—2016 信息安全技术 SM2 椭圆曲线公钥密码算法 第 4 部分:公钥加密算法
3 符号
下列符号适用于本文件。
p:大于 3 的素数。a, b:F_q中的元素,它们定义F_q上的一条椭圆曲线E。n:基点G的阶〔n是#E(F_q)的素因子〕。x_G:生成元的x坐标。y_G:生成元的y坐标。
4 参数定义
SM2 使用素数域 256 位椭圆曲线。
椭圆曲线方程:y² = x³ + ax + b。
曲线参数:
p = FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFFa = FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFCb = 28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93n = FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123x_G = 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7y_G = BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0
附录 A(资料性附录)数字签名与验证示例
A.1 综述
本附录选用 GB/T 32905—2016 给出的密码杂凑算法,其输入是长度小于 2^64 的消息比特串,输出是长度为 256 比特的杂凑值,记为 H_256( )。
本附录使用 GB/T 32918.2—2016 规定的数字签名算法计算得到各步骤中的相应数值。
本附录中,所有用 16 进制表示的数,左边为高位,右边为低位。
本附录中,消息采用 GB/T 1988 编码。
设 ID_A 的 GB/T 1988 编码为:31323334 35363738 31323334 35363738。ENTL_A = 0080。
A.2 SM2 椭圆曲线数字签名
椭圆曲线方程为:y² = x³ + ax + b。示例 1 为 F_p-256;其素数 p、系数 a、b、基点 G = (x_G, y_G) 及阶 n 见第 4 章。
- 待签名的消息
M:message digest M的 GB/T 1988 编码:6D65737361676520646967657374- 私钥
d_A:3945208F 7B2144B1 3F36E38A C6D39F95 88939369 2860B51A 42FB81EF 4DF7C5B8 - 公钥
P_A = (x_A, y_A):x_A:09F9DF31 1E5421A1 50DD7D16 1E4BC5C6 72179FAD 1833FC07 6BB08FF3 56F35020y_A:CCEA490C E26775A5 2DC6EA71 8CC1AA60 0AED05FB F35E084A 6632F607 2DA9AD13
- 杂凑值
Z_A = H_256(ENTL_A ∥ ID_A ∥ a ∥ b ∥ x_G ∥ y_G ∥ x_A ∥ y_A):B2E14C5C 79C6DF5B 85F4FE7E D8DB7A26 2B9DA7E0 7CCB0EA9 F4747B8C CDA8A4F3
签名各步骤中的有关值:
M̄ = Z_A ∥ M,其值为B2E14C5C 79C6DF5B 85F4FE7E D8DB7A26 2B9DA7E0 7CCB0EA9 F4747B8C CDA8A4F3 6D657373 61676520 64696765 7374。- 密码杂凑算法值
e = H_256(M̄):F0B43E94 BA45ACCA ACE692ED 534382EB 17E6AB5A 19CE7B31 F4486FDF C0D28640 - 产生随机数
k:59276E27 D506861A 16680F3A D9C02DCC EF3CC1FA 3CDBE4CE 6D54B80D EAC1BC21 - 计算椭圆曲线点
(x₁, y₁) = [k]G:x₁:04EBFC71 8E8D1798 62043226 8E77FEB6 415E2EDE 0E073C0F 4F640ECD 2E149A73y₁:E858F9D8 1E5430A5 7B36DAAB 8F950A3C 64E6EE6A 63094D99 283AFF76 7E124DF0
r = (e + x₁) mod n:F5A03B06 48D2C463 0EEAC513 E1BB81A1 5944DA38 27D5B741 43AC7EAC EEE720B3(1 + d_A)^-1:4DFE9D9C 1F5901D4 E6F58E4E C3D04567 822D2550 F9B88E82 6D1B5B3A B9CD0FE0s = ((1 + d_A)^-1 · (k - r · d_A)) mod n:B1B6AA29 DF212FD8 763182BC 0D421CA1 BB9038FD 1F7F42D4 840B69C4 85BBC1AA
消息 M 的签名为 (r, s),即上述 r 和 s。
验证各步骤中的有关值:
- 密码杂凑算法值
e′ = H_256(M̄′):F0B43E94 BA45ACCA ACE692ED 534382EB 17E6AB5A 19CE7B31 F4486FDF C0D28640 t = (r′ + s′) mod n:A756E531 27F3F43B 851C47CF EEFD9E43 A2D133CA 258EF4EA 73FBF468 3ACDA13A(x₀′, y₀′) = [s′]G:x₀′:2B9CE14E 3C8D1FFC 46D693FA 0B54F2BD C4825A50 6607655D E22894B5 C99D3746y₀′:277BFE04 D1E526B4 E1C32726 435761FB CE0997C2 6390919C 4417B3A0 A8639A59
(x₀″, y₀″) = [t]P_A:x₀″:FDAC1EFA A770E463 5885CA1B BFB360A5 84B238FB 2902ECF0 9DDC935F 60BF4F9By₀″:B89AA926 3D5632F6 EE82222E 4D63198E 78E095C2 4042CBE7 15C23F71 1422D74C
(x₁′, y₁′) = [s′]G + [t]P_A:x₁′:04EBFC71 8E8D1798 62043226 8E77FEB6 415E2EDE 0E073C0F 4F640ECD 2E149A73y₁′:E858F9D8 1E5430A5 7B36DAAB 8F950A3C 64E6EE6A 63094D99 283AFF76 7E124DF0
R = (e′ + x₁′) mod n:F5A03B06 48D2C463 0EEAC513 E1BB81A1 5944DA38 27D5B741 43AC7EAC EEE720B3
附录 B(资料性附录)密钥交换及验证示例
B.1 一般要求
本附录选用 GB/T 32905—2016 给出的密码杂凑算法,其输入是长度小于 2^64 的消息比特串,输出是长度为 256 比特的杂凑值,记为 H_256( )。
本附录使用 GB/T 32918.3—2016 规定的密钥交换协议计算得到各步骤中的相应数值。
本附录中,所有用 16 进制表示的数,左边为高位,右边为低位。
设 ID_A 的 GB/T 1988 编码为:31323334 35363738 31323334 35363738。ENTL_A = 0080。
设 ID_B 的 GB/T 1988 编码为:31323334 35363738 31323334 35363738。ENTL_B = 0080。
B.2 SM2 椭圆曲线密钥交换协议
椭圆曲线方程为:y² = x³ + ax + b。示例 1 为 F_p-256;其素数 p、系数 a、b、基点 G = (x_G, y_G) 及阶 n 见第 4 章。余因子 h = 1。
- 用户 A 的私钥
d_A:81EB26E9 41BB5AF1 6DF11649 5F906952 72AE2CD6 3D6C4AE1 678418BE 48230029 - 用户 A 的公钥
P_A = (x_A, y_A):x_A:160E1289 7DF4EDB6 1DD812FE B96748FB D3CCF4FF E26AA6F6 DB9540AF 49C94232y_A:4A7DAD08 BB9A4595 31694BEB 20AA489D 6649975E 1BFCF8C4 741B78B4 B223007F
- 用户 B 的私钥
d_B:78512991 7D45A9EA 5437A593 56B82338 EAADDA6C EB199088 F14AE10D EFA229B5 - 用户 B 的公钥
P_B = (x_B, y_B):x_B:6AE848C5 7C53C7B1 B5FA99EB 2286AF07 8BA64C64 591B8B56 6F7357D5 76F16DFBy_B:EE489D77 1621A27B 36C5C799 2062E9CD 09A92643 86F3FBEA 54DFF693 05621C4D
- 杂凑值
Z_A = H_256(ENTL_A ∥ ID_A ∥ a ∥ b ∥ x_G ∥ y_G ∥ x_A ∥ y_A):3B85A571 79E11E7E 513AA622 991F2CA7 4D1807A0 BD4D4B38 F90987A1 7AC245B1 - 杂凑值
Z_B = H_256(ENTL_B ∥ ID_B ∥ a ∥ b ∥ x_G ∥ y_G ∥ x_B ∥ y_B):79C988D6 3229D97E F19FE02C A1056E01 E6A7411E D24694AA 8F834F4A 4AB022F7
密钥交换 A₁~A₃ 步骤中的有关值:
- 产生随机数
r_A:D4DE1547 4DB74D06 491C440D 305E0124 00990F3E 390C7E87 153C12DB 2EA60BB3 - 计算椭圆曲线点
R_A = [r_A]G = (x₁, y₁):x₁:64CED1BD BC99D590 049B434D 0FD73428 CF608A5D B8FE5CE0 7F150269 40BAE40Ey₁:376629C7 AB21E7DB 26092249 9DDB118F 07CE8EAA E3E7720A FEF6A5CC 062070C0
密钥交换 B₁~B₉ 步骤中的有关值:
- 产生随机数
r_B:7E071248 14B30948 9125EAED 10111316 4EBF0F34 58C5BD88 335C1F9D 596243D6 - 计算椭圆曲线点
R_B = [r_B]G = (x₂, y₂):x₂:ACC27688 A6F7B706 098BC91F F3AD1BFF 7DC2802C DB14CCCC DB0A9047 1F9BD707y₂:2FEDAC04 94B2FFC4 D6853876 C79B8F30 1C6573AD 0AA50F39 FC87181E 1A1B46FE
x̄₂ = 2^127 + (x₂ & (2^127 - 1)):FDC2802C DB14CCCC DB0A9047 1F9BD707t_B = (d_B + x̄₂ · r_B) mod n:D0429637 F5A6D5D1 E6C54523 5169DF85 23116306 0A654ECB A0F657FD 629E8DD9x̄₁ = 2^127 + (x₁ & (2^127 - 1)):CF608A5D B8FE5CE0 7F150269 40BAE40E[x̄₁]R_A = (x_A0, y_A0):x_A0:8D62DAF7 DC084E4A 85D32214 68605854 5837BDC2 2D6E9AFE 015828A8 E1094EC2y_A0:564DC0FA 639B2967 E65F3448 CA06627E F3FE67C2 1561C5BE BB399552 29A84760
P_A + [x̄₁]R_A = (x_A1, y_A1):x_A1:85C40F88 CECA80E3 8172093F C4BA4581 88E7C58A F81CF2AF 454EC431 43E55615y_A1:8C152CB0 A131C958 C279DEBE CC6AB739 6A7BC875 FC801BB2 94C284F4 7F65F6ED
V = [h · t_B](P_A + [x̄₁]R_A) = (x_V, y_V):x_V:C558B44B EE5301D9 F52B44D9 39BB5958 4D75B903 4DD6A9FC 82687210 9A65739Fy_V:3252B35B 191D8AE0 1CD122C0 25204334 C5EACF68 A0CB4854 C6A7D367 ECAD4DE7
klen = 128,K_B = KDF(x_V ∥ y_V ∥ Z_A ∥ Z_B, klen):6C893473 54DE2484 C60B4AB1 FDE4C6E5Hash(x_V ∥ Z_A ∥ Z_B ∥ x₁ ∥ y₁ ∥ x₂ ∥ y₂):90E2A628 E4F57ABD 78339EA3 3F967D11 A154117B EA442F7B 627D4F4D D047B7F6- 选项
S_B = Hash(0x02 ∥ y_V ∥ Hash(x_V ∥ Z_A ∥ Z_B ∥ x₁ ∥ y₁ ∥ x₂ ∥ y₂)):D3A0FE15 DEE185CE AE907A6B 595CC32A 266ED7B3 367E9983 A896DC32 FA20F8EB
密钥交换 A₄~A₁₀ 步骤中的有关值:
x̄₁:CF608A5D B8FE5CE0 7F150269 40BAE40Et_A = (d_A + x̄₁ · r_A) mod n:3D68C0C0 6DC40F17 B9DDFE00 93D3C0E4 969ED112 4A187FA8 AD02F81E 3C11CCE6x̄₂:FDC2802C DB14CCCC DB0A9047 1F9BD707[x̄₂]R_B = (x_B0, y_B0):x_B0:DA68EF84 FE616D92 438BBE69 BCC52DB9 CE5CBEA9 93944CBC 331BA26D 6082E912y_B0:4831E862 898B4356 32D8FFA0 1869CD65 645822BD D3B4E9E0 46BCAB85 6F02F110
P_B + [x̄₂]R_B = (x_B1, y_B1):x_B1:FE7C111C C3E628E3 FE709DF2 E6E331CD C2A3A30E EA0CDC3C D10C0759 EAB15199y_B1:12D6F496 361948C9 EC67E603 DF93C008 86EFAEEA C591C2D5 D16B67F2 FE1AD77E
U = [h · t_A](P_B + [x̄₂]R_B) = (x_U, y_U):x_U:C558B44B EE5301D9 F52B44D9 39BB5958 4D75B903 4DD6A9FC 82687210 9A65739Fy_U:3252B35B 191D8AE0 1CD122C0 25204334 C5EACF68 A0CB4854 C6A7D367 ECAD4DE7
klen = 128,K_A = KDF(x_U ∥ y_U ∥ Z_A ∥ Z_B, klen):6C893473 54DE2484 C60B4AB1 FDE4C6E5Hash(x_U ∥ Z_A ∥ Z_B ∥ x₁ ∥ y₁ ∥ x₂ ∥ y₂):90E2A628 E4F57ABD 78339EA3 3F967D11 A154117B EA442F7B 627D4F4D D047B7F6- 选项
S₁ = Hash(0x02 ∥ y_U ∥ Hash(x_U ∥ Z_A ∥ Z_B ∥ x₁ ∥ y₁ ∥ x₂ ∥ y₂)):D3A0FE15 DEE185CE AE907A6B 595CC32A 266ED7B3 367E9983 A896DC32 FA20F8EB - 选项
S_A = Hash(0x03 ∥ y_U ∥ Hash(x_U ∥ Z_A ∥ Z_B ∥ x₁ ∥ y₁ ∥ x₂ ∥ y₂)):18C7894B 3816DF16 CF07B05C 5EC0BEF5 D655D58F 779CC1B4 00A4F388 4644DB88
密钥交换 B₁₀ 步骤中的有关值:
- 选项
S₂ = Hash(0x03 ∥ y_V ∥ Hash(x_V ∥ Z_A ∥ Z_B ∥ x₁ ∥ y₁ ∥ x₂ ∥ y₂)):18C7894B 3816DF16 CF07B05C 5EC0BEF5 D655D58F 779CC1B4 00A4F388 4644DB88
附录 C(资料性附录)消息加解密示例
C.1 一般要求
本附录选用 GB/T 32905—2016 给出的密码杂凑算法,其输入是长度小于 2^64 的消息比特串,输出是长度为 256 比特的杂凑值,记为 H_256( )。
本附录使用 GB/T 32918.4—2016 规定的公钥加密算法计算得到各步骤中的相应数值。
本附录中,所有用 16 进制表示的数,左边为高位,右边为低位。
本附录中,明文采用 GB/T 1988 编码。
C.2 SM2 椭圆曲线消息加解密
椭圆曲线方程为:y² = x³ + ax + b。示例为 F_p-256;其素数 p、系数 a、b、基点 G = (x_G, y_G) 及阶 n 见第 4 章。
- 待加密的消息
M:encryption standard M的 16 进制表示:656E63 72797074 696F6E20 7374616E 64617264- 私钥
d_B:3945208F 7B2144B1 3F36E38A C6D39F95 88939369 2860B51A 42FB81EF 4DF7C5B8 - 公钥
P_B = (x_B, y_B):x_B:09F9DF31 1E5421A1 50DD7D16 1E4BC5C6 72179FAD 1833FC07 6BB08FF3 56F35020y_B:CCEA490C E26775A5 2DC6EA71 8CC1AA60 0AED05FB F35E084A 6632F607 2DA9AD13
加密各步骤中的有关值:
- 产生随机数
k:59276E27 D506861A 16680F3A D9C02DCC EF3CC1FA 3CDBE4CE 6D54B80D EAC1BC21 - 计算椭圆曲线点
C₁ = [k]G = (x₁, y₁):x₁:04EBFC71 8E8D1798 62043226 8E77FEB6 415E2EDE 0E073C0F 4F640ECD 2E149A73y₁:E858F9D8 1E5430A5 7B36DAAB 8F950A3C 64E6EE6A 63094D99 283AFF76 7E124DF0
- 在此
C₁选用未压缩的表示形式,点转换成字节串的形式为PC ∥ x₁ ∥ y₁,其中PC为单一字节且PC = 04,仍记为C₁。 - 计算椭圆曲线点
[k]P_B = (x₂, y₂):x₂:335E18D7 51E51F04 0E27D468 138B7AB1 DC86AD7F 981D7D41 6222FD6A B3ED230Dy₂:AB743EBC FB22D64F 7B6AB791 F70658F2 5B48FA93 E54064FD BFBED3F0 BD847AC9
- 消息
M的比特长度klen = 152。 t = KDF(x₂ ∥ y₂, klen):44E60F DBF0BAE8 14376653 74BEF267 49046C9EC₂ = M ⊕ t:21886C A989CA9C 7D580873 07CA9309 2D651EFAC₃ = Hash(x₂ ∥ M ∥ y₂):59983C18 F809E262 923C53AE C295D303 83B54E39 D609D160 AFCB1908 D0BD8766- 输出密文
C = C₁ ∥ C₃ ∥ C₂:04 04EBFC71 8E8D1798 62043226 8E77FEB6 415E2EDE 0E073C0F 4F640ECD 2E149A73 E858F9D8 1E5430A5 7B36DAAB 8F950A3C 64E6EE6A 63094D99 283AFF76 7E124DF0 59983C18 F809E262 923C53AE C295D303 83B54E39 D609D160 AFCB1908 D0BD8766 21886CA9 89CA9C7D 58087307 CA93092D 651EFA
解密各步骤中的有关值:
- 计算椭圆曲线点
[d_B]C₁ = (x₂, y₂):x₂:335E18D7 51E51F04 0E27D468 138B7AB1 DC86AD7F 981D7D41 6222FD6A B3ED230Dy₂:AB743EBC FB22D64F 7B6AB791 F70658F2 5B48FA93 E54064FD BFBED3F0 BD847AC9
t = KDF(x₂ ∥ y₂, klen):44E60F DBF0BAE8 14376653 74BEF267 49046C9EM′ = C₂ ⊕ t:656E63 72797074 696F6E20 7374616E 64617264u = Hash(x₂ ∥ M′ ∥ y₂):59983C18 F809E262 923C53AE C295D303 83B54E39 D609D160 AFCB1908 D0BD8766- 明文
M′:656E63 72797074 696F6E20 7374616E 64617264,即encryption standard。
参考文献
[1] GB/T 1988—1998 信息技术 信息交换用七位编码字符集