一、实验目的
秘密共享是将秘密以适当的方式拆分,拆分后的每一个子秘密由不同的参与者管理,单个参与者无法恢复秘密信息,只有若干个参与者一同协作才能恢复秘密。并且,当其中某些参与者出现问题时,秘密仍可以恢复。
实验环境:win10、vc6.0、miracl_5.5.4
二、代码实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"mirdef.h"
#include"miracl.h"
#include<math.h>
#define t1 3
#define n 5
//判断是否互素
int husu(big m1,big m2)
{
big z,one;
one=mirvar(0);
z=mirvar(0);
convert(1,one);
egcd(m1,m2,z);
if(!compare(z,one))
{
return 1;
}
else
{
return 0;
}
}
//判断递增函数
int increment(big a1,big b1){
if(compare(a1,b1))
return 1;
else
return 0;
}
//中国剩余定理
big recover(int p,big a[],big m[])
{
big M[10],MM[10],x[10],j[10];
big max,tmp,ret;
big f_one;
int k=0,i=0;
miracl *mip = mirsys(5000,10);//初始化大数系统
mip->IOBASE = 10;
max = mirvar(0);
f_one = mirvar(0);
tmp = mirvar(0);
ret = mirvar(0);
convert(-1,f_one);
i=0;
while(i<p){
M[i] = mirvar(0);
MM[i] = mirvar(0);
x[i] = mirvar(0);
j[i] = mirvar(0);
i++;
}
//判断
for(i=0;i<p;i++)
{
for(k=0;k<p;k++)
{
if(i==k)
continue;
if(!husu(m[i],m[k]))
exit(0);
}
}
//计算m
copy(m[0],max);
k=0;
while(k<p-1){
fft_mult(max,m[k+1],max);//m=m[0]*m[1]*m[k];
k++;
}
//计算m^-1(mod m1)
k=0;
while(k<p){
copy(max,tmp);
divide(tmp,m[k],M[k]);//M[0]=m/m[0];
copy(M[k],tmp);
xgcd(tmp,m[k],tmp,tmp,tmp);
copy(tmp,MM[k]);
k++;
}
k=0;
while(k<p){
fft_mult(M[k],MM[k],j[k]);
copy(j[k],tmp);
fft_mult(tmp,a[k],x[k]);
k++;
}
copy(x[0],ret);
k=0;
while(k<p-1){
add(ret,x[k+1],ret);
k++;
}
divide(ret,max,max);
printf("解为:");
cotnum(ret,stdout);
printf("模为:");
cotnum(max,stdout);
return max;
for(i=0;i<p;i++){
mirkill(M[i]);
mirkill(MM[i]);
mirkill(x[i]);
mirkill(j[i]);
mirkill(max);
mirkill(tmp);
mirkill(ret);
mirkill(f_one);
}
}
int main(void){
big secret,N,M,tmp;
big d[n],k[n],d_1[t1],k_1[t1];
int i,j;
int p[t1];
char *s_d[n];
char *s_tmp[n];
miracl *mip = mirsys(5000,10);//初始化大数系统
mip->IOBASE = 10;
secret = mirvar(0);
N = mirvar(0);
M = mirvar(0);
tmp = mirvar(0);
//循环分配空间
for(i=n;i;i--){
s_d[i]=(char*)malloc(1024);
s_tmp[i]=(char*)malloc(1024);
}
//生成随机的secret
bigdig(300,10,secret);
printf("随机的秘密为");
cotnum(secret,stdout);
//输入d[n]
loop: for(i=0;i<n;i++){
d[i] = mirvar(0);
d_1[i] = mirvar(0);
k_1[i] = mirvar(0);
k[i]=mirvar(0);
bigdig(120,10,d[i]);
}
//判断d[n]是否递增
for(i=0;i<n;i++){
if(increment(d[i],d[i+1]))
continue;
else{
printf("error");
exit(0);}
}
//判断d[n]是否两两互素
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
continue;
if(!husu(d[i],d[j]))
goto loop;
}
}
printf("随机的D\n");
for(i=0;i<t1;i++){
printf("d[%d]=",i);
cotnum(d[i],stdout);
}
//计算N
copy(d[0],N);
for(j=0;j<t1-1;j++){
multiply(N,d[j+1],N);
}
printf("N=");
cotnum(N,stdout);
//计算M
copy(d[n-t1+1],M);
for(j=(n-t1+1);j<n-1;j++){
multiply(M,d[j+1],M);
}
printf("M=");
cotnum(M,stdout);
//判断N>secret>M
if(compare(N,secret)+1)
{
if(compare(secret,M)+1)
printf("N>secret>M\n");
else
exit(0);
}
else
exit(0);
//计算k[n]
printf("密钥=\n");
for(i=0;i<n;i++){
copy(secret,tmp);
divide(tmp,d[i],d[i]);
cotnum(d[i],stdout);
copy(tmp,k[i]);
cotnum(k[i],stdout);
printf("-------------------------------------\n");
}
//恢复秘密
srand((unsigned)time(0));
printf("随机选择密钥\n");
for(i=0;i<t1;i++)
{
// scanf("%d",&p[i]);
loop2: p[i]=rand();
if(p[i]>t1||p[i]<0)
{goto loop2;}
printf("%d\n",p[i]);
copy(d[p[i]],d_1[i]);
copy(k[p[i]],k_1[i]);
}
if(compare(recover(t1,k_1,d_1),secret))
printf("恢复成功\n");
else
printf("恢复失败");
for(i=0;i<n;i++){
mirkill(d[i]);
mirkill(k[i]);
mirkill(tmp);
mirkill(secret);
mirkill(N);
mirkill(M);
}
for(i=0;i<t1;i++){
mirkill(k_1[i]);
mirkill(d_1[i]);
}
mirexit();
}