椭圆曲线ECC签名算法,C语言版代码

1.1 ECC公钥密码简介

(1)椭圆曲线在代数学和几何学上已广泛研究了 150 多年之久,
有丰富而深厚的理论积累。
(2)1985 年, Koblitz 和 Miller 提出 椭圆曲线密码体制
( Elliptic Curve Cryptosystem ,简称 ECC )
(3)椭圆曲线并不是椭圆,之所以称为椭圆曲线是因为它们是用
三次方程来表示的,它的一般形式:
y2 + axy + by = x3 + cx2 + dx + e
其中 a,b,c,d 和e 是满足某些条件的实数。
(4)大多数 的 椭圆曲线密码系统 是在 模p 或F2 下 运 算 。
(5)椭圆曲线已经逐渐被采用,很可能是一个 重要 的发展方向

1.2数学基础

1.2.1椭圆曲线的定义
在实数系中,椭圆曲线可定义成所有满足方程式
E:y2 =x3 +ax+b的点(x,y) 所构成的集合。若方程式没有重复的因式
或 4a3 +27b2 ≠0,則E:y2 =x3 +ax+b 能成为群(group) 。
例如椭圆曲线E:y2 =x3- 7x+3 的 图形 如 下 所示。
在这里插入图片描述
1.2.2有限域上的椭圆曲线
形式: y2 =x3 +ax+b(mod p)
其中: p 是一个素数
a 和b 都是小于p 的非负整数,且满足:
4a3 +27b2 (mod p)≠0
椭圆曲线 有一 个 特殊的 点,记为O ,它并不在椭圆曲线E上,此 点称为 无限远 的 点 (the point at infinity) 。 Ep( a,b)
为在模p 之下 椭圆曲线E 上所有的 点 所 构 成的集合 (包括O )。
点 P= (x ,y )对X 座 标轴 的 对称点为- P= (x ,-y ), 而 称-P 为点P 的 负点 。 若 nP =O 且n 为 最小的正整 数,则n 为椭圆曲线E 上点P 的秩 。 除了 无限远 的 点O 之外 ,椭圆曲线E 上任何可以生成
所有 点 都可 视为 是E 的 生成 数 (generator) , 但 并 不是所有在E上的 点 都可 视为 生成 数。
1.2.3椭圆曲线的相加运算
相异点相加 :假设P 和Q 是 椭圆曲线 上 两个相异的点且P ≠Q 。
若P+Q=R ,则点R 是 经过P 和Q 两点 的 直线与椭圆曲线唯一交
点 的 负点,见下左图。
双倍的点 :令P+P=2P ,则2P 是 经过P 的切 线与椭圆曲线 唯一
交 点 的 负点。见下右图。
在这里插入图片描述
1.2.4椭圆曲线在模P下的运算规则
(i) 对所有点P ∈Ep ,则 P+O=O+P=P , P+ (-P ) =O
(ii) 令P=(x1,y1) ∈ Ep 和Q=(x2,y2) ∈ Ep, 且P ≠-Q ,則
P+Q=R =(x3,y3) ∈ Ep ,其中:
在这里插入图片描述
在这里插入图片描述
(iii) 如果s 和t 为整数 , 則 对 所有的 点P ∈ Ep 而言 ,
(s+t)P=sP+tP
 乘法规则 :
(i) 如果k 为整数 ,則 对 所有的 点P ∈ Ep 而言,
kP=P+P+…+P
(ii) 如果s 和t 为整数 ,則 对 所有的 点P ∈ Ep 而言,
s(tP)= (st )P
1.2.5椭圆群的构造
(1)Ep(a,b) 表示模p 下的椭圆曲线上的整数点,再加上O 。
(2)Ep(a,b) 的 生成过程
(i) 对x=0,1,…,p-1, 计算x3+ax+b(mod p)
(ii) 对于上一步骤得到的每一结果确定它是否有一个模p 的平方根,如果没有,则Ep(a,b) 中没有具有与该结果相应x 坐标的点。如果有,就有两个平方根y 和p-y ,从而点(x,y) 和(x,p-y) 都是Ep(a,b) 的点(如果y=0, 只有(x,0) 一个点)。
(3)如取p=23,a=b=1, 有413+2712 (mod23 )=8 ≠0 ,则y2 =x3 +x+1是椭圆曲线。E 23 (1,1) 是一个模 23 的椭圆群。

