导航:首页 > 源码编译 > ecc算法c语言实现

ecc算法c语言实现

发布时间:2022-12-08 17:29:07

A. 周立功烧录器ECC算法是什么意思

ECC算法基于一条椭圆曲线。曲线是一个多项式的图形表达。多项式就有常量。那么常量就是曲线的部分参数。
ECC算法具有查错、纠错的功能,并且在NANDFLASH使用的绝大多数环境下,是需要ECC来确保可靠性的。由于ECC算法很多,每个算法个体又具有较强的可变性,且在Spare区存放的位置也不一样,所以无法做成统一的算法。

B. ecc算法能在android上实现吗用c好还是Java好

ECC算法在android上是能够实现的,使用Spongy Castle库

C. IDEA加密算法的C语言实现

1、数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。

2、常见加密算法
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
RC2和 RC4:用变长密钥对大量数据进行加密,比 DES 快;
IDEA(International Data Encryption Algorithm)国际数据加密算法:使用 128 位密钥提供非常强的安全性;
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法;
BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
其它算法,如ElGamal、Deffie-Hellman、新型椭圆曲线算法ECC等。
比如说,MD5,你在一些比较正式而严格的网站下的东西一般都会有MD5值给出,如安全焦点的软件工具,每个都有MD5。

3、例程:

