📄 ecc_alfa.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 + -