热门标签 | 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");

}



推荐阅读
  • 你的问题在于:1. 代码格式混乱,缺乏必要的缩进,导致可读性极低;2. 使用 `strlen()` 和 `malloc()` 函数时,必须包含相应的头文件;3. `write()` 函数的返回值处理不当,建议检查并处理其返回值以确保程序的健壮性。此外,建议在编写代码时遵循良好的编程规范,增加代码的可维护性和可读性。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • String字符串与字符数组#includeStringintmain(){char*strhello;字符串与字符数组的关系:字符串是 ... [详细]
  • Halcon之图像梯度、图像边缘、USM锐化
    图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像卷积:1.模糊2.梯度3.边缘4.锐化1.视频教程:B站、 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • 文章目录Golang定时器Timer和Tickertime.Timertime.NewTimer()实例time.AfterFunctime.Tickertime.NewTicke ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
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社区 版权所有