#include<stdio.h>
#include<process.h>
#include<conio.h>
#include<stdlib.h>
#definemaxim65537
#definefuyi65536
#defineone65536
#defineround8
unsignedintinv(unsignedintxin);
unsignedintmul(unsignedinta,unsignedintb);
voidcip(unsignedintIN[4],unsignedintOUT[4],unsignedintZ[7][10]);
voidkey(unsignedintuskey[9],unsignedintZ[7][10]);
voidde_key(unsignedintZ[7][10],unsignedintDK[7][10]);
voidmain()
{
inti,j,k,x;
unsignedintZ[7][10],DK[7][10],XX[5],TT[5],YY[5];
unsignedintuskey[9];
FILE*fpout,*fpin;
printf(" InputKey");
for(i=1;i<=8;i++)
scanf("%6u",&uskey[i]);
for(i=0;i<9;i++)
uskey[i]=100+i*3;
key(uskey,Z);/*产生加密子密钥*/
de_key(Z,DK);/*计算解密子密钥*/
if((fpin=fopen("ekey.txt","w"))==NULL)
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
for(i=0;i<7;i++)
{
for(j=0;j<10;j++)
fprintf(fpin,"%6u",Z[i][j]);
fprintf(fpin," ");
}
fclose(fpin);

/*XX[1..5]中为明文*/
for(i=0;i<4;i++)XX[i]=2*i+101;
clrscr();
printf("Mingwen%6u%6u%6u%6u ",XX[0],XX[1],XX[2],XX[3]);
if((fpin=(fopen("ideaming.txt","w")))==NULL)
{printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpin,"%6u,%6u,%6u,%6u ",XX[0],XX[1],XX[2],XX[3]);
fclose(fpin);
for(i=1;i<=30000;i++)
cip(XX,YY,Z);/*用密钥Z加密XX中的明文并存在YY中*/
printf(" Mingwen%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
if((fpin=fopen("ideamiwn.txt","w"))==NULL)
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",YY[0],YY[1],YY[2],YY[3]);
fclose(fpout);
for(i=1;i<=30000;i++)
cip(YY,TT,DK);/*encipherYYtoTTwithKeyDK*/
printf(" JieMi%6u%6u%6u%6u ",TT[0],TT[1],TT[2],TT[3]);
if((fpout=fopen("dideaout.txt","w"))==NULL)
{
printf("cannotopenfile!");
exit(EXIT_FAILURE);
}
fprintf(fpout,"%6u%6u%6u%6u ",TT[0],TT[1],TT[2],TT[3]);
fclose(fpout);
}
/*此函数执行IDEA算法中的加密过程*/

voidcip(unsignedintIN[4],unsignedintOUT[4],unsignedintZ[7][10])
{
unsignedintr,x1,x2,x3,x4,kk,t1,t2,a;
x1=IN[0];x2=IN[1];x3=IN[2];x4=IN[3];
for(r=1;r<=8;r++)
{
/*对64位的块进行分组运算*/
x1=mul(x1,Z[1][r]);x4=mul(x4,Z[4][r]);
x2=x2+Z[2][r]&one;x3=(x3+Z[3][r])&one;
/*MA结构的函数*/
kk=mul(Z[5][r],(x1^x3));
t1=mul(Z[6][r],(kk+(x2^x4))&one;
/*随机变换PI*/
x1=x1^t1;x4=x4^t2;a=x2^t2;x2=x3^t1;x3=a;
}
/*输出转换*/
OUT[0]=mul(x1,Z[1][round+1]);
OUT[3]=mul(x4,Z[1][round+1]);
OUT[1]=(x3+Z[2][round+1])&one;
OUT[2]=(x2+Z[3][round+1])&one;
}

/*用高低算法上实现乘法运算*/
unsignedintmul(unsignedinta,unsignedintb)
{
longintp;
longunsignedq;
if(a==0)p=maxim-b;
elseif(b==0)p=maxim-a;
else
{
q=(unsignedlong)a*(unsignedlong)b;
p=(q&one)-(q>>16);
if(p<=0)p=p+maxim;
{
return(unsigned)(p&one);
}

/*通过Euclideangcd算法计算xin的倒数*/
unsignedintinv(unsignedintxin)
{
longn1,n2,q,r,b1,b2,t;
if(xin==0)
b2=0;
else
{n1=maxim;n2=xin;b2=1;b1=0;
do{
r=(n1%n2);q=(n1-r)/n2;
if(r==0)
if(b2<0)b2=maxim+b2;
else
{n1=n2;n2=r;
t=b2;
b2=b1-q*b2;b1=t;
}
}while(r!=0);
}
return(unsignedlongint)b2;
}
/*产生加密子密钥Z*/
voidkey(unsignedintuskey[9],unsignedintZ[7][10])
{
unsignedintS[54];
inti,j,r;
for(i=1;i<9;i++)
S[i-1]=uskey[i];
/*shifts*/
for(i=8;i<54;i++)
{
if(i+2)%8==0)/*对于S[14],S[22],...进行计算*/
S[i]=((S[i-7]<<0)^(S[i-14]>>7)&one;
elseif((i+1)%8==0)/*对于S[15],S[23],...进行计算*/
S[i]=((S[i-15]<<9)^(S[i-14]>>7)&one;
else
S[i]=((S[i-7]<<9)^(S[i-6]>>7)&one;
}
/*取得子密钥*/
for(r=1;r<=round+1;r++)
for(j=1;j<7;j++)
Z[j][r]=S[6*(r-1)+j-1];
}

/*计算解子密钥DK*/
voidde_key(unsignedintZ[7][10],unsignedintDK[7][10])
{
intj;
for(j=1;j<=round+1;j++)
{DK[1][round-j+2]=inv(Z[1][j]);
DK[4][round-j+2]=inv(Z[4][j]);
if(i==1|j==round+1)
{
DK[2][round-j+2]=(fuyi-Z[2][j])&one;
DK[3][round-j+2]=(fuyi-Z[3][j])&one;
}
else
{
DK[2][round-j+2]=inv(Z[3][j]);
DK[3][round-j+2]=inv(Z[2][j]);
}
}
for(j=1;j<=round+1;j++)
{
DK[5][round-j+2]=inv(Z[5][j]);
DK[6][round-j+2]=inv(Z[6][j]);
}

}

D. 椭圆曲线加密(ECC)核心算法的简明介绍

网上对于椭圆曲线加密过程的介绍过于繁琐,对于只想了解加密如何进行的人来说浪费时间,所以我这里只对关键计算步骤进行介绍,略去椭圆曲线的相关原理(网络一搜一大把)。

最最关键且基本只用到的是 Ep(a,b)的加法

对与椭圆曲线y^2 = x^3+ax+b(mod p) :

两点P(x1,y1) Q(x2,y2),P≠-Q,则P+Q=(x3,y3)由以下算法定义:

实际通信流程如下:

再对点M进行解码就可以得到明文。上述流程中的加法即为Ep(a,b)的加法。

这个算法实际是基于已知kG难解k实现的,简单清晰。

E. ECC 算法简介

与 RSA(Ron Rivest,Adi Shamir,Len Adleman 三位天才的名字)一样,ECC(Elliptic Curves Cryptography,椭圆曲线加密)也属于公开密钥算法。

一、从平行线谈起

平行线,永不相交。没有人怀疑把:)不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了?事实上没有人见到过。所以“平行线,永不相交”只是假设(大家想想初中学习的平行公理,是没有证明的)。

既然可以假设平行线永不相交,也可以假设平行线在很远很远的地方相交了。即平行线相交于无穷远点P∞(请大家闭上眼睛,想象一下那个无穷远点P∞,P∞是不是很虚幻,其实与其说数学锻炼人的抽象能力,还不如说是锻炼人的想象力)。

给个图帮助理解一下:

直线上出现P∞点,所带来的好处是所有的直线都相交了,且只有一个交点。这就把直线的平行与相交统一了。为与无穷远点相区别把原来平面上的点叫做平常点。

以下是无穷远点的几个性质。

直线 L 上的无穷远点只能有一个。(从定义可直接得出)

平面上一组相互平行的直线有公共的无穷远点。(从定义可直接得出)

平面上任何相交的两直线 L1、L2 有不同的无穷远点。(否则 L1 和 L2 有公共的无穷远点 P ,则 L1 和 L2 有两个交点 A、P,故假设错误。)

平面上全体无穷远点构成一条无穷远直线。(自己想象一下这条直线吧)

平面上全体无穷远点与全体平常点构成射影平面。

二、射影平面坐标系

射影平面坐标系是对普通平面直角坐标系(就是我们初中学到的那个笛卡儿平面直角坐标系)的扩展。我们知道普通平面直角坐标系没有为无穷远点设计坐标,不能表示无穷远点。为了表示无穷远点,产生了射影平面坐标系,当然射影平面坐标系同样能很好的表示旧有的平常点(数学也是“向下兼容”的)。

我们对普通平面直角坐标系上的点A的坐标(x, y)做如下改造:

令 x=X/Z ,y=Y/Z(Z≠0);则 A 点可以表示为(X:Y:Z)。

变成了有三个参量的坐标点,这就对平面上的点建立了一个新的坐标体系。

例 2.1:求点(1,2)在新的坐标体系下的坐标。

解:

∵X/Z=1 ,Y/Z=2(Z≠0)

∴X=Z,Y=2Z

∴坐标为(Z:2Z:Z),Z≠0。

即(1:2:1)(2:4:2)(1.2:2.4:1.2)等形如(Z:2Z:Z),Z≠0 的坐标,都是(1,2)在新的坐标体系下的坐标。

我们也可以得到直线的方程 aX+bY+cZ=0(想想为什么?提示:普通平面直角坐标系下直线一般方程是 ax+by+c=0)。

新的坐标体系能够表示无穷远点么?那要让我们先想想无穷远点在哪里。根据上一节的知识,我们知道无穷远点是两条平行直线的交点。那么,如何求两条直线的交点坐标?这是初中的知识,就是将两条直线对应的方程联立求解。

平行直线的方程是:

aX+bY+c1Z =0;

aX+bY+c2Z =0  (c1≠c2); (为什么?提示:可以从斜率考虑,因为平行线斜率相同);

将二方程联立,求解。有

c2Z= c1Z= -(aX+bY)

∵c1≠c2

∴Z=0 

∴aX+bY=0

所以无穷远点就是这种形式(X:Y:0)表示。注意,平常点 Z≠0,无穷远点 Z=0,因此无穷远直线对应的方程是 Z=0。

例 2.2:求平行线 L1:X+2Y+3Z=0 与 L2:X+2Y+Z=0 相交的无穷远点。

解:

因为 L1∥L2

所以有 Z=0, X+2Y=0

所以坐标为(-2Y:Y:0),Y≠0。

即(-2:1:0)(-4:2:0)(-2.4:1.2:0)等形如(-2Y:Y:0),Y≠0 的坐标,都表示这个无穷远点。

看来这个新的坐标体系能够表示射影平面上所有的点,我们就把这个能够表示射影平面上所有点的坐标体系叫做射影平面坐标系。

练习:

1、求点A(2,4) 在射影平面坐标系下的坐标。

2、求射影平面坐标系下点(4.5:3:0.5),在普通平面直角坐标系下的坐标。

3、求直线X+Y+Z=0上无穷远点的坐标。

4、判断:直线aX+bY+cZ=0上的无穷远点 和 无穷远直线与直线aX+bY=0的交点,是否是同一个点?

三、椭圆曲线

上一节,我们建立了射影平面坐标系,这一节我们将在这个坐标系下建立椭圆曲线方程。因为我们知道,坐标中的曲线是可以用方程来表示的(比如:单位圆方程是 x2+y2=1)。椭圆曲线是曲线,自然椭圆曲线也有方程。

椭圆曲线的定义:

一条椭圆曲线是在射影平面上满足如下方程的所有点的集合,且曲线上的每个点都是非奇异(或光滑)的。

Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3                 [3-1]

定义详解:

Y2Z+a1XYZ+a3YZ2 = X3+a2X2Z+a4XZ2+a6Z3 是 Weierstrass 方程(维尔斯特拉斯,Karl Theodor Wilhelm Weierstrass,1815-1897),是一个齐次方程。

椭圆曲线的形状,并不是椭圆的。只是因为椭圆曲线的描述方程,类似于计算一个椭圆周长的方程(计算椭圆周长的方程,我没有见过,而对椭圆线 积分 (设密度为1)是求不出来的),故得名。

我们来看看椭圆曲线是什么样的。

所谓“非奇异”或“光滑”的,在数学中是指曲线上任意一点的偏导数 Fx(x,y,z),Fy(x,y,z),Fz(x,y,z) 不能同时为0。如果你没有学过高等数学,可以这样理解这个词,即满足方程的任意一点都存在切线。下面两个方程都不是椭圆曲线,尽管他们是方程 [3-1] 的形式,因为他们在(0:0:1)点处(即原点)没有切线。

椭圆曲线上有一个无穷远点O∞(0:1:0),因为这个点满足方程[3-1]。

知道了椭圆曲线上的无穷远点。我们就可以把椭圆曲线放到普通平面直角坐标系上了。因为普通平面直角坐标系只比射影平面坐标系少无穷远点。我们在普通平面直角坐标系上,求出椭圆曲线上所有平常点组成的曲线方程,再加上无穷远点O∞(0:1:0),不就构成椭圆曲线了么?

我们设 x=X/Z,y=Y/Z 代入方程 [3-1] 得到:

y2+a1xy+a3y = x3+a2x2+a4x+a6                            [3-2]

也就是说满足方程 [3-2] 的光滑曲线加上一个无穷远点O∞,组成了椭圆曲线。为了方便运算,表述,以及理解,今后论述椭圆曲线将主要使用 [3-2] 的形式。

本节的最后,我们谈一下求椭圆曲线一点的切线斜率问题。由椭圆曲线的定义可以知道,椭圆曲线是光滑的,所以椭圆曲线上的平常点都有切线。而切线最重要的一个参数就是斜率 k 。

例 3.1:求椭圆曲线方程 y2+a1xy+a3y=x3+a2x2+a4x+a6上,平常点 A(x,y) 的切线的斜率 k 。

解:



F(x,y)= y2+a1xy+a3y-x3-a2x2-a4x-a6

求偏导数

Fx(x,y)= a1y-3x2-2a2x-a4

Fy(x,y)= 2y+a1x+a3

则导数为:

f'(x)=- Fx(x,y)/ Fy(x,y)=-( a1y-3x2-2a2x-a4)/(2y+a1x +a3) = (3x2+2a2x+a4-a1y) /(2y+a1x +a3)

所以

k=(3x2+2a2x+a4-a1y) /(2y+a1x +a3)             [3-3]

看不懂解题过程没有关系,记住结论[3-3]就可以了。

练习:      

1、将给出图例的椭圆曲线方程Y2Z=X3-XZ2 和Y2Z=X3+XZ2+Z3转换成普通平面直角坐标系上的方程。

四、椭圆曲线上的加法

上一节,我们已经看到了椭圆曲线的图象,但点与点之间好象没有什么联系。我们能不能建立一个类似于在实数轴上加法的运算法则呢?天才的数学家找到了这一运算法则

自从近世纪代数学引入了群、环、域的概念,使得代数运算达到了高度的统一。比如数学家总结了普通加法的主要特征,提出了加群(也叫交换群,或 Abel(阿贝尔)群),在加群的眼中。实数的加法和椭圆曲线的上的加法没有什么区别。这也许就是数学抽象把。关于群以及加群的具体概念请参考近世代数方面的数学书。

运算法则:任意取椭圆曲线上两点 P、Q (若 P、Q两点重合,则做 P 点的切线)做直线交于椭圆曲线的另一点 R’,过 R’ 做 y 轴的平行线交于 R。我们规定 P+Q=R。(如图)

法则详解:

这里的 + 不是实数中普通的加法,而是从普通加法中抽象出来的加法,他具备普通加法的一些性质,但具体的运算法则显然与普通加法不同。

根据这个法则,可以知道椭圆曲线无穷远点 O∞ 与椭圆曲线上一点 P 的连线交于 P’,过 P’ 作 y 轴的平行线交于 P,所以有 无穷远点 O∞ + P = P 。这样,无穷远点 O∞ 的作用与普通加法中零的作用相当(0+2=2),我们把无穷远点 O∞ 称为零元。同时我们把 P’ 称为 P 的负元(简称,负P;记作,-P)。(参见下图)

根据这个法则,可以得到如下结论 :如果椭圆曲线上的三个点 A、B、C,处于同一条直线上,那么他们的和等于零元,即 A+B+C= O∞

k 个相同的点 P 相加,我们记作 kP。如下图:P+P+P = 2P+P = 3P。

下面,我们利用 P、Q点的坐标 (x1,y1),(x2,y2),求出 R=P+Q 的坐标 (x4,y4)。

例 4.1:求椭圆曲线方程 y2+a1xy+a3y=x3+a2x2+a4x+a6 上,平常点 P(x1,y1),Q(x2,y2) 的和 R(x4,y4) 的坐标。

解:

(1)先求点 -R(x3,y3)

因为 P, Q, -R 三点共线,故设共线方程为

y=kx+b

其中,若 P≠Q (P,Q两点不重合),则直线斜率

k=(y1-y2)/(x1-x2)

若 P=Q (P,Q两点重合),则直线为椭圆曲线的切线,

故由例 3.1 可知:

k=(3x2+2a2x+a4 -a1y) /(2y+a1x+a3)

因此 P, Q, -R 三点的坐标值就是以下方程组的解:

y2+a1xy+a3y=x3+a2x2+a4x+a6                                   [1]

y=(kx+b)                                                                      [2]

将 [2] 代入[1] 有

(kx+b)2+a1x(kx+b)+a3(kx+b) =x3+a2x2+a4x+a6        [3]

对 [3] 化为一般方程,根据三次方程根与系数关系(若方程x³+ax²+bx+c=0 的三个根是 x1、x2、x3,则: x1+x2+x3=-a,x1x2+x2x3+x3x1=b,x1x2x2=-c)

所以

-(x1+x2+x3)=a2-ka1-k2

x3=k2+ka1+a2+x1+x2    --------------------- 求出点 -R 的横坐标

因为

k=(y1-y3)/(x1-x3)



y3=y1-k(x1-x3)    ------------------------------ 求出点 -R 的纵坐标

(2)利用 -R 求 R

显然有

x4=x3=k2+ka1+a2+x1+x2   -------------- 求出点 R 的横坐标

而 y3 y4 为 x=x4 时 方程 y2+a1xy+a3y=x3+a2x2+a4x+a6 的解化为一般方程 y2+(a1x+a3)y-(x3+a2x2+a4x+a6)=0 , 根据二次方程根与系数关系(如果方程 ax²+bx+c=0 的两根为 x1、x2,那么 x1+x2=-b/a,x1x2=c/a)

得:

-(a1x+a3)=y3+y4



y4=-y3-(a1x+a3)=k(x1-x4)-y1-(a1x4+a3)   ----- 求出点 R 的纵坐标

即:

x4=k2+ka1+a2+x1+x2

y4=k(x1-x4)-y1-a1x4-a3

本节的最后,提醒大家注意一点,以前提供的图像可能会给大家产生一种错觉,即椭圆曲线是关于 x 轴对称的。事实上,椭圆曲线并不一定关于 x 轴对称。如下图的 y2-xy=x3+1

五、密码学中的椭圆曲线

我们现在基本上对椭圆曲线有了初步的认识,这是值得高兴的。但请大家注意,前面学到的椭圆曲线是连续的,并不适合用于加密。所以,我们必须把椭圆曲线变成离散的点。

让我们想一想,为什么椭圆曲线为什么连续?是因为椭圆曲线上点的坐标,是实数的(也就是说前面讲到的椭圆曲线是定义在实数域上的),实数是连续的,导致了曲线的连续。因此,我们要把椭圆曲线定义在有限域上(顾名思义,有限域是一种只有由有限个元素组成的域)。

域的概念是从我们的有理数,实数的运算中抽象出来的,严格的定义请参考近世代数方面的数。简单的说,域中的元素同有理数一样,有自己得加法、乘法、除法、单位元(1),零元(0),并满足交换率、分配率。

下面,我们给出一个有限域 Fp,这个域只有有限个元素。

Fp 中只有 p(p为素数)个元素 0, 1, 2 …… p-2, p-1

Fp 的加法(a+b)法则是 a+b≡c (mod p) ,即 (a+c)÷p 的余数和 c÷p 的余数相同。

Fp 的乘法(a×b)法则是 a×b≡c (mod p)

Fp 的除法(a÷b)法则是 a/b≡c (mod p),即 a×b-1≡c  (mod p) ,b-1 也是一个 0 到 p-1 之间的整数,但满足 b×b-1≡1 (mod p);具体求法可以参考初等数论。

Fp 的单位元是 1,零元是 0。

同时,并不是所有的椭圆曲线都适合加密。y2=x3+ax+b是一类可以用来加密的椭圆曲线,也是最为简单的一类。下面我们就把 y2=x3+ax+b 这条曲线定义在 Fp 上:

选择两个满足下列条件的小于 p ( p 为素数) 的非负整数 a、b

4a3+27b2≠0  (mod p)

则满足下列方程的所有点 (x,y),再加上 无穷远点 O∞ ,构成一条椭圆曲线。

y2=x3+ax+b  (mod p)

其中 x,y 属于 0 到 p-1 间的整数,并将这条椭圆曲线记为 Ep(a,b)。

我们看一下 y2=x3+x+1  (mod 23) 的图像

是不是觉得不可思议?椭圆曲线,怎么变成了这般模样,成了一个一个离散的点?椭圆曲线在不同的数域中会呈现出不同的样子,但其本质仍是一条椭圆曲线。举一个不太恰当的例子,好比是水,在常温下,是液体;到了零下,水就变成冰,成了固体;而温度上升到一网络,水又变成了水蒸气。但其本质仍是 H2O。

Fp上的椭圆曲线同样有加法,但已经不能给以几何意义的解释。不过,加法法则和实数域上的差不多,请读者自行对比。

1. 无穷远点 O∞ 是零元,有 O∞ + O∞ = O∞,O∞ + P = P

2. P(x,y) 的负元是 (x,-y),有 P + (-P) = O∞

3. P(x1,y1), Q(x2,y2) 的和 R(x3,y3) 有如下关系:

x3≡k2-x1-x2(mod p) 

y3≡k(x1-x3)-y1(mod p)

    其中

若 P=Q 则 k=(3x2+a)/2y1 

若 P≠Q 则 k=(y2-y1)/(x2-x1)

例 5.1:已知 E23(1,1) 上两点 P(3,10),Q(9,7),求 (1)-P,(2)P+Q,(3) 2P。

解:

(1)  –P的值为(3,-10)

(2)  k=(7-10)/(9-3)=-1/2

2 的乘法逆元为 12, 因为 2*12≡1 (mod 23)

k≡-1*12 (mod 23)

故 k=11

x=112-3-9=109≡17 (mod 23)

y=11[3-(-6)]-10=89≡20 (mod 23)

故 P+Q 的坐标为 (17,20)

3)  k=[3(32)+1]/(2*10)=1/4≡6 (mod 23)

x=62-3-3=30≡20 (mod 23)

y=6(3-7)-10=-34≡12 (mod 23)

故 2P 的坐标为 (7,12)

最后,我们讲一下椭圆曲线上的点的阶。如果椭圆曲线上一点 P,存在最小的正整数 n,使得数乘 nP=O∞,则将 n 称为 P 的阶,若 n 不存在,我们说 P 是无限阶的。 事实上,在有限域上定义的椭圆曲线上所有的点的阶 n 都是存在的(证明,请参考近世代数方面的书)

练习:

1. 求出 E11(1,6) 上所有的点。

2.已知 E11(1,6) 上一点 G(2,7),求 2G 到 13G 所有的值。

六、椭圆曲线上简单的加密/解密

公开密钥算法总是要基于一个数学上的难题。比如 RSA 依据的是:给定两个素数 p、q 很容易相乘得到 n,而对 n 进行因式分解却相对困难。那椭圆曲线上有什么难题呢?

考虑如下等式:

K=kG     [其中 K, G为 Ep(a,b) 上的点,k 为小于 n(n 是点 G 的阶)的整数]

不难发现,给定 k 和 G,根据加法法则,计算 K 很容易;但给定 K 和 G,求 k 就相对困难了。这就是椭圆曲线加密算法采用的难题。我们把点 G 称为基点(base point),k(key point)就是私有密钥。

现在我们描述一个利用椭圆曲线进行加密通信的过程:

1、用户 A 选定一条椭圆曲线 Ep(a,b),并取椭圆曲线上一点,作为基点 G。

2、用户 A 选择一个私有密钥 k,并生成公开密钥 K=kG。

3、用户 A 将 Ep(a,b) 和点 K,G 传给用户 B。

4、用户 B 接到信息后,将待传输的明文编码到 Ep(a,b) 上一点 M(编码方法很多,这里不作讨论),并产生一个随机整数 r(random)。

5、用户 B 计算点 C1=M+rK;C2=rG。

6、用户 B 将 C1、C2 传给用户A。

7、用户 A 接到信息后,计算 C1-kC2,结果就是点 M。因为 C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M ,再对点 M 进行解码就可以得到明文。

在这个加密通信中,如果有一个偷窥者 H ,他只能看到 Ep(a,b)、K、G、C1、C2 而通过 K、G 求 k 或通过 C2、G 求 r 都是相对困难的。因此,H 无法得到 A、B 间传送的明文信息。

密码学中,描述一条 Fp 上的椭圆曲线,常用到六个参量:

T=(p,a,b,G,n,h)

p 、a 、b 用来确定一条椭圆曲线,G 为基点,n 为点 G 的阶,h 是椭圆曲线上所有点的个数 m 与 n 相除的整数部分。这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

1、p 当然越大越安全,但越大,计算速度会变慢,200 位左右可以满足一般安全要求;

2、p≠n×h;

3、pt≠1 (mod n),1≤t<20;

4、4a3+27b2≠0 (mod p);

5、n 为素数;

6、h≤4。

七、椭圆曲线签名在软件保护的应用

我们知道将公开密钥算法作为软件注册算法的好处是:黑客很难通过跟踪验证算法得到注册机。下面,将简介一种利用 Fp(a,b) 椭圆曲线进行软件注册的方法。

软件作者按如下方法制作注册机(也可称为签名过程)

1、选择一条椭圆曲线 Ep(a,b) 和基点 G;

2、选择私有密钥 k;

3、产生一个随机整数 r ;

4、将用户名和点 R 的坐标值 x,y 作为参数,计算 SHA(Secure Hash Algorithm 安全散列算法,类似于 MD5)值,即 Hash=SHA(username,x,y);

5、计算 sn≡r - Hash * k (mod n)

6、将 sn 和 Hash 作为用户名 username 的序列号

软件验证过程如下:(软件中存有椭圆曲线 Ep(a,b) 和基点 G 以及公开密钥 K)

1、从用户输入的序列号中,提取 sn 以及 Hash;

2、计算点 R≡sn*G+Hash*K ( mod p ),如果 sn、Hash 正确,其值等于软件作者签名过程中点 R(x,y) 的坐标,

因为 sn≡r-Hash*k (mod n)

所以 sn*G+Hash*K=(r-Hash*k)*G+Hash*K=rG-Hash*kG+Hash*K=rG-Hash*K+Hash*K=rG=R;

3、将用户名和点 R 的坐标值 x,y 作为参数,计算 H=SHA(username,x,y);

4、如果 H=Hash 则注册成功,如果 H≠Hash ,则注册失败(为什么?提示注意点 R 与 Hash 的关联性)。

简单对比一下两个过程:

作者签名用到了:椭圆曲线 Ep(a,b),基点 G,私有密钥 k,及随机数 r。

软件验证用到了:椭圆曲线 Ep(a,b),基点 G,公开密钥 K。

黑客要想制作注册机,只能通过软件中的 Ep(a,b),点 G,公开密钥 K ,并利用 K=kG 这个关系获得 k 才可以,而求 k 是很困难的。

练习:

下面也是一种常于软件保护的注册算法,请认真阅读,并试回答签名过程与验证过程都用到了那些参数,黑客想制作注册机,应该如何做。

软件作者按如下方法制作注册机(也可称为签名过程)

1、选择一条椭圆曲线 Ep(a,b),和基点 G;

2、选择私有密钥 k;

3、产生一个随机整数 r;

4、将用户名作为参数,计算 Hash=SHA(username);

5、计算 x’=x  (mod n)

6、计算 sn≡(Hash+x’*k)/r (mod n)

7、将 sn 和 x’ 作为用户名 username 的序列号

软件验证过程如下:(软件中存有椭圆曲线 Ep(a,b) 和基点 G 以及公开密钥 K)

1、从用户输入的序列号中,提取 sn 以及 x’;

2、将用户名作为参数,计算 Hash=SHA(username);

3、计算 R=(Hash*G+x’*K)/sn,如果 sn、Hash 正确,其值等于软件作者签名过程中点 R(x,y)

因为 sn≡(Hash+x’*k)/r (mod n)

所以 (Hash*G+x’*K)/sn=(Hash*G+x’*K)/[(Hash+x’*k)/r]=(Hash*G+x’*K)/[(Hash*G+x’*k*G)/(rG)]=rG*[(Hash*G+x’*K)/(Hash*G+x’*K)]=rG=R (mod p)

4、v≡x (mod n)

5、如果 v=x’ 则注册成功。如果 v≠x’ ,则注册失败。

主要参考文献

张禾瑞,《近世代数基础》,高等 教育 出版社,1978

闵嗣鹤 严士健,《初等数论》,高等教育出版社,1982

段云所,《网络信息安全》第三讲,北大计算机系

Michael Rosing ,chapter5《Implementing Elliptic Curve Cryptography》,Softbound,1998

《SEC 1: Elliptic Curve Cryptography》,Certicom Corp.,2000

《IEEE P1363a / D9》,2001

F. 用ECC椭圆曲线加密汉字,密文是问号啊和不熟悉的汉字等组成。我希望加密后的汉字直接是01代码,怎么实现

保密年限到2030年,现在要采用224位以上的ECC。因为ECC加密过程是对点进行操作的,程序中是对二进制数进行运算,所以一定是将待加密的明文转化为01代码,然后01代码通过ECC算法转化为其他的排序的01代码,最后将01代码转化为乱码的汉字。关于c++程序的问题,如果是你自己写的,修改到把数据加密完就停止即可。

G. NandFlash中的ECC校验的作用是先向NandFlash中写数据再读出来比较二者的ECC值,还是怎么应用

ECC确实是写入 spare area, ECC的值是根据写入的数据计算出来的。读出数据以后用数据计算ECC值然后与从spare area读出的ECC值进行比较,如果不对则说明数据有问题。然后根据你具体使用多少位的ECC来判断错误了多少位,如果在ECC的纠错范围内数据是可以恢复出来的,超出了ECC的纠错范围则数据只能是unrecoverble 了

H. 国密算法

国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
国家密码管理局公布的公钥算法,其加密强度为256位
SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。

分组密码算法(DES和SM4)、将明文数据按固定长度进行分组,然后在同一密钥控制下逐组进行加密,
公钥密码算法(RSA和SM2)、公开加密算法本身和公开公钥,保存私钥

摘要算法(SM3 md5) 这个都比较熟悉,用于数字签名,消息认证,数据完整性,但是sm3安全度比md5高

总得来说国密算法的安全度比较高,2010年12月推出,也是国家安全战略,现在银行都要要求国际算法改造,要把国际算法都给去掉

C 语言实现
https://github.com/guan/GmSSL/

Go 语言
https://github.com/tjfoc/gmsm
https://github.com/ZZMarquis/gm

Java 语言
https://github.com/PopezLotado/SM2Java

Go语言实现,调用 gmsm

I. 如何生成ECC算法CSR文件

1.生成ECC算法私钥文件 openssl ecparam -genkey -name prime256v1 -out domain.key
2.生成ECC证书申请CSR文件 openssl req -new -sha265 -key domain.key -out domain_csr.txt
注意事项: ECC算法加密强度有3个选项:prime256v1 /secp384r1/secp521r1,prime256v1 目前已经足够安全,如无特殊需要请保持ECC算法prime256v1 默认即可。 SHA256目前已经足够安全,如无特殊需要请保持默认。

J. ECC椭圆曲线加密算法(一)

btc address:
eth address:

随着区块链的大热,椭圆曲线算法也成了密码学的热门话题。在Bitcoin 生成地址 中使用到了椭圆曲线加密算法。

椭圆曲线的一般表现形式:

椭圆曲线其实不是椭圆形的,而是下面的图形:

Bitcoin使用了 secp256k1 这条特殊的椭圆曲线,公式是:

这个东西怎么加密的呢?

19世纪挪威青年 尼尔斯·阿贝尔 从普通的代数运算中,抽象出了加群(也叫阿贝尔群或交换群),使得在加群中,实数的算法和椭圆曲线的算法得到了统一。是什么意思呢?

我们在实数中,使用的加减乘除,同样可以用在椭圆曲线中!
对的,椭圆曲线也可以有加法、乘法运算。

数学中的群是一个集合,我们为它定义了一个二元运算,我们称之为“加法”,并用符号 + 表示。假定我们要操作的群用𝔾表示,要定义的 加法 必须遵循以下四个特性:

如果在增加第5个条件:
交换律:a + b = b + a

那么,称这个群为阿贝尔群。根据这个定义整数集是个阿贝尔群。

岔开一下话题, 伽罗瓦 阿贝尔 分别独立的提出了群论,他们并称为现代群论的创始人,可惜两位天才都是英年早逝。

如上文所说,我们可以基于椭圆曲线定义一个群。具体地说:

在椭圆曲线上有 不重合且不对称的 A 、B两点,两点与曲线相交于X点, X与 x轴 的对称点为R,R即为 A+B 的结果。这就是椭圆曲线的加法定义。

因为椭圆曲线方程存在 项,因此椭圆曲线必然关于x轴对称

曲线: ,
坐标:A=(2,5),B=(3,7)
A、B正好在曲线上,因为坐标满足曲线公式


那如何找到相交的第三个点呢?

通过 A、B两点确定直线方程,
设直线方程: ,m为直线的斜率

进一步得到c=1。

联立方程:

X(-1,-1)的x坐标-1代入方式正好满足方程,所以A、B两点所在直线与曲线相交于 X(-1,-1),则点X的关于x轴的对称点为R(-1,1),即A(2,5)+B(3,5)=R(-1,1)。

根据椭圆曲线的 群律(GROUP LAW) 公式,我们可以方便的计算R点。

曲线方程:
当A=(x1,y1),B=(x2,y2) ,R=A+B=(x3,y3),x1≠x2时,
, m是斜率
x3=
y3=m(x1-x3)-y1

A=(2,5), B=(3,7) , R=(-1,1) 符合上面的公式。

椭圆曲线加法符合交换律么?

先计算(A+B),在计算 A+B+C

先计算B+C, 在计算 B+C+A

看图像,计算结果相同,大家手动算下吧。

那 A + A 呢, 怎么计算呢?

当两点重合时候,无法画出 “过两点的直线”,在这种情况下,
过A点做椭圆曲线的切线,交于X点,X点关于 x轴 的对称点即为 2A ,这样的计算称为 “椭圆曲线上的二倍运算”。

下图即为椭圆曲线乘法运算:

我们将在 ECC椭圆曲线加密算法(二) 介绍有限域,椭圆曲线的离散对数问题,椭圆曲线加密就是应用了离散对数问题。

参考:

https://eng.paxos.com/blockchain-101-foundational-math
https://eng.paxos.com/blockchain-101-elliptic-curve-cryptography
https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introction/

阅读全文

与ecc算法c语言实现相关的资料

热点内容
被调侃的程序员 浏览:483
哪里有无损音乐app下载 浏览:221
单片机如何使用proteus 浏览:991
java常用的服务器 浏览:281
集结APP在哪里下载 浏览:800
欧洲cf玩什么服务器 浏览:529
如何连接另一台电脑上的共享文件夹 浏览:681
如何让桌面文件夹搬家到e盘 浏览:73
java自动格式化 浏览:619
ipad怎么查看文件夹大小 浏览:583
手工粘土解压球 浏览:552
在线视频教育源码 浏览:41
快四十学什么编程 浏览:754
gnumakelinux 浏览:537
视易峰云服务器怎么改系统 浏览:535
javamap取值 浏览:768
mac和win磁盘加密软件 浏览:474
苹果为什么会连接不到服务器 浏览:726
pdf格式文件如何保存 浏览:303
小霸王服务器tx什么意思 浏览:75