⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecc_alfa.c

📁 1、DES加密示例程序
💻 C
字号:
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "time.h"

#define A 1
#define B 1
#define P 193

long LamdaDif(long *x, long *y);
long Lamda(long *x, long *y);
long LamdaDifF(long *x, long *y);

long t1[3] = {0}, t2[3] = {0};

long GCD(long m, long n)
{
	long temp = 0;
	if(m == 0 && n == 0)	return 1;
	else if(m == 0)	return n;
		else if(n == 0) return m;
			else
			{
				if(m > n)
				{
					temp = m % n;
					if(temp == 0)	return n;
					else
					{
						m = temp;
						temp = GCD(m, n);
					}
				}
				else
				{
					temp = n % m;
					if(temp == 0)	return m;
					else
					{
						n = temp;
						temp = GCD(m, n);
					}
				}
			}
}

long GetReverse(long d/*, long *t1, long *t2*/)
{
	int i = 0;
	long temp = d;
	for(i = 0; i < P-3; i ++)
	{
		d = (d * temp) % P;
	}
	return d % P;
/*
	long Q = 0, i = 0;
	long t[3] = {0};
	
	t1[0] = 1; t1[1] = 0; t1[2] = P;
	t2[0] = 0; t2[1] = 1; t2[2] = d;
	while(1)
	{
		if(t2[2] == 0)	return -1;
		else if(t2[2] == 1)	
		{
			if(t2[1] < 0)	t2[1] += P;
			return t2[1];
		}
		Q = t1[2] / t2[2];
		t[0] = t1[0] - Q * t2[0];
		t[1] = t1[1] - Q * t2[1];
		t[2] = t1[2] - Q * t2[2];
		for(i = 0; i < 3; i++)
		{
			t1[i] = t2[i];
			t2[i] = t[i];
		}
	}
*/
}

void init(long *g)
{
	printf("\n\t======= Elliptic Curves Crypto =======");
	printf("\n\t# Y^2 = X^3 + Ax + B (A = 1, B = 1)  #");
	printf("\n\t#    The Selected Point G is (1, 3)  #");
	printf("\n\t============== F(193) ================");
	printf("\n\tEnter the x Value: ");
	scanf("%ld", g);
	printf("\tEnter the y Value: ");
	scanf("%ld", g+1);
}

long Add(long *x, long *y)
{
	long L = 0, count = 0, buf1 = 0, buf2 = 0, i = 1024;
	
	x[1] = x[0];	y[1] = y[0];
	while(i--)
	{
		++ count;
		if(x[1] == x[0] && y[1] == y[0])	/*P = Q*/
		{
			L = Lamda(x, y);
		}
		else						/*P != Q*/
		{
			L = LamdaDif(x, y);
		}
		x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
		y[2] = (L * (x[0] - x[2]) - y[0] + (37526/P)*P) % P;
		/*if(y[2] < 0)	y[2] = (y[2] + P) % P;*/
		if(x[2] == x[0] && y[0] + y[2] == P)	break;
		printf("[%3ld,%3ld] ", x[2], y[2]);
		buf1 = y[1];	buf2 = x[1];
		y[1] = y[2];	x[1] = x[2];
		y[2] = buf1;	x[2] = buf2;
	}
	return count;
}

long *GeneratePA(long N, long *Pa, long *x, long *y, long *Na)
{
	long i = 0, L = 0, buf1 = 0, buf2 = 0;
	x[1] = x[0];	y[1] = y[0];
	printf("\n\tEnter The Na Between 1--%ld: ", N);
	scanf("%ld", Na);
	
	L = Lamda(x, y);
	x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
	y[2] = (L * (x[0] - x[2]) - y[0] + (32576/P)*P) % P;
	buf1 = y[1];	buf2 = x[1];
	y[1] = y[2];	x[1] = x[2];
	y[2] = buf1;	x[2] = buf2;
	
	for(i=0; i < *Na-1; i++)
	{
		if(x[1] == x[0] && y[1] == y[0])	/*P = Q*/
		{
			L = Lamda(x, y);
		}
		else						/*P != Q*/
		{
			L = LamdaDif(x, y);
		}
		x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
		y[2] = (L * (x[0] - x[2]) - y[0] + (32576/P)*P) % P;
		
		buf1 = y[1];	buf2 = x[1];
		y[1] = y[2];	x[1] = x[2];
		y[2] = buf1;	x[2] = buf2;
	}
	Pa[0] = x[1];	Pa[1] = y[1];
	return Pa;
}

