隐式证书
阅读本文需要PKI知识,全文大概需要15分钟。
最近在做V2X领域的项目,接触到一个概念叫隐式证书,看介绍这种证书里面没有数字签名,也不含有公钥。我很好奇它是怎么做到的,于是就搜索了一下,发现中文资料非常少。查阅了几篇英文资料,最终弄明白了它的原理,写出来跟大家一起分享。
隐式证书全称是Elliptic Curve Qu-Vanstone Implicit Certificate (ECQV)
,看名字就知道,里面涉及椭圆曲线。所以要弄懂隐式证书的原理,需要先了解些椭圆曲线加密(ECC)的知识。
1. 椭圆曲线加密(ECC)
ECC加密是基于有限域上的椭圆曲线点群的离散对数难题(ECDLP),ECDLP是比因子分解问题更难的问题,它是指数级的难度。
这都说的是毛线啊,是不是一脸懵圈^-^。其实ECC加密原理挺易懂的,下面我会尽量简化,只讲原理,用中学范畴的知识解读ECC加密,并不涉及高等数学的推导。
1.1 什么是椭圆曲线
一条椭圆曲线就是一组被 y2=x3+ax+by2=x3+ax+b 定义且满足 4a3+27b2≠04a3+27b2≠0 的点集。4a3+27b2≠04a3+27b2≠0 这个限定条件是为了保证曲线不包含奇点。
随着aa和bb的不同,椭圆曲线会在平面上呈现出不同的形状,但它还是很容易辨认的,椭圆曲线始终是关于xx轴对称的(y2y2开方后,会有正负两个解)。
1.2 什么是群(Group)
在一个集合上定义一个二元运算,并且运算满足封闭性、结合律、有单位元、有逆元四个条件,就是群。
比如, 集合ℚ≠∅Q≠∅, 若在ℚQ上存在二元运算:加法 (并不是通常意义上的加法,可以理解为一个函数 f(a,b)f(a,b)),满足:
1. 封闭性:如果 a,ba,b 被包含于ℚQ,那么 a+ba+b 也一定是ℚQ的元素。
2. 结合律:(a+b)+c=a+(b+c)(a+b)+c=a+(b+c)
3. 单位元:存在一个元素 uu,使得 a+u=u+a=aa+u=u+a=a
4. 有逆元:存在一个元素 a′a′,使得 a+a′=ua+a′=u
则称(ℚ,+)(Q,+)为一个群,或加法群。若再满足交换率,这个群就叫阿贝尔群。
5. 交换率:a+b=b+aa+b=b+a
从我们通常的加法概念来看,整数集ℤZ是一个群(而且是一个阿贝尔群)。自然数集ℕN不是一个群,因为它不满足第4条。群是非常好的,一但符合这四个条件,那么我们可以直接使用基于群的数学规则。
1.3 椭圆曲线上的群
考虑一个问题,已知椭圆曲线上的两个点PP和QQ,P+QP+Q 的结果是什么?
已知过椭圆曲线PP和QQ两点的直线,与椭圆曲线相交于RR,可得RR的对称点(相反数)−R−R,则我们可以定义一个二元运算规则:点加法,让 P+Q=−RP+Q=−R。有了椭圆曲线上点的集合,又定义了二元运算,这就构成了椭圆曲线上的群。
延伸知识:如果过PP和QQ的直线与YY轴平行呢?比如QQ是PP的相反数(Q=−PQ=−P),则 P+Q=P+(−P)=0P+Q=P+(−P)=0。因为永远也不与椭圆曲线相交,可以认为00点(单位元)在无穷远处。
1.4 标量积
如果 Q=PQ=P,那么 P+Q=P+P=2PP+Q=P+P=2P。2P2P的值是多少呢?当QQ点逐渐接近PP点,穿过两点的直线将会和曲线相切,2P2P的值是切线和椭圆曲线相交点RR的相反数−R−R。
这样除了加法,我们在群上定义了另一个运算:标量积(数乘)
nP=P+P+⋯+Pn timesnP=P+P+⋯+P⏟n times
为了计算nPnP,我们其实并不需要执行n−1n−1次加法,可以使用倍加算法加速计算过程。比如计算4P4P,我们只需要执行两次加法运算:第一次计算 P+P=2PP+P=2P,第二次计算 2P+2P=4P2P+2P=4P。举个更明显的例子,我们计算151P151P只用了7次倍乘和4次加法。
151151P=1⋅27+0⋅26+0⋅25+1⋅24+0⋅23+1⋅22+1⋅21+1⋅20=27+24+22+21+20=27P+24P+22P+21P+20P151=1⋅27+0⋅26+0⋅25+1⋅24+0⋅23+1⋅22+1⋅21+1⋅20=27+24+22+21+20151P=27P+24P+22P+21P+20P
延伸知识:当 P≠QP≠Q,但是没有第三点RR时,P+QP+Q 的结果是多少呢?事实上,这种情况就是一条过PP和QQ的直线,与椭圆曲线相切,这与上图P+P=2PP+P=2P的情况是一样的。P+Q=−P or −QP+Q=−P or −Q,这里假设PP是切点
P+PQ∴P+Q=−Q=−2P=P+(−2P)=−PP+P=−QQ=−2P∴P+Q=P+(−2P)=−P
1.5 数学求解RR点
说了这老半天了,到底如何进行求解RR点呢?上面几何意义上的点加法,可以转化为方程:已知椭圆曲线(E)(E)上的两点P(xP,yP)P(xP,yP)和Q(xQ,yQ)Q(xQ,yQ),求过这两点的直线(L)(L)和椭圆曲线的交点R(xR,yR)R(xR,yR)。这是个一元三次方程,我们来一步步推导下:
y2ywheremormn=x3+ax+b=mx+n=yQ−yPxQ−xP(P≠Q)=3x2P+a2yP(P=Q)=yP−mxP=yQ−mxQ(E)(L)(1)(2)(E)y2=x3+ax+b(L)y=mx+n(1)wherem=yQ−yPxQ−xP(P≠Q)(2)orm=3xP2+a2yP(P=Q)n=yP−mxP=yQ−mxQ
当 P=QP=Q 时,不能通过简单的Δy / ΔxΔy / Δx求斜率, 因为除数ΔxΔx此时为零,所以我们需要通过偏导求斜率
dE(xP,yP)dxdE(xP,yP)dy∴m=3x2p+a=2yp=3x2P+a2yP(2)dE(xP,yP)dx=3xp2+adE(xP,yP)dy=2yp(2)∴m=3xP2+a2yP
当(E)(E)和(L)(L)相交时,交点的x,yx,y坐标相同,所以
(mx+n)2(mx+yP−mxP)2(m(x−xP)+yP)2m2(x−xP)2+2m(x−xP)yP+y2Pm2(x2−2xxP+x2P)+2mxyP−2mxPyP+y2Pm2x2−(2m2xP−2myP)x+(m2x2P−2mxPyP+y2P)x3+(−m2)x2+(a+2m2xP−2myP)x+(b−(mxP−yP)2)=x3+ax+b=x3+ax+b=x3+ax+b=x3+ax+b=x3+ax+b=x3+ax+b=0(3)(mx+n)2=x3+ax+b(mx+yP−mxP)2=x3+ax+b(m(x−xP)+yP)2=x3+ax+bm2(x−xP)2+2m(x−xP)yP+yP2=x3+ax+bm2(x2−2xxP+xP2)+2mxyP−2mxPyP+yP2=x3+ax+bm2x2−(2m2xP−2myP)x+(m2xP2−2mxPyP+yP2)=x3+ax+b(3)x3+(−m2)x2+(a+2m2xP−2myP)x+(b−(mxP−yP)2)=0
为了快速求解这个方程,这里引入一个定理,韦达定理。已知 f(x)=anxn+an−1xn−1+⋯+a1x+a0 (an≠0)f(x)=anxn+an−1xn−1+⋯+a1x+a0 (an≠0),根据代数的基本原理可知f(x)f(x)有nn个根:x1,x2,⋯,xnx1,x2,⋯,xn,则依据韦达定理下列等式成立:
x1+x2+⋯+xnx1x2⋯xn=−an−1an=(−1)na0an(4)(5)(4)x1+x2+⋯+xn=−an−1an(5)x1x2⋯xn=(−1)na0an
二阶韦达定理大家初中都学过:已知 f(x)=ax2+bx+cf(x)=ax2+bx+c,则:
x1+x2x1⋅x2=−b+b2−4ac‾‾‾‾‾‾‾‾√2a+−b−b2−4ac‾‾‾‾‾‾‾‾√2a=−ba=−b+b2−4ac‾‾‾‾‾‾‾‾√2a×−b−b2−4ac‾‾‾‾‾‾‾‾√2a=cax1+x2=−b+b2−4ac2a+−b−b2−4ac2a=−bax1⋅x2=−b+b2−4ac2a×−b−b2−4ac2a=ca
这里我来做推导一下三阶韦达定理,更高阶韦达定理可以同理按照归纳法推导。
已知 f(x)=a3x3+a2x2+a1x+a1f(x)=a3x3+a2x2+a1x+a1存在三个根x1,x2,x3x1,x2,x3,则:(x−x1)(x−x2)(x−x3)a(x−x1)(x−x2)(x−x3)a(x2−(x1+x2)x+x1x2)(x−x3)a(x3−(x1+x2)x2+x1x2x−x2x3+(x1+x2)xx3−x1x2x3)a(x3−(x1+x2+x3)x2+(x1x2+x1x3+x2x3)x−x1x2x3)And∵f(x)=a3x3+a2x2+a1x+a1=0=0=0=0=0=0(A)(B)(x−x1)(x−x2)(x−x3)=0a(x−x1)(x−x2)(x−x3)=0a(x2−(x1+x2)x+x1x2)(x−x3)=0a(x3−(x1+x2)x2+x1x2x−x2x3+(x1+x2)xx3−x1x2x3)=0(A)a(x3−(x1+x2+x3)x2+(x1x2+x1x3+x2x3)x−x1x2x3)=0(B)And∵f(x)=a3x3+a2x2+a1x+a1=0
对比(A)和(B)的系数即得:x1+x2+x3x1x2x3=−a2a3=(−1)3a0a3x1+x2+x3=−a2a3x1x2x3=(−1)3a0a3
(E)(E)和(L)(L)相交与三个点P,Q,RP,Q,R,所以方程(3)存在三个解, 带入韦达定理(4)可知:
xP+xQ+xRxRyR=−an−1an=−(−m2)1=m2=m2−xP−xQ=m(xR−xP)+yP(6)(7)xP+xQ+xR=−an−1an=−(−m2)1=m2(6)xR=m2−xP−xQ(7)yR=m(xR−xP)+yP
在已知点PP和QQ坐标情况下,应用公式(6)和(7)可以快速求解RR的坐标。
1.6 离散难题
我们在椭圆曲线的群上定义了加法、减法(转化为 +(−P)+(−P))、乘法(数乘),但是我们并没有定义除法运算。已知nn和PP,求nPnP是个简单的操作,但是已知nPnP和PP,求nn是个很难的过程。如下图所示,可以看到随着nn的增大,nPnP在平面内成离散无规律的分布,无法根据nPnP的位置快速反向推导出nn,要求解nn需要n−1n−1次暴力尝试(此时不知道确切的nn,不能用倍加算法加速)。
求nn这个问题,就是椭圆曲线中大名鼎鼎的离散对数问题,它被认为是个很难很难的问题!到目前为止,没有找到一个能在多项式时间内求解出来的算法,也是为什么ECC安全的原因。这里PP是事先协商好的ECC参数, 这个nn就是私钥,这个nPnP就是公钥。
实际使用过程中,为了使(P,nP)(P,nP)的(x,y)(x,y)坐标都保持整数,所以运算过程中需要对每步运算取模pp,构成整数域(集合)𝔽pFp,它的形式是点集。取模pp意味着域中最多有p−1p−1个元素,所以叫有限整数域。(模pp需要取一个素数,否则没有乘法逆元,关于乘法逆元后面会介绍)
{(x,y)∈(𝔽p)2 | y2≡x3+ax+b (mod p), 4a3+27b2≢0 (mod p)} ∪ {0}{(x,y)∈(Fp)2 | y2≡x3+ax+b (mod p), 4a3+27b2≢0 (mod p)} ∪ {0}
这里的点PP通常用字母GG表示,它有个专有名字叫做生成点(generating point)。对于指定的GG,可以从𝔽pFp筛选出一个由(G,2G,⋯,nG,⋯)(G,2G,⋯,nG,⋯)构成的子域,即由GG生成的子域。这个子域及其点加运算叫做椭圆曲线的子群,子群中元素的个数叫做子群的阶(order)。如果pp是素数,由拉格朗日定理可知子群的阶也是素数。在这个子群上只能进行基于GG的点加和数乘运算。这里就不详细展开了,有兴趣的读者可以参考附录中的文章。
ECC有趣的地方在于,它的离散问题比其他密码学中的离散问题难多了。这意味着我们可以用更少的位数的nn做到和其他加密算法一样安全级别的加密强度[08]。
ECC key sizes | RSA key sizes |
---|---|
160 | 1024 |
224 | 2048 |
256 | 3072 |
384 | 7680 |
512 | 15360 |
其他的非对称算法(RSA、DSA、ElGamal)使用的是模幂运算而不是数乘运算,模幂运算的离散对数问题可以简述为:当我们知道aa和bb,b=an mod pb=an mod p,那么如何求nn? 模运算比数乘运算,运算量要高一个数量级,这意味着ECC比其他非对称算法更快。
2 椭圆曲线加密(ECC)的经典应用
椭圆曲线加密(ECC)通常被用来密钥协商(ECDH)和数字签名(ECDSA),广泛应用于安全通信、数据防篡改等领域。
2.1 密钥协商(ECDH)
为了安全通信,我们通常需要解决的是中间人窃听(MITM)问题。AA和BB想要通信,信道并不安全,中间人MM可能会窃听消息,所以需要在通信之初,首先在不安全的信道上协商出通信密钥(通常是对称密钥),后续通讯使用此通信密钥进行加密。在协商过程中要保证,即使中间人MM能窃取所有通信数据,也无法计算出通信密钥。那么ECDH是怎么办到的呢?
- AA和BB生成各自的公钥和私钥(QA,dA)(QA,dA)和(QB,dB)(QB,dB),其中QA=dA×G, QB=dB×GQA=dA×G, QB=dB×G。
- AA和BB通过不安全信道交换各自的公钥QA,QBQA,QB,MM可以窃听到QA,QBQA,QB,但是无法推算出dA,dBdA,dB。
- AA和BB各自计算通讯密钥K(xK,yK)K(xK,yK)。
KAKB∴KA=dA×QB=dA×(dB×G)=dA×dB×G=dB×QA=dB×(dA×G)=dA×dB×G=KBKA=dA×QB=dA×(dB×G)=dA×dB×GKB=dB×QA=dB×(dA×G)=dA×dB×G∴KA=KB
- 中间人MM只知道QA,QBQA,QB,无法计算出通讯密钥KK。
- 现在AA和BB已经获得通信密钥K(xK,yK)K(xK,yK),他们可以取xKxK或yKyK作为对称密钥加密通信数据,安全通信了。
ECC算法有个前提,就是AA和BB需要使用同样的a,b,Ga,b,G等参数,这些参数有个专用名词叫domain parameters,包括(p,a,b,G,n,h)(p,a,b,G,n,h),其中pp是素数模,nn是子群的阶,hh是子群的辅助因子。下面看一个ECDH域参数的实际例子:
p p = xffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f
a a = 0
b b = 7
xGxG = 0x79be667e f9dcbbac 55a06295 ce870b07 029bfcdb 2dce28d9 59f2815b 16f81798
yGyG = 0x483ada77 26a3c465 5da4fbfc 0e1108a8 fd17b448 a6855419 9c47d08f fb10d4b8
n n = 0xffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141
h h = 1
2.2 数字签名(ECDSA)
为了理解ECDSA,需要先了解一个概念乘法逆元。若两个数a,pa,p互质,则一定存在另一个数bb,使得 ab≡1(modp)ab≡1(modp),此时称bb为aa的关于模pp的乘法逆元。比如 5×3≡1(mod14)5×3≡1(mod14),我们称此时的3为5关于模14的乘法逆元。
已知一个整数aa,如何快速求其的乘法逆元呢?根据费马小定理,如果pp是一个素数,而整数aa不是pp的倍数,则下列等式成立。(这也是为什么上面要求模pp是素数的原因)
ap−1∴a×ap−2≡1(modp)≡1(modp)ap−1≡1(modp)∴a×ap−2≡1(modp)
我们可以用快速幂求出ap−2ap−2,即求出aa的乘法逆元,乘法逆元通常记做a−1a−1。
为了保证数据没有被篡改,一般是对数据的散列值HH进行私钥加密(签名);接收端接收到数据后,重新散列值H′H′, 并用公钥解密签名值得到HH,比较H′H′和HH是否相等,来判断数据是否篡改。其本质跟笔迹中的签字画押一样,用外人不可伪造的私钥书写一个独有的画押。那么ECDSA是如何签字画押的呢?(这里只关注原理,省略无关紧要的细节)
- 选择一个随机数kk,计算 T(xT,yT)=k×GT(xT,yT)=k×G (其本质是生成一对临时密钥),让 r=xT mod nr=xT mod n (nn是子群的阶)。
- 计算s=k−1×(H+r×dA) mod ns=k−1×(H+r×dA) mod n,这里 (r,s)(r,s) 就是签名。
- 验签时计算T′T′,如果xT′ mod n=rxT′ mod n=r,则表明没有篡改。
T′∵sk×s−1×s∴kif H′=H, ref(8)(9):T′∴xT′ mod n=s−1×(H′×G+r×QA) mod n=s−1×(H′×G+r×dA×G) mod n=s−1×(H′+r×dA)×G mod n=k−1×(H+r×dA) mod n=k×s−1×k−1×(H+r×dA) mod n=s−1×(H+r×dA) mod n=k×G mod n=r(8)(9)T′=s−1×(H′×G+r×QA) mod n=s−1×(H′×G+r×dA×G) mod n(8)=s−1×(H′+r×dA)×G mod n∵s=k−1×(H+r×dA) mod nk×s−1×s=k×s−1×k−1×(H+r×dA) mod n(9)∴k=s−1×(H+r×dA) mod nif H′=H, ref(8)(9):T′=k×G mod n∴xT′ mod n=r
- 由于攻击者无法得知签名私钥dAdA,所以无法伪造签名,签名的权威性得到保障。
对模运算和乘法逆元不熟悉?这里提供个更一般的概念解读。
1. 计算 S=(H+dA)×GS=(H+dA)×G,这里SS就是签名。
2. 验证签名时,分别计算S′S′,如果S′S′和SS相等,则表明没有篡改SS′=(H+dA)×G=H′×G+QA=H′×G+dA×G=(H′+dA)×GS=(H+dA)×GS′=H′×G+QA=H′×G+dA×G=(H′+dA)×G
3 隐式证书(ECQV)
证书究其本质是建立身份和公钥之间的绑定关系,这个关系被权威机构(CA)采用数字签名或等同的密码学技术担保。(A certificate establishes a link between an identity and a public key; the link is "guaranteed" by a Certification Authority with some sort of digital signature or another similar cryptographic binding.[15] 这段英文描述的太好了,我要把放上来^_^)
大家比较熟悉的是显示证书(Explicit Certificates),比如常见的X.509证书。那么什么是隐式证书呢?隐式两个字如何理解呢?
3.1 隐式证书概述
隐式证书是一种公钥证书,是一种通用目的PKI证书方案。相比于传统的X.509证书,它特别适合资源受限场景(带宽、算力、存储空间等),为用户提供数字身份凭证。
隐式证书涉及三个实体:证书申请者UU,权威机构CACA,证书验证者VV。UU从CACA处获得隐式证书,证明UU的身份,并且允许VV获得UU的公钥。与传统证书不同的是:
1. 隐式证书中并不直接含有CACA的数字签名
2. 隐式证书中并不直接含有UU的公钥,必须经过运算才能得出UU的公钥KK。
3. 隐式证书并不能直接验证证书是否真的隶属于UU(即UU真的拥有私钥),直到隐式证书被使用的那一刻。
4. 隐式证书更短、更有效。
隐式两字意味着:如果隐式证书被用户UU所有,则用户UU的公钥是KK,“隐式”藏于“如果”之中。
3.2 ECQV算法
ECQV算法主要包含证书签发和公私钥重建两部分:
URU=kU×Ge=Hash(CertU)dU=e×kU+r (mod n)QU=e×PU+QCAUID,RU−→−−−−r,CertU←−−−−−CAPU=RU+kCA×GCertU=Encode(PU,UID,∗)e=Hash(CertU)r=e×kCA+dCA (mod n)UCARU=kU×GUID,RU→PU=RU+kCA×GCertU=Encode(PU,UID,∗)e=Hash(CertU)r=e×kCA+dCA (mod n)r,CertU←e=Hash(CertU)dU=e×kU+r (mod n)QU=e×PU+QCA
- UU选择一个随机数kUkU,计算证书请求 RU=kU×GRU=kU×G,并把RURU发送给CACA。(其本质是一对UU临时密钥)
- CACA选择一个随机数kCAkCA,计算公钥重建数据 PU=RU+kCA×GPU=RU+kCA×G。(起本质是生成一对CACA临时密钥,并把CACA和UU的临时公钥混合,具有双方因子)
- 编码生成隐私证书 CertU=Encode(PU,UID,∗)CertU=Encode(PU,UID,∗), 证书里包含公钥重建数据、UU的身份及想要额外携带的扩展信息。(编码的方法后面详细介绍)
- 计算证书的摘要 e=Hash(CertU)e=Hash(CertU)。
- 计算私钥重建数据 r=e×kCA+dCA (mod n)r=e×kCA+dCA (mod n)。
- 把私钥重建数据rr和签发隐式证书CertUCertU返回会给用户UU。
- 用户UU的私钥可以通过私钥重建数据r推导得出 dU=e×kU+r (mod n)dU=e×kU+r (mod n)。
- 用户UU的公钥可以通过公钥重建数据PUPU推导得出 QU=e×PU+QCAQU=e×PU+QCA。
QU=e×PU+QCA=e×(RU+kCA×G)+dCA×G=e×(kU×G+kCA×G)+dCA×G=(e×kU+e×kCA+dCA)×G=(e×kU+(e×kCA+dCA))×G=(e×kU+r′)×GQU=e×PU+QCA=e×(RU+kCA×G)+dCA×G=e×(kU×G+kCA×G)+dCA×G=(e×kU+e×kCA+dCA)×G=(e×kU+(e×kCA+dCA))×G=(e×kU+r′)×G
因为ECC的数乘运算都会mod nmod n, 所以这里(e×kU+r′)×GQU≡(e×kU+r (mod n))×G≡dU×G(e×kU+r′)×G≡(e×kU+r (mod n))×GQU≡dU×G
当VV获取到隐式证书CertUCertU后,并不能直接验证证书是否真的隶属于UU,甚至不能验证证书本身是否被篡改,验证被延迟到证书中的公钥被使用的时候。比如使用隐式证书建立SSL连接协商链路握手时:
1. VV使用UU的公钥QUQU加密链路密钥协商因子ff发送给UU,此时如果CertUCertU不对或被篡改过,则推导出的QUQU不对。
2. UU使用私钥dUdU解密协商因子ff,如果UU身份不对,则它没有正确的dUdU,无法解密ff。
3. 无论QUQU不对还是dUdU不对,都无法成功协商出链路密钥,建立连接。
3.3 隐式证书编码
ECQV规范提供了3种编码格式:
1. 简单固定长度编码
2. 最小ASN.1编码(MES)
3. X.509兼容编码
ECQV通过这三种编码,灵活的支撑各种业务场景,从资源约束到通用应用。
3.3.1 简单固定长度编码()
简单固定长度编码(fixed-length field encoding),就是每个字段都是固定长度的编码,除了必要的UIDUID和PUPU外对其他字段没有任何要求。整个证书的格式由应用自己定义,规范并不严格要求。比如可以把它直接对应为到struct上:
C++
struct ECQVCertificate {
char subjectID[8];
char pubkeyReconstruct[32];
... /* optional other fields */
};
3.3.2 最小ASN.1编码(MES)
MES(Minimal Encoding Scheme)编码,被设计为尽可能短,只包含大部分应用所必须的字段。
ECQVCertificate ::= SEQUENCE {
type MESType DEFAULT t1, -- 一个字节, 下面详述
serialNumber OCTET STRING (SIZE (8)),
curve Curve, -- 椭圆曲线名字, 下面详述
hash Hash,
issuerID OCTET STRING (SIZE (8)), -- 颁发者CA的身份标识
validFrom OCTET STRING (SIZE (5)), -- 40-bit Unix时间
validDuration OCTET STRING (SIZE (4)), -- 32-bit 单位秒
subjectID OCTET STRING (SIZE (8)), -- 申请者U的身份标识
usage KeyUsage, -- 一个字节, 下面详述
pubKey OCTET STRING, -- 公钥重建数据
pathLenConstraint INTEGER (0..255) OPTIONAL,
...,
-- Extensions:
algorithm[1] AlgorithmIdentifier OPTIONAL,
email[2] IA5String (SIZE (0..128)) OPTIONAL
}
-- 说明:
-- * 32-bit的秒,允许证书生命周期长达136年;如果validDuration=2^32-1则永远有效
-- * 如果证书扩展存在, type必须是t2,此时算法标识和email不能省略
-- * 公钥重建数据的长度根据选择的椭圆曲线参数不同而不同
-- * type为t1的证书大小为: 37个字节 + 公钥重建数据的大小
-- * 37 = type(1) + serialNumber(8) + curve(1) + hash(1) + issureID(8)
-- * + validFrom(5) + validDuration(4) + subjectID(8) + usage(1)
MESType ::= INTEGER {
t1(0), -- type 1: no extension(s),
t2(1), -- type 2: with extension(s)
}
Curve ::= INTEGER {
secp192k1(0), secp192r1(1), secp224k1(2), secp224r1(3), secp256k1(4),
secp256r1(5), secp384r1(6), secp512r1(7), sect163k1(8), sect163r1(9),
sect233k1(10), sect233r1(11), sect239k1(12), sect283k1(13), sect283r1(14),
sect409k1(15), sect409r1(16), sect571k1(17), sect571r1(18)
}
Hash ::= INTEGER {id-sha224(0), id-sha256(1), id-sha384(2), id-sha512(3)}
KeyUsage ::= BIT STRING {
digitalSignature (0),
nonRepudiation (1),
keyEncipherment (2),
dataEncipherment (3),
keyAgreement (4),
keyCertSign (5),
cRLSign (6),
}
延伸知识:椭圆曲线参数domain parameters(p,a,b,G,n,h)(p,a,b,G,n,h)
1.「离散对数问题很困难」这种说法其实不完全准确,有一类椭圆曲线可以被高效的求解离散对数。例如,具有 p=hnp=hn 性质的所有曲线对于smart攻击是脆弱的,可以多项式时间内求解。
2. 所以美国密码标准化组织(SECG)推荐了一批参数[13],这就是secp192k1,secp192r1等的由来,它定义了一批安全的(p,a,b,G,n,h)(p,a,b,G,n,h)。
3. 我国密码管理局发布的SM2标准也是基于ECC算法的,它规定了一组安全的(p,a,b,G,n,h)(p,a,b,G,n,h)。
3.3.3 X.509兼容编码
ECQV也支持标准的X.509兼容编码,可以完美融入到目前的PKI体系中。
ECQV-X509-Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
}
TBSCertificate ::= SEQUENCE {
version Version DEFAULT v1,
serialNumber OCTET STRING,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
extensions[3] Extensions OPTIONAL,
}
Version ::= INTEGER {v1(0), v2(1), v3(2)}
Validity ::= SEQUENCE {
notBefore Time,
notAfter Time,
}
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey ECPoint,
}
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING,
}
3.4 隐式证书的局限
ECQV算法主要有两方面的局限:
1. ECQV有知识产权的约束,并不能随意使用,必须获得授权。
2. 证书链的长度超过3级后,受生日悖论影响,安全性会有所降低,可以利用Wagner算法加速暴力求解离散对数问题。
4. 参考文献
[01] A. Corbellini. Elliptic Curve Cryptography: a gentle introduction. May 17, 2015.
[02] A. Corbellini. Elliptic Curve Cryptography: finite fields and discrete logarithms. May 23, 2015.
[03] A. Corbellini. Elliptic Curve Cryptography: ECDH and ECDSA. May 30, 2015.
[04] Avery. ECC椭圆曲线加密算法:介绍. May 3, 2018.
[05] Avery. ECC椭圆曲线加密算法:有限域和离散对数. March 1, 2019.
[06] 林扣星. ECC椭圆曲线加密算法:ECDH和ECDSA. June 12, 2019.
[07] CSBreakdown. Elliptic Curve Cryptography & Diffie-Hellman. May 16, 2015.
[08] Keylength - NIST Report on Cryptographic Key Length and Cryptoperiod (2016). June 10, 2018.
[09] LZRcqbz. 乘法逆元详解. August 5, 2018.
[10] Elliptic-curve Diffie–Hellman - Wikipedia. August 7, 2019.
[11] Elliptic Curve Digital Signature Algorithm - Wikipedia. August 6, 2019.
[12] Y. E. Housni. Introduction to the Mathematical Foundations of Elliptic Curve Cryptography. November 7, 2018.
[13] D. R. L. Brown. SEC 2: Recommended Elliptic Curve Domain Parameters. January 27, 2010.
[14] M. Campagna. SEC 4: Elliptic Curve Qu-Vanstone Implicit Certificate Scheme (ECQV). January 24, 2013.
[15] Implicit certificate - Wikipedia. February 10, 2019.
[16] T. Pornin. What are Implicit and Explicit Certificates in Public Key Cryptography?. June 6, 2014.