IBC公钥密码

混江龙づ霸主 提交于 2020-08-08 06:58:11

https://blog.csdn.net/ayang1986/article/details/105528248

1. IBC概述

 

基于标识的密码(Identity-Based Cryptography)简称IBC,是与RSA、ECC相比具有其独特性的又一种公钥密码。这种独特性表现在其公钥是用户的身份标识,该标识可以是任何有意义的字符串,比如email地址、电话号码、身份证号等,而不再是随机乱码。

IBC这个概念最初出现于1984年Shamir(RSA密码创始人之一)的论文“Identity-based cryptosystems and signature schemes”中,IBC密码公私钥采用一种不同于RSA和ECC的特殊方法产生,即公钥是用户的身份标识,而私钥通过绑定身份标识与系统主密钥(master key)生成。IBC包括基于标识的加密算法IBE(Identity-Based Encryption)和基于标识的签名算法IBS(Identity-Based Signature)以及基于标识的密钥协商算法IBKA(Identity-Based Key Agreement)。继1984年Shamir的IBC设计思想提出之后,诞生了许多令人满意的针对IBS和IBKA的协议算法。其中,采用双线性对的Hess IBS和Cha-Cheon IBS签名算法已被ISO和IEC采纳(ISO/IEC 1488-3),分别作为IBS的第一签名算法和第二签名算法。Smart-Chen-Kudel IBKA密钥协商算法已提交IEEE P1363.3。

Shamir于1984年提出IBC密码后,过了17年,2001年诞生了三个IBE密码算法,它们由Boneh和Franklin、Cocks、Sakai等分别提出。Cocks的IBE算法使用二次剩余,其安全性基于大数分解的困难性。由Boneh、Franklin两人共同设计的IBE与Sakai等人设计的IBE均使用椭圆曲线上的双线性对(bilinear pairing),其安全性基于BDH(Bilinear Diffie-Hellman)的困难性。Boneh-Franklin的IBE(即BF-IBE)是第一个在随机预言模型(random oracle model)中安全性得到证明的算法,得到了国际密码界的公认,随着其应用的推广,相应的标准化工作也逐步展开,RFC5091将建立于超奇异曲线上的BF-IBE作为IBC标准。BF-IBE是基于标识的密码技术和基于双性对的密码技术的结合。下文中在无特别说明的情况下IBC均指以BF-IBE加密算法为核心的标识密码(注:这与我国正在制定的IBC标准有所不同)。

IBC作为PKI(Public Key Infrastructure)体系的发展和补充,尤其是IBC与PKI体系的融合,既保证了强签名的安全特性,又满足了各种应用更灵活的安全需求。RSA和ECC应用于PKI中需要创建大量的数字证书,一些应用系统中的证书数量超过一千万,而证书的管理和相应数据库的管理成为一项繁重的工作。IBC应用于PKI中是无证书的(certificateless),由于标识本身就是实体的公钥,这类系统就不再依赖证书,从而大大简化了PKI的应用。

IBC密码的应用比传统公钥密码的应用更加简单,但是,其代价是IBC密码的设计与计算却比其他公钥密码复杂得多。在IBC算法中,除了RSA和ECC中所具有的运算外,还增加了双线性对的计算。因此,双线性对算术理论是IBC算法的一个重要内容。

早期椭圆曲线上的双线性对是被用来攻击ECC中的离散对数问题(DLP),即所谓的Meneses、Okamoto、Vanstone的MOV攻击和Frey、Ruck的FR攻击。

2000年,Sakai、Ohgish、Kasahara等人在其论文“cryptosystems based on pairing”中、Joux在其论文“A one Round protocol for tripartite Diffie-Hellman”中分别独立地提出了基于双线性对的密码协议,这开创了椭圆曲线密码学上的新篇章。自此以后,双线性对从应用于密码攻击转向应用于密码设计并引起许多密码学者的兴趣和关注。双线性对被视为密码系统中的黑匣子(black box),在密码学中的应用以异乎寻常的步伐快速发展,特别是Boneh、Franklin的那篇开创性论文“Identity-Based Encryption from the Weil Pairing”,成功地创建了基于身份标识的密码IBE。

