热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ecc签名体制c语言代码大全,ECC算法C语言实现Go语言中文社区

密码学实验:ECC算法实现1.实验内容2.运行结果:1.椭圆曲线上的点集2.椭圆曲线生成元以及对应的阶3.加解密算法代码如下:*(1)编程

密码学实验:ECC算法实现

1.实验内容

34cce5ed691ebcb4e62d5923d44e281f.png

2.运行结果:

1.椭圆曲线上的点集

d41fd68de285bb1bffe07086936f0dc9.png

2.椭圆曲线生成元以及对应的阶

dc7fa6c64f52dc5ad0b18c0e1021daa2.png

3.加解密算法

d025d6a2ac48cc0d01095ba2bf33094c.png

代码如下:

/*

(1)编程计算该椭圆曲线上所有在有限域GF(89)上的点;

(2)编程实现椭圆曲线上任意一个点P(例如P=(12,5))的倍点运算的递归算法,即计算k*P( k=2,3,…);(重点!)

(3)利用此递归算法找出椭圆曲线上的所有生成元G以及它们的阶n,即满足n*G=O;

(4)设计实现某一用户B的公钥、私钥算法,即得到public key=(n, G, PB, Ep(a, b))

secure key=nB(小于n)

(5)假如用户A发送明文消息“yes”并加密传输给用户B,用户B接收消息后要能解密为明文。试用ECC密码体制实现此功能。

*/

#include

#include

#include

#include

#include

#define MAX 100

typedef struct point{

int point_x;

int point_y;

}Point;

typedef struct ecc{

struct point p[MAX];

int len;

}ECCPoint;

typedef struct generator{

Point p;

int p_class;

}GENE_SET;

void get_all_points();

int int_sqrt(int s);

Point timesPiont(int k,Point p);

Point add_two_points(Point p1,Point p2);

int inverse(int n,int b);

void get_generetor_class();

void encrypt_ecc();

void decrypt_ecc();

int mod_p(int s);

void print();

int isPrime(int n);

char alphabet[26]="abcdefghijklmnopqrstuvwxyz";

int a=-1,b=0,p=89;//椭圆曲线为E89(-1,0): y2=x3-x (mod 89)

ECCPoint eccPoint;

GENE_SET geneSet[MAX];

int geneLen;

char plain[]="yes";

int m[MAX];

int cipher[MAX];

int nB;//私钥

Point P1,P2,Pt,G,PB;

Point Pm;

int C[MAX];

int main()

{

get_generetor_class();

encrypt_ecc();

decrypt_ecc();

return 0;

}

//task4:加密

void encrypt_ecc()

{

int num,i,j;

int gene_class;

int num_t;

int k;

srand(time(NULL));

//明文转换过程

for(i=0;i

{

for(j&#61;0;j<26;j&#43;&#43;) //for(j&#61;0;j<26;j&#43;&#43;)

{

if(plain[i]&#61;&#61;alphabet[j])

{

m[i]&#61;j;//将字符串明文换成数字&#xff0c;并存到整型数组m里面

}

}

}

//选择生成元

num&#61;rand()%geneLen;

gene_class&#61;geneSet[num].p_class;

while(isPrime(gene_class)&#61;&#61;-1)//不是素数

{

num&#61;rand()%(geneLen-3)&#43;3;

gene_class&#61;geneSet[num].p_class;

}

//printf("gene_class&#61;%dn",gene_class);

G&#61;geneSet[num].p;

//printf("G:(%d,%d)n",geneSet[num].p.point_x,geneSet[num].p.point_y);

nB&#61;rand()%(gene_class-1)&#43;1;//选择私钥

PB&#61;timesPiont(nB,G);

printf("n公钥&#xff1a;n");

printf("{y^2&#61;x^3%d*x&#43;%d,%d,(%d,%d),(%d,%d)}n",a,b,gene_class,G.point_x,G.point_y,PB.point_x,PB.point_y);

printf("私钥&#xff1a;n");

printf("nB&#61;%dn",nB);

//加密

//

k&#61;rand()%(gene_class-2)&#43;1;

P1&#61;timesPiont(k,G);

//

num_t&#61;rand()%eccPoint.len; //选择映射点

Pt&#61;eccPoint.p[num_t];

//printf("Pt:(%d,%d)n",Pt.point_x,Pt.point_y);

P2&#61;timesPiont(k,PB);

Pm&#61;add_two_points(Pt,P2);

printf("加密数据&#xff1a;n");

printf("kG&#61;(%d,%d),Pt&#43;kPB&#61;(%d,%d),C&#61;{",P1.point_x,P1.point_y,Pm.point_x,Pm.point_y);

for(i&#61;0;i

{

//num_t&#61;rand()%eccPoint.len; //选择映射点

//Pt&#61;eccPoint.p[num_t];

C[i]&#61;m[i]*Pt.point_x&#43;Pt.point_y;

printf("{%d}",C[i]);

}

printf("}n");

}

//task5:解密

void decrypt_ecc()

{

Point temp,temp1;

int m,i;

temp&#61;timesPiont(nB,P1);

temp.point_y&#61;0-temp.point_y;

temp1&#61;add_two_points(Pm,temp);//求解Pt

//printf("(%d,%d)n",temp.point_x,temp.point_y);

//printf("(%d,%d)n",temp1.point_x,temp1.point_y);

printf("n解密结果&#xff1a;n");

for(i&#61;0;i

{

m&#61;(C[i]-temp1.point_y)/temp1.point_x;

printf("%c",alphabet[m]);//输出密文

}

printf("n");

}

//判断是否为素数

int isPrime(int n)

{

int i,k;

k &#61; sqrt(n);

for (i &#61; 2; i <&#61; k;i&#43;&#43;)

{

if (n%i &#61;&#61; 0)

break;

}

if (i <&#61;k){

return -1;

}

else {

return 0;

}

}

//task3:求生成元以及阶

void get_generetor_class()

{

int i,j&#61;0;

int count&#61;1;

Point p1,p2;

get_all_points();

//p1.point_x&#61;p2.point_x&#61;3;

//p1.point_y&#61;p2.point_y&#61;2;

//while(1)

//{

//printf("(%d,%d)&#43;(%d,%d)---%dn",p1.point_x,p1.point_y,p2.point_x,p2.point_y,count);

//p2&#61;add_two_points(p1,p2);

//count&#43;&#43;;

//if(p2.point_x&#61;&#61;-1 && p2.point_y&#61;&#61;-1)

//{

//break;

//}

//}

//printf("nn(%d,%d)---%dn",p1.point_x,p1.point_y,count);

//

//do{

//printf("(%d,%d)&#43;(%d,%d)---%dn",p1.point_x,p1.point_y,p2.point_x,p2.point_y,count);

//p2&#61;add_two_points(p1,p2);

//count&#43;&#43;;

//

//} while(!((p2.point_x&#61;&#61;p1.point_x)&&(p2.point_y&#61;&#61;p1.point_y)));

//printf("(%d,%d)&#43;(%d,%d)---%dn",p1.point_x,p1.point_y,p2.point_x,p2.point_y,count);

//count &#43;&#43; ;

//printf("nn(%d,%d)---%dn",p1.point_x,p1.point_y,count);

printf("n**********************************输出生成元以及阶&#xff1a;*************************************n");

for(i&#61;0;i

{

count&#61;1;

p1.point_x&#61;p2.point_x&#61;eccPoint.p[i].point_x;

p1.point_y&#61;p2.point_y&#61;eccPoint.p[i].point_y;

while(1)

{

p2&#61;add_two_points(p1,p2);

if(p2.point_x&#61;&#61;-1 && p2.point_y&#61;&#61;-1)

{

break;

}

count&#43;&#43;;

if(p2.point_x&#61;&#61;p1.point_x)

{

break;

}

}

count&#43;&#43;;

if(count<&#61;eccPoint.len&#43;1)

{

geneSet[j].p.point_x&#61;p1.point_x;

geneSet[j].p.point_y&#61;p1.point_y;

geneSet[j].p_class&#61;count;

printf("(%d,%d)--->>%dt",geneSet[j].p.point_x,geneSet[j].p.point_y,geneSet[j].p_class);

j&#43;&#43;;

if(j % 6 &#61;&#61;0){

printf("n");

}

}

geneLen&#61;j;

}

}

//task2:倍点运算的递归算法

Point timesPiont(int k,Point p0)

{

if(k&#61;&#61;1){

return p0;

}

else if(k&#61;&#61;2){

return add_two_points(p0,p0);

}else{

return add_two_points(p0,timesPiont(k-1,p0));

}

}

//两点的加法运算

Point add_two_points(Point p1,Point p2)

{

long t;

int x1&#61;p1.point_x;

int y1&#61;p1.point_y;

int x2&#61;p2.point_x;

int y2&#61;p2.point_y;

int tx,ty;

int x3,y3;

int flag&#61;0;

//求

if((x2&#61;&#61;x1)&& (y2&#61;&#61;y1) )

{

//相同点相加

if(y1&#61;&#61;0)

{

flag&#61;1;

}else{

t&#61;(3*x1*x1&#43;a)*inverse(p,2*y1) % p;

}

//printf("inverse(p,2*y1)&#61;%dn",inverse(p,2*y1));

}else{

//不同点相加

ty&#61;y2-y1;

tx&#61;x2-x1;

while(ty<0)

{

ty&#43;&#61;p;

}

while(tx<0)

{

tx&#43;&#61;p;

}

if(tx&#61;&#61;0 && ty !&#61;0)

{

flag&#61;1;

}else{

t&#61;ty*inverse(p,tx) % p;

}

}

if(flag&#61;&#61;1)

{

p2.point_x&#61;-1;

p2.point_y&#61;-1;

}else{

x3&#61;(t*t-x1-x2) % p;

y3&#61;(t*(x1-x3)-y1) % p;

//使结果在有限域GF(P)上

while(x3<0)

{

x3&#43;&#61;p;

}

while(y3<0)

{

y3&#43;&#61;p;

}

p2.point_x&#61;x3;

p2.point_y&#61;y3;

}

return p2;

}

//求b关于n的逆元

int inverse(int n,int b)

{

int q,r,r1&#61;n,r2&#61;b,t,t1&#61;0,t2&#61;1,i&#61;1;

while(r2>0)

{

q&#61;r1/r2;

r&#61;r1%r2;

r1&#61;r2;

r2&#61;r;

t&#61;t1-q*t2;

t1&#61;t2;

t2&#61;t;

}

if(t1>&#61;0)

return t1%n;

else{

while((t1&#43;i*n)<0)

i&#43;&#43;;

return t1&#43;i*n;

}

}

//task1:求出椭圆曲线上所有点

void get_all_points()

{

int i&#61;0;

int j&#61;0;

int s,y&#61;0;

int n&#61;0,q&#61;0;

int modsqrt&#61;0;

int flag&#61;0;

if (4 * a * a * a &#43; 27 * b * b !&#61; 0)

{

for(i&#61;0;i<&#61;p-1;i&#43;&#43;)

{

flag&#61;0;

n&#61;1;

y&#61;0;

s&#61; i * i * i &#43; a * i &#43; b;

while(s<0)

{

s&#43;&#61;p;

}

s&#61;mod_p(s);

modsqrt&#61;int_sqrt(s);

if(modsqrt!&#61;-1)

{

flag&#61;1;

y&#61;modsqrt;

}else{

while(n<&#61;p-1)

{

q&#61;s&#43;n*p;

modsqrt&#61;int_sqrt(q);

if(modsqrt!&#61;-1)

{

y&#61;modsqrt;

flag&#61;1;

break;

}

flag&#61;0;

n&#43;&#43;;

}

}

if(flag&#61;&#61;1)

{

eccPoint.p[j].point_x&#61;i;

eccPoint.p[j].point_y&#61;y;

j&#43;&#43;;

if(y!&#61;0)

{

eccPoint.p[j].point_x&#61;i;

eccPoint.p[j].point_y&#61;(p-y) % p;

j&#43;&#43;;

}

}

}

eccPoint.len&#61;j;//点集个数

print(); //打印点集

}

}

//取模函数

int mod_p(int s)

{

int i;//保存s/p的倍数

int result;//模运算的结果

i &#61; s / p;

result &#61; s - i * p;

if (result >&#61; 0)

{

return result;

}

else

{

return result &#43; p;

}

}

//判断平方根是否为整数

int int_sqrt(int s)

{

int temp;

temp&#61;(int)sqrt(s);//转为整型

if(temp*temp&#61;&#61;s)

{

return temp;

}else{

return -1;

}

}

//打印点集

void print()

{

int i;

int len&#61;eccPoint.len;

printf("n该椭圆曲线上共有%d个点(包含无穷远点)n",len&#43;1);

for(i&#61;0;i

{

if(i % 8&#61;&#61;0)

{

printf("n");

}

printf("(%2d,%2d)t",eccPoint.p[i].point_x,eccPoint.p[i].point_y);

}

printf("n");

}



推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
author-avatar
落地有声800_491_431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有