国密SM9标识密码算法推出好多年了,只是大概看过一些介绍,从来没有仔细研究,现在看到的频率越来越多,决定对照规范好好学习一下。国密SM9标识密码算法由国密局的密码行业标准GM/T 0044-2016《SM9标识密码算法》公布,这个标准共分五个部分:
- 第1部分:总则
- 第2部分:数字签名算法
- 第3部分:密钥交换协议
- 第4部分:密钥封装机制和公钥加密算法
- 第5部分:参数定义
Adi Shamir(RSA中的S)在1984年提出了标识密码(Identity-Based Cryptography)的概念,在标识密码系统中,用户的私钥由密钥生成中心(KGC)根据主密钥和用户标识计算得出,用户的公钥由用户标识唯一确定,从而不需要第三方保证其公钥的真实性。与基于证书的公钥密码系统相比,标识密码系统中的密钥股那里环节可以得到适当简化
定义
标识 identity
可以唯一确定一个实体身份的信息。标识应有实体无法否认的信息组成,如实体可以识别的名称、电子邮箱、身份证号码、电话号码等。
主密钥 master key
处于标识密码密钥分层最顶层的密钥,包括主私钥和主公钥,其中主公钥公开,主私钥由KGC秘密保存。<u>KGC用主私钥和用户的标识生成用户的私钥</u>。在标识密码中,主私钥一般由KGC通过随机数发生器产生,主公钥由主私钥结合系统参数产生。
签名系统的主密钥与加密系统的主密钥不同。数字签名算法属于签名系统,其主密钥为签名主密钥,密钥交换协议、密钥分装机制和公钥加密算法属于加密系统,其主密钥为加密主密钥。
密钥生成中心 key generation center;KGC
在SM9标识密码中,负责选择系统参数、生成主密钥并产生用户私钥的可信机构。
有限域和椭圆曲线
有限域
概述
域由一个非空集合F和两中运算共同组成,这两种运算分别为加法(用+表示)和乘法(用表示),并满足下列算数特性:
- a) (F, + )对于加法运算构成加法交换群,单位元用0表示。
- b) (F, )对于乘法运算构成乘法交换群,单位元用1表示。
- c) 分配律成立:对于所有的,都有。
若集合F是有限集合,则称域为有限域。有限域的元素个数称为有限域的阶。
素域
阶位素数的有限域是素域。
设p是一个素数,则整数模p的全体余数的集合关于模p的加法和乘法构成一个p阶素域,用符号 表示。
具有如下性质:
- a) 加法单位元是0
- b) 乘法单位元是1
- c) 域元素的加法是整数的模p加法,即若 ,则
- d) 域元素的乘法是整数的模p乘法,即若 ,则
有限域
设q是一个素数或者素数方幂, 是多项式环 上的一个m(m>1)次不可约多项式(称为约化多项式或域多项式),商环 是含 个元素的有限域(记为 ),称 是有限域 的扩域,域 为域 的子域,m为扩张次数。 可以看成 上的m维向量空间。 的每一个元可以唯一地写成 ,其中 ,而 是向量空间 在 上的一组基。
中的元素可以用多项式基或正规基表示。在商密规范中,一般 中的元素均采用多项式基表示。
不可约多项式 可取为首一的多项式 (其中), 中的元素由多项式环 中所有次数低于m多项式构成。多项式集合 是 在 上的一组基,称为多项式的基。域 上的任意一个元素 在 上的系数恰好构成了一个m维向量,用 表示,其中分量 。
具有如下性质:
- a) 零元0用m维向量 表示
- b) 乘法单位元1用m维向量 表示
- c) 两个域元素的加法为向量加法,各个分量用域 的加法
- d) 域元素a和b的乘法定义如下:设a和b对应的 上多项式为a(x)和b(x),则 定义为多项式 对应的向量
- e) 逆元:设a对应的 上的多项式为a(x),a的逆元 对应的 上多项式为 ,那么有 。
有限域上的椭圆曲线
有限域 上的椭圆曲线是由点组成的集合。在仿射坐标系下,椭圆曲线上点P(非无穷远点)用满足一定方程的两个域元素 和 表示, 分别称为点P的x坐标和y坐标,并记 。
定义在 上的椭圆曲线方程为:
椭圆曲线 定义为:
椭圆曲线 上的点的数目用 表示,称为椭圆曲线 的阶。
商密SM9规范中规定素数
设E和E'是定义在 上的椭圆曲线,如果存在一个同构映射 ,其中d是使映射存在的最小整数,则称E'为E的d次扭曲线。当 时,d的取值又3种情况:
- a)
- b)
- c)
椭圆曲线群
椭圆曲线 上的点按照下面的加法运算规则,构成一个交换群:
a)
b)
c)
-
d)
其中
-
e) 倍点规则:
,则
其中
椭圆曲线多倍点运算
椭圆曲线上同一个点的重复相加称为该点的多倍点运算。设u式一个正整数,P是椭圆曲线上的点,其u倍点
多倍点运算可以扩展到0倍点运算和负数倍点运算:.
椭圆曲线子群上点的验证
输入:定义 上(q为奇素数,)椭圆曲线方程的参数a、b,椭圆曲线上的子群G的阶N, 上的一堆元素(X,y)。
输出:若(x,y)是群G中的元素,则输出有效,否则输出无效。
- a) 在 上验证(x,y)是否满足椭圆曲线方程
- b) 令Q=(x,y),验证[N]Q=O
若以上任何一项验证失败,则输出无效,否则输出有效