正因为双线性对在密码协议设计中的广泛应用,双线性对的有效计算成为人们在这方面的一个研究重点。

Miller在1985年创建椭圆曲线密码(ECC)后不久,在其一篇未发表的手稿“short programs for functions on curves”中首次给出了计算双线性对的多项式时间算法。但因为当时双线性对在公钥密码中尚未取得有效应用,因此没有引起研究者的关注。当双线性对在公钥密码学中获得诸多应用后,其计算的重要性也日趋显著,时隔19年之后,Miller于2004年重新整理了当年的手稿,详尽地介绍了双线性对的计算及其应用(参见“the Weil paring, and its efficient calculation”,Journal of Cryptology . Sep.2004)。

目前大多数的双线性对算法研究都集中于Miller算法的优化和改进,其中Barreto、Scott等人的工作最为突出,最有成效的改进有两个方面:一是在某种情况下在双线性对计算中有理函数在除子(divisor)的值可以用椭圆曲线上点的值代替而不影响计算结果,即replacing divisors by points,本人称之为“以点代除”;二是在某种情况下双线性对Miller算法步骤中的分母部分可以全部去掉而不影响最终结果,即denominators elimination优化,本人称之为“去分母化”。

关于双线性对的算术理论和计算方法,有不少这方面的文章。本人向读者推荐两篇论文,一篇是我国中山大学计算机科学系的赵昌安博士所著的博士学位论文“双线性对的有效计算”,另一篇是美国斯坦福大学计算机科学系的 Ben Lynn博士所著的博士学位论文“On the Implementation of Pairing-based Cryptosystems”。这两篇论文不仅仅在诸多方面有深入的研究,更重要的是,而且可能更吸引一般读者的是,它们涵盖了双线性对的基础性内容,并对基于双线性对的密码和双线性对计算进行了全面的介绍和综合性论述。

 

2. IBC密码主要算法模块

 

IBC密码包含系统创建,私钥提取,加密,解密,签名,验签,双线性对计算等算法模块。以下IBC中加密算法为BF-IBE,签名算法为Hess-IBS。双线性对采用的是Tate对。

 

2.1. Setup(密码系统创建)

 

该函数模块用来创建IBC密码系统,主要任务是生成密码系统参数和主密钥(master key)。密码系统参数包括:

基于椭圆曲线y2=x3+1的素数p,p=11 mod 24;

素数q,q|(p+1),使得Fp上的椭圆曲线加法群E(Fp)具有q阶循环子群;

E(Fp)上一个阶为q的点P,称之为基点;

E(Fp)上一个阶为q的点Pub,称之为系统根公钥;

主密钥(也称根私钥)为小于q的随机数。主密钥(设为s)与基点P、根公钥Pub的关系是椭圆曲线上的多点倍乘关系:Pub=[s]P。

以下是p与q之间的比特大小关系。

 

p

512

1024

1536

3840

7680

q

160

224

256

384

512

 

素数q(其中q | p+1 )取Solinas素数[RFC5091],即形如:2a + 2b + 1的素数,其中a根据q的比特大小而定,假设q的比特数为Qbit,则a=Qbit-1。

在创建密码系统参数时,实际上是先构造素数q,再根据素数q构造p。

 

2.2. Private Key Extraction(私钥提取)

 

该函数模块根据系统参数、主密钥和用户标识生成用户的私钥。

在BF_IBC中,首先是将用户的标识id映射成椭圆曲线上的一个点Q_id。

这个映射利用hash函数(不妨称为H1)将id转换成Fp中的数y=H1(id),再由y根据椭圆曲线方程:y2=x3+1确定x,进而得到曲线上的点Q_id=(x,y)。

然后,用主密钥s与点Q_id多倍点相乘得到其私钥D_id:D_id=[s] Q_id。