1.3ECC公私钥对生成

(1)选择一个椭圆曲线 E:y2 =x3 +ax+b(mod p), 构造一个椭圆群Ep(a ,b)
(2)在Ep(a,b) 中挑选生成元点G=(x1 ,y1) ,G 应使得满足nG = O 的最小的n 是一个非常大的素数.
(3)选择一个小于n 的整数nA 作为其 私钥 ,然后产生其 公钥PA=nAG ;
注:公开的信息: (E ,G ,n ,PA)
|Ep| 表示 椭圆群Ep(a ,b) 的元素个数,n 是|Ep| 的素因子 。

1.4ECC加密算法

  1. 发送方签名
    1)选择一个随机的key kE 0<kE<n

2)计算 R = kE A
3)令 r ≡ x R ( m o d p ) ,即 r 为 R 的 x 坐标对 p 求模
4)计算 s ≡ ( h ( x ) + d ⋅ r ) k E^ − 1 ( m o d q )
则生成的 ( r , s ) 就是数字签名。之后发送方将 ( s , ( r , s ) ) 发送给接收方

2.接收方验证
1)计算 u 1 ≡ s^ − 1 ⋅ h ( x ) ( m o d q )
2)计算 u 2 ≡ s − 1 ⋅ r ( m o d q )
3)计算 P = u 1 A + u 2 B
4)进行验证
x P = {
≡ r ( m o d q ) → 签 名 有 效
/≡ r ( m o d q ) → 签 名 无 效
{
这里的− 1 表示在模运算中求逆,在Z p
中,一个数 a 与它的逆 a^ − 1
满足 a ⋅ a − 1 ≡ 1 ( m o d p )

#include <stdio.h>
#include <math.h>
int xy[22];

#define N 23
#define A 1
//#define M 29
#define a1 1
#define b1 4
typedef struct point{
   
   
	int x;
	int y;
}Point;
typedef struct ecc{
   
   
	struct point p[100];
	int len;
}ECCPoint;
typedef struct generator{
   
   
	Point p;
	int p_class;
}GENE_SET;
ECCPoint eccPoint;
Point mul(Point p1,Point p2);
Point add_two_points(Point p1,Point p2);
GENE_SET geneSet[100];
int geneLen;
//判断平方根是否为整数 
int int_sqrt(int s)
{
   
   
	int temp;
	temp=(int)sqrt(s);//转为整型 
	if(temp*temp==s)
	{
   
   
		return temp;
	}else{
   
   
		return -1;
	}
}
//取模函数
int mod_p(int s)
{
   
   
	int i;	//保存s/p的倍数
	int result;	//模运算的结果
	i = s / N;
	result = s - i * N;
	if (result >= 0)
	{
   
   
		return result;
	}
	else
	{
   
   
		return result + N;
	}
}
//打印点集 
void print() 
{
   
   
	int i;
	int len=eccPoint.len;
	printf("\n该椭圆曲线上共有%d个点(包含无穷远点)\n",len+1);
	for(i=0;i<len;i++)
	{
   
   
		if(i % 8==0)
		{
   
   
			printf("\n");
		}
		printf("(%2d,%2d)\t",eccPoint.p[i].x,eccPoint.p[i].y);
	}
	printf("\n");
}
//task1:求出椭圆曲线上所有点 
void get_all_points()
{
   
   
	int i=0;
	int j=0;
	int s,y=0;
	int n=0,q=0;
	int modsqrt=0; 
	int flag=0;
	if ( a1 * a1 * a1 + b1 * b1+4 != 0)
	{
   
   
		for(i=0;i<=N-1;i++)
		{
   
   
			flag=0;
			n=1;
			y
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值