long *rG(long r, long *x, long *y, long *C1)
{
	long i = 0, L = 0, buf1 = 0, buf2 = 0;
	x[1] = x[0];	y[1] = y[0];
	
	L = Lamda(x, y);
	x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
	y[2] = (L * (x[0] - x[2]) - y[0] + (32576/P)*P) % P;
	if(y[2] < 0) y[2] = (y[2] + P) % P;
	buf1 = y[1];	buf2 = x[1];
	y[1] = y[2];	x[1] = x[2];
	y[2] = buf1;	x[2] = buf2;
	
	for(i=0; i < r-1; i++)
	{
		if(x[1] == x[0] && y[1] == y[0])	/*P = Q*/
		{
			L = Lamda(x, y);
		}
		else						/*P != Q*/
		{
			L = LamdaDif(x, y);
		}
		x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
		y[2] = (L * (x[0] - x[2]) - y[0] + (32576/P)*P) % P;
		
		buf1 = y[1];	buf2 = x[1];
		y[1] = y[2];	x[1] = x[2];
		y[2] = buf1;	x[2] = buf2;
	}
	C1[0] = x[1];	C1[1] = y[1];
	return C1;
}

long *rGF(long r, long *x, long *y, long *C1)
{
	long i = 0, L = 0, buf1 = 0, buf2 = 0;
	x[1] = x[0];	y[1] = y[0];
	
	L = Lamda(x, y);
	x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
	y[2] = (L * (x[0] - x[2]) - y[0] + (32576/P)*P) % P;
	buf1 = y[1];	buf2 = x[1];
	y[1] = y[2];	x[1] = x[2];
	y[2] = buf1;	x[2] = buf2;
	
	for(i=0; i < r-1; i++)
	{
		if(x[1] == x[0] && y[1] == y[0])	/*P = Q*/
		{
			L = Lamda(x, y);
		}
		else						/*P != Q*/
		{
			L = LamdaDifF(x, y);
			if(L == -1)
			{
				x[2] = -1;
				return x;
			}
		}
		x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
		y[2] = (L * (x[0] - x[2]) - y[0] + (32576/P)*P) % P;
		
		buf1 = y[1];	buf2 = x[1];
		y[1] = y[2];	x[1] = x[2];
		y[2] = buf1;	x[2] = buf2;
	}
	C1[0] = x[1];	C1[1] = y[1];
	return C1;
}

long *GenerateC2(long *x, long *y, long *C2, long *Pm, long *rPa)
{
	long L = 0;
	
	x[0] = Pm[0];	x[1] = rPa[0];
	y[0] = Pm[1];	y[1] = rPa[1];
	L = LamdaDif(x, y);
	x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
	y[2] = (L * (x[0] - x[2]) - y[0] + (32576/P)*P) % P;
	
	C2[0] = x[2];	C2[1] = y[2];
	return C2;
}

long *Decrypt(long *x, long *y, long *C2, long *C1, long *Pm)
{
	long L = 0;
	
	x[0] = C2[0];	x[1] = C1[0];
	y[0] = C2[1];	y[1] = P - C1[1];
	L = LamdaDif(x, y);
	x[2] = ((L * L) - (x[0] + x[1]) + (32576/P)*P) % P;
	y[2] = (L * (x[0] - x[2]) - y[0] + (32576/P)*P) % P;
	
	Pm[0] = x[2];	Pm[1] = y[2];
	return Pm;
}

