📄 shamir.c
字号:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//////////////////////////测试素数
int TestPrime(int p)
{
int k=sqrt(p);
int i;
for (i=2;i<=k;i++)
{
if (p%i==0) {return 0;break;}
}
if(i>k) return 1;
}
//////////////////////////g(x)方程 HOHO
int function(int x,int a2,int a1,int a0)
{
int y;
y=(a2*x*x+a1*x+a0);
return y;
}
//////////////////////////随机获取一个不大于n的数
int gec(int n)
{
int e;
e=rand()%n;
return e;
}
///////////////////////////随机获取不大于m的素数
int gecp(int m)
{
int p;
do
{
p=rand()%m;
if(TestPrime(p)==1) break;
}
while(1);
return p;
}
///////////////////////////求逆函数
int Athwart(int e,int n)
{
int n1=n;
int n2=e;
int b1=0;
int b2=1;
int t;
int q;
int r;
do
{
q=n1/n2;
r=n1-q*n2;
if (r==0) break;
n1=n2;
n2=r;
t=b2;
b2=b1-q*b2;
b1=t;
}
while (1);
if (n2!=1)
return (0);
if (b2<0)
return (b2+n);
else
return (b2);
}
///////////////////////////求分母,并取正
int intgere(int x,int y,int p)
{
int z;
if(x>y) z=x-y;
else z=x-y+p;
return z;
}
////////////////////////// 求b函数(还原K函数里面有用)
int calcuB(int x1,int x2,int x3,int p)
{
int a,b,c;
b=Athwart(intgere(x1,x3,p),p)%p;
c=Athwart(intgere(x2,x3,p),p)%p;
a=(b*c*x1*x2)%p;
return a;
}
//////////////////////////还原K的函数
int calcuK(int x1,int x2,int x3,int y1,int y2,int y3,int p)
{
int b1,b2,b3,k;
b1=calcuB(x2,x3,x1,p);
b2=calcuB(x1,x3,x2,p);
b3=calcuB(x2,x1,x3,p);
k=((b1*y1)%p+(b2*y2)%p+(b3*y3)%p)%p;
return k;
}
int main()
{
//srand(time(NULL));
int a0,a1,a2;
int k;
int n,m;
int p;
int x[5]; //////存放x的值
int xx[3]; //////存放x的随机下标
int y[5]; //////存放y的值
int i,j;
///////////////素数p的大小范围
m=300;
////////////////获取素数p
p=gecp(m);
printf("Output p: %d\n",p);
/////////////////n的取值范围不大于p
n=p;
//////////////////随机获取一个g(x)函数的系数
a1=gec(n);
a2=gec(n);
a0=gec(n);
///////////////////随机选取5个子密钥对
x[0]=gec(n);
for(i=1;i<5;i++)
{
x[i]=gec(n);
for(j=0;j<i;j++)
if(x[i]==x[j]) {i--;break;}
}
for(i=0;i<5;i++)
{
y[i]=function(x[i],a2,a1,a0);
}
////////////////输出密钥对 HOHO
printf("\nGenerate Keys: \n");
for(i=0;i<5;i++)
printf("(%d,%d) \n",x[i],y[i]);
///////////////输出g(x)函数的系数
printf("\nOutput g(x): a0=%d,a1=%d,a2=%d\n",a0,a1,a2);
//////////////随机选取3对密钥对并输出,(XX数组存放x数组的下标 )
printf("\nChoose s keys:\n");
xx[0]=gec(n)%5;
for(i=1;i<3;i++)
{
xx[i]=gec(n)%5;
for(j=0;j<i;j++)
if(xx[i]==xx[j]) i--;
}
for(i=0;i<3;i++)
printf("(%d,%d) \n",x[xx[i]],y[xx[i]]);
//////////////计算k并且输出
printf("\nOutput k:");
k = calcuK(x[xx[0]],x[xx[1]],x[xx[2]],y[xx[0]],y[xx[1]],y[xx[2]],p);
printf("%d\n",k);
///////////////结束!
system("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -