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

📄 shamir.c

📁 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 + -