ECC加密算法.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ECC加密算法

c++ 容易的实现椭圆曲线加密算法 c++ 简单的实现椭圆曲线加密算法 椭圆曲线算法 椭圆曲线密码体制来源于对椭圆曲线的研究,所谓椭圆曲线指的是由韦尔斯特拉斯(Weierstrass)方程: y2+a1xy+a3y=x3+a2x2+a4x+a6 (1) 所确定的平面曲线。其中系数ai(I=1,2,…,6)定义在某个域上,可以是有理数域、实数域、复数域,还可以是有限域GF(pr),椭圆曲线密码体制中用到的椭圆曲线都是定义在有限域上的。 椭圆曲线上所有的点外加一个叫做无穷远点的特殊点构成的集合连同一个定义的加法运算构成一个Abel群。在等式 mP=P+P+…+P=Q (2) 中,已知m和点P求点Q比较容易,反之已知点Q和点P求m却是相当困难的,这个问题称为椭圆曲线上点群的离散对数问题。椭圆曲线密码体制正是利用这个困难问题设计而来。 公钥算法是基于数学函数(如单向陷门函数),公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。 本文是在素域Zp上的,以Menezes-Vanstone形式的椭圆加密算法。 在素域上的曲线函数为 y^2 = x ^ 3 +a* ?x + b ? ? ?a,b为小于p的非负数,且 4*a^3+ 27*b^2 != 0 对于在素域上的加法中,对于所有的点P,Q 属于E(Zp),有加法规则: 1。P + O = O + P = P ,P + (-P) = O; O为椭圆曲线上的零点或者称为无限远的点,但是O在椭圆曲线的加法域上。 2.加法的分配率和结合律,对于s,t 属于Zp,有(s + t )* P = s * P + t* P; 3.对于 P = (x1,y1),Q = (x2,y2) ,并且 P != - Q,则P + Q=(x3,y3), x3 = k^2 - x1 -x2; y3 = k*(x1-x3) - y1; k = (y2-y1)/(x2-x1) ? if P != Q; k = (3x1^2 + a)/(2*y1) if P == Q; 椭圆曲线在素域上的运算用到除法,而在除法的规则是a / b = c mod p 即计算 a x b^-1 = c mod p ,其中 b^-1为b的乘法逆元, 即 b x b^-1 = 1 mod p。对于乘法逆元,当b与p互素时,存在唯一解,而这里p是一个素数,且b不可能为1,则肯定有解。对于求乘法逆元,一般使用欧几里德算法,如下: int getX_1(int x,int mod){ int Q,X1,X2,X3,Y1,Y2,Y3,T1,T2,T3; X1 = 1; X2 = 0; X3 = mod; Y1 = 0; Y2 = 1; Y3 = (x%mod + mod) %mod;//获得正整数 while(Y3 != 1){ Q = X3 / Y3; T1 = X1 - Q * Y1; T2 = X2 - Q * Y2; T3 = X3 - Q * Y3; X1 = Y1; X2 = Y2; X3 = Y3; Y1 = T1; Y2 = T2; Y3 = T3; } return Y2; } 乘法运算规则: 1. 对于任意 k 属于 Zp,有 k * P = P + ..... + P (k个P相加) 2. 对于任意 s,t 属于 Zp,有 s *(t *P) = (s*t)*P 对于Menezes-Vanstone的椭圆加密算法: 1. 产生密钥, 任选一个整数k ,0kp ,为私钥,在曲线上任选一点 A ,并计算 B = k*A ,公钥为(A,,B)。其中又可称A为基钥,对于最小整数n以使 n* A = O ,则n称为周期,要是周期为素数,且为一个较大值才合理。 2.加密过程: 令明文为 M = (m1,m2),M可以不是曲线E上的点。计算得到密文(C1,C2),其中任选一个数属于Zp: C1 = r * A;; Y= (y1,y2) = r * B; C2 = (C21,C22) = (y1 * m1 mod p,y2* m2 mod p) 3 解密过程; 计算Z = (z1,z2) = k*C1;计算明文 M = (C21 * z1^-1 mod p, C22 * z2 ^ -1 mod p). c++中的模运算,当有负数存在时无法达到正确结果,简直是坑,如 -1 % 2,在使用vs2012进行测试,会返回-1,而不是1. c++中模运算结果的符号和被除数的符号一致。 参数选取:选取 p = 127,曲线函数为: y^2 = x^3 + 5* x + 37, a = 5 ,b= 37, r = 7.选取私钥 k = 9选取一个点A为(11,

文档评论(0)

pengyou2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档