注意:用户的公钥私钥数据类型正好与IBC根公钥根私钥的数据类型相反。用户公钥是其身份标识(字符串类型),而私钥是曲线上的点。而IBC的根公钥是曲线上的点,根私钥(主密钥)是数值类型。

 

2.3. Encryption(加密)

 

该算法根据密码系统参数和用户标识对所提供的数据m进行加密。其加密过程是:

1. 将用户标识id映射成E(Fp)上的点Q_id(如何映射前面已说明);

2. 对欲加密的消息m进行hash得到t,这个hash函数不妨设为H2,则t=H2(m);

3. 选择随机字符串rho,其字节数与hash算法H2输出大小相同;

4. 对rho和t合并进行hash运算再模q得到r=H2(rho || t)%q。

5. 进行椭圆曲线上多倍点计算得到U=[r] P,其中P是密码系统参数中的基点;

6. 双线性对计算:g=e(Pub,Q_id),g是Fp2中的数(复数);

7. 计算 z=gr,z是Fp2中的数(复数);

8. 对z进行hash运算得到w=H2(z);

9. 计算V= w rho ,V的比特大小与H2输出比特大小相同;

10. 计算W = HashBytes(|m|, rho, hashfcn) m,HashBytes是一个随机乱数生成器,它可根据乱源字符串生成任意指定长度的一串随机字符串。HashBytes(|m|, rho, hashfcn)的意思是根据乱源字符串rho生成与欲加密数据m同字节长度(即|m|)的随机字符串,HashBytes函数内可能要多次调用hash函数hashfcn。

11. 输出(U,V,W)作为对数据m加密的结果。

 

2.4. Decryption(解密)

 

该算法根据用户私钥D_id、密码系统参数和密数据(U,V,W)得到明文m。

1. pairing对计算,z=e(U,D_id);

2. 计算 w=H2(z);//  注意这里是小写w

3. 计算rho=wV;

4. 计算m = HashBytes(|W|, rho, hashfcn)  W;

5. 计算 t=H2(m);

6. 计算r=H2(rho || t)%q;

7. 验证U=[r] P,如果正确,输出明文m,否则解密失败,无明文输出。

 

2.5. Signature(签名)

 

该算法根据用户私钥D_id和系统参数对数据m进行数字签名。

1. pairing对计算,g=e(P,D_id);// P为系统基点;

2. 选择一个小于q的随机数k;

3. 计算w=gk,w是Fp2中的数(复数);

4. 将w转换成字符串pad。

5. 对pad和明文m进行hash,然后模q得到h=H2(pad || m)%q;

6. 计算S=[(k-h)%q] D_id;

7. 输出(h,S)作为签名结果。

 

2.6. Verification(验签)

 

该算法根据用户标识id和系统参数,对数据m的签名结果(h,S)进行验证。

1. 将id映射成椭圆曲线上的点Q_id;

2. 双线性对计算g=e(Pub,Q_id); // Pub为系统参数中的根公钥;

3. 双线性对计算w1=e(P,S); // P为系统参数中的基点;

4. 计算 w=w1 * gh;// w1、g和w均为Fp2中的数(复数);

5. 将w转换成字符串pad;

6. 计算h’=H2(pad || m)%q;

7. 验证h=h’,正确则验签成功,否则失败。

 

2.7. 双线性对(Bilinear  Pairing)计算

 

双线性对 假设G1和G2是两个加法群,GT是乘法群,又假设PG1,QG2和gGT,如果存在映射e从G1×G2到GT,e(P,Q)=g,并对任意的P1、P2G1,Q1、Q2G2,满足e(P1+P2,Q1)=e(P1,Q1)*e(P2,Q1)和e(P1,Q1+Q2)=e(P1,Q1)*e(P1,Q2),那么映射e被称为从G1×G2到GT的一个双线性对。双线性对有多种类型,下面仅介绍Tate对。

Tata对 假设q=pm,其中p为素数,m为正整数,又设Fq是含q个元素的有限域,则p为Fq的特征,m为扩张次数。令E为定义在有限域Fq上的椭圆曲线,假设PE(Fqk)[r],k为曲线E的嵌入次数(embedding degree),QE(Fqk),fr,p是E上的有理函数,其对应的除子满足(fr,p)~r(P)-r(O),除子DQ~(Q)-(O),且除子(fr,p)和DQ的支集(support)不相交。双线性Tate对为如下定义的非退化双线性映射:

tr:E(Fqk)[r] ×E(Fqk)/rE(Fqk)—> F*qk /( F*qk)r

tr(P,Q)=fr,p(DQ)。

由以上定义可知,传统的双线性Tate对的计算结果为陪集值,即对相同的P和Q计算tr(P,Q)可能得到不同的数值,但是这些数值都属于同一个陪集,而实际应用中要求双线性映射后得到唯一值,因此有如下约化的双线性Tate对定义:

tr’:E(Fqk)[r] ×E(Fqk)/rE(Fqk)—>

tr’(P,Q)=fr,p(DQ)。  其中为F*qk中的r次单位根群。

如果定义 PE(Fq),可进一步定义如下变形的约化双线性Tate对:

tr^:E(Fq)[r] ×E(Fqk)/rE(Fqk)—>

tr^(P,Q)=fr,p(Q)。  

函数fr,p的计算采用miller算法。关于miller算法这里不再赘述,读者可查阅相关文献。

从定义可见,Tate对的两个输入变量取自不同的加法群,在BF-IBC密码中,所采用的椭圆曲线为超奇异的椭圆曲线,因此存在变形映射(distortion map),为了优化算法,Tate对可进一步封装成如下的映射:

 

e: G×G—>Fqk  (G为椭圆曲线加法群,k为嵌入次数,k=2)

e(P,Q)= tr^ (P,(Q)).为变形映射:

 

其中,为的共轭(conjugate),z =x,为x3=1 的非退化解。

1) e的两个输入变量都是基域上的点。这样,大大简化了密码系统(参数)的构造。

2) 因为P和 (Q)总是线性无关的,因此,只要P和Q是曲线上的有限点,封装函数e可以确保双线性对的值不退化为单位元1。

3)Tate对计算可以“去分母化”,即miller算法中分母部分都可以去掉。

4)Tate对的最后指数次数(the  final  powering)可以大幅降低。事实上

Tate对的最后指数是z=(p2-1)/r=((p+1)/r)(p-1)。要计算e=wz  modp,可计算t=w(p+1)/r=u+i v ,因为

 

       

当p=3 mod 4时,ip =-i,因此

      

 

后记:从兼顾高效、安全的角度看,IBC密码所选择的椭圆曲线往往可能是MNT曲线或BN曲线。这里选择超奇异椭圆曲线,目的是想简化算法的实现而不想使叙述复杂化。

                                

参考资料

1. V.S.Miller Short Programs for Functions on Curves,1986.

2. Boneh et al. Identity-Based Encryption from the Weil Pairing,2001.

3. Barreto et al. Efficient Algorithms for Pairing-based Cryptosystems,2002.

4. Rfc5091: Identity-Based Cryptography Standard(IBCS) #1. 2007.

5. Scott. Faster Pairings using an Elliptic Curve with an Efficient Endomorphism. 2005.

6. Freeman,Scott et al. A Taxonomy of Pairing-Friendly Elliptic Curvers,2006.

7. 赵昌安, 双线性对的有效计算,中山大学计算机科学系2008博士论文.

8. Lynn. On the Implementation of Pairing Based Cryptosystems. 2007

9. rfc5409 .using the BF/BB-IBE with the cryptographic message syntax(CMS) 2009.

10. Scott et al , Implementing cryptographic pairings: a magma tutorial. 2009.

11. Scott. On the Efficient Implementation of Pairing-Based Protocols. 2011.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!