这是NIST公开资料公布的256位素域椭圆曲线快速约减算法描述:
p256 = (2 ^ 256) − (2 ^ 224) + (2 ^ 192) + (2 ^ 96) − 1
p256 = ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff
Routine 3.2.9 mp_mod_256 (r, a): Set r = a (mod p256 )
1: {Note: the ai are 32–bit quantities.}
2: t = ( a7 |a6 |a5 |a4 |a3 |a2 |a1 |a0 )
3: s1 = ( a15|a14|a13|a12|a11| 0 | 0 | 0 )
4: s2 = ( 0 |a15|a14|a13|a12| 0 | 0 | 0 )
5: s3 = ( a15|a14| 0 | 0 | 0 |a10|a9 |a8 )
6: s4 = ( a8 |a13|a15|a14|a13|a11|a10|a9 )
7: d1 = ( a10|a8 | 0 | 0 | 0 |a13|a12|a11 )
8: d2 = ( a11|a9 | 0 | 0 |a15|a14|a13|a12 )
9: d3 = ( a12| 0 |a10|a9 |a8 |a15|a14|a13 )
10:d4 = ( a13| 0 |a11|a10|a9 | 0 |15 |a14 )
11:d1 = 2p256 − d1
12:d2 = 2p256 − d2
13:d3 = p256 − d3
14:d4 = p256 − d4
15:r = t + 2s1 + 2s2 + s3 + s4 + d1 + d2 + d3 + d4
16:Reduce r mod p256 by subtraction of up to ten multiples of p256 .
国密算法代号SM2可以认为是NIST素域256位椭圆曲线的变种,最主要区别在于p256和b的取值。国密SM2的公开资料给出的参数为:
(y ^ 2) = (X ^ 3) + (a * x) + b mod p
p = FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
a = FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
其中a = p - 3,这表明国密SM2和NIST的256v1使用了同样特性的素域椭圆曲线公式:
(y ^2) = (X ^ 3) - (3 * x) + b mod p256
经过简单推导,得到国密SM2的p256生成公式:
p256 = (2 ^ 256) - (2 ^ 224) - (2 ^ 96) + (2 ^ 64) - 1
公开资料并没有国密SM2的快速约减算法详细描述,但只要有素数p的生成公式,很容易自行推导出来,具体推导方法详见椭圆曲线密码学的基本数学知识,下面是仿NIST风格的算法描述文本:
算法:已知正整数a,数值不大于p256的平方,求模r = a (mod p256)
1 : 注:单元长度位均为32位
2 : t = ( a7 |