void main()
{
	long x[3] = {0}, y[3] = {0}, Pa[2] = {0}, C1[2] = {0}, C2[2] = {0}, Pm[2] = {0}, rPa[2] = {0};
	long N = 0, Na = 0, r = 0, i = 0, j = 0;
	long g[2] = {0}, temp = 0;
	int M = 3;
	char ch = '\0';
	
	clrscr();
LOP:	randomize();
	r = random(3);
	if(r == 0)	r ++;
	/*Select G(x,y)*/
	init(g);
	printf("\n\tG=(%ld, %ld)\n", g[0], g[1]);
	x[0] = g[0];
	y[0] = g[1];
	/*End*/
	/*GeneratePA*/
	N = Add(x, y);
	x[0] = g[0];
	y[0] = g[1];
	GeneratePA(N, Pa, x, y, &Na);
	printf("\n\tNa is: %ld\n", Na);
	printf("\n\tThe Random r is: %ld\n", r);
	printf("\n\tPa=(%ld, %ld)\n", Pa[0], Pa[1]);
	/*End*/
	printf("\n\tEnter a test letter: ");	getchar();
	scanf("%c", &ch);
	M = ch;
	printf("\n\tM is %d\n", M);
	for(i = 0; 2*M + i < P; i++)
	{
		x[0] = 2*M + i;
		for(j = 1; j < P; j++)
		{
			temp = (j * j) % P;
			if(temp == ((x[0] * x[0] * x[0] + x[0] + 1) % P))
			{
				Pm[0] = x[0];
				Pm[1] = j;
				goto LOP2;
			}
		}
	}
	
LOP2:	printf("\n\tPm=(%ld, %ld)\n", Pm[0], Pm[1]);
	/*Encrypt*/
	/*printf("\n\tThe Random Num is %d", r);*/
	x[0] = g[0];
	y[0] = g[1];
	rG(r, x, y, C1);
	printf("\n\trG:<%ld,%ld>\n", C1[0], C1[1]);
	x[0] = Pa[0];
	y[0] = Pa[1];
	rG(r, x, y, rPa);
	printf("\n\trPa:<%ld,%ld>\n", rPa[0], rPa[1]);
	GenerateC2(x, y, C2, Pm, rPa);
	printf("\n\tC:[rG,Pm + rPa]  C:[(%ld, %ld),(%ld, %ld)]\n", C1[0], C1[1], C2[0], C2[1]);
	/*End*/
	/*Decrypt*/
	x[0] = C1[0];
	y[0] = C1[1];
	rGF(Na, x, y, C1);
	if(x[2] == -1)
	{
		printf("\n\tUnsuitble Na or r, Retry\n");
		goto LOP;
	}
	printf("\n\tNa(rG):<%ld,%ld>\n", C1[0], C1[1]);
	Decrypt(x, y, C2, C1, Pm);
	printf("\n\tPm=(%ld, %ld)\n", Pm[0], Pm[1]);
	printf("\n\tDecrypted M = (Pm[0]/2): %d", Pm[0]/2);
	getchar();
	scanf("%c", ch);
	/*End*/
}

long LamdaDif(long *x, long *y)
{
	long temp = 0, temp1 = 0, temp2 = 0, divisor = 0, dividend = 0, tag = 0, gcd = 0;

	divisor = x[1] - x[0];
	if(divisor < 0)
	{
		tag = 1;
		divisor = fabs(divisor);
	}
	
	dividend = y[1] - y[0];
	if(tag == 1)
	{
		dividend *= -1;
	}
	
	temp1 = fabs(divisor);	
	temp2 = fabs(dividend);
	gcd = GCD(temp1, temp2);

	dividend /= gcd;
	divisor /= gcd;
	divisor = GetReverse(divisor/*, t1, t2*/);

	temp = (((dividend + (32576/P)*P) % P) * (divisor % P)) % P;
	return temp;
}

long LamdaDifF(long *x, long *y)
{
	long temp = 0, temp1 = 0, temp2 = 0, divisor = 0, dividend = 0, tag = 0, gcd = 0;

	divisor = x[1] - x[0];
	if(divisor == 0)	return -1;
	if(divisor < 0)
	{
		tag = 1;
		divisor = fabs(divisor);
	}
	
	dividend = y[1] - y[0];
	if(tag == 1)
	{
		dividend *= -1;
	}
	
	temp1 = fabs(divisor);	
	temp2 = fabs(dividend);
	gcd = GCD(temp1, temp2);

	dividend /= gcd;
	divisor /= gcd;
	divisor = GetReverse(divisor/*, t1, t2*/);
	temp = (((dividend + (32576/P)*P) % P) * (divisor % P)) % P;
	return temp;
}

long Lamda(long *x, long *y)
{
	long temp = 0, temp1 = 0, temp2 = 0, divisor = 0, dividend = 0, tag = 0, gcd = 0;

	divisor = 2 * y[0];
	if(divisor < 0)
	{
		tag = 1;
		divisor = fabs(divisor);
	}
	
	dividend = 3 * x[0] * x[0] + A;
	if(tag == 1)
	{
		dividend *= -1;
	}
	temp1 = fabs(divisor);	
	temp2 = fabs(dividend);
	gcd = GCD(temp1, temp2);

	dividend /= gcd;
	divisor /= gcd;
	divisor = GetReverse(divisor/*, t1, t2*/);
	temp = (((dividend + (32576/P)*P) % P) * (divisor % P)) % P;
	return temp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -