//秘密的位數
#define n 5
//子秘密的個數n
#define t 3
//恢復秘密所需要的最少子秘密個數t
#define d_digbits (((secret_bits/t)+(secret_bits/(t-1)))/2)
//di的位數,di的長度在b/t與b/(t-1)之間,使n(最小的前t個數的乘積)>k>m(最大的前t-1個數的乘積)
#define max_d ((n)*(d_digbits)+(n))
// 定義大數系統的最大位數(稍微比n倍的d大就可以)
big ki[n]
, di[n]
;void
zhongguo
(big secret)
//初始化
for(i =
0; i < n; i++
)//m=di[num[i]]連乘
for(i =
0; i < t; i++
)//mit[t]=m/di[num[i]],即計算mi
for(i =
0; i < t; i++
)//mit_1為mit的逆
for(i =
0; i < t; i++
)//g1 = mi t* mit_1 * ki[ num[i] ]
for(i =
0; i < t; i++
)//x=g1[1]+g1[2]+...+g1[t]
for(i =
0; i < t; i++
)powmod
(x, one, m, x)
;// x = x^1 mod m
printf
("\n");
printf
("秘密: \n");
cotnum
(x,stdout);
printf
("\n");
//判斷恢復的秘密與原秘密是否相同if(
mr_compare
(x, secret)!=0
)printf
("恢復的秘密與所給秘密不同!");
else
printf
("恢復的秘密與所給秘密相同!");
printf
("\n");
}int
main()
//從檔案中讀秘密if(
(fp =
fopen
(fpname,
"r"))==
null
)else
}//求出子秘密
printf
("\n產生的子秘密為:\n");
for(i =
0; i < n; i++
)//列印n=d1*d2*...*dt
for(i =
0; i < t; i++
)printf
("\nn的值為:\n");
cotnum
(n,stdout);
//列印m=d(n-t+2)*d(n-t+3)*...*dn
for(i = n-
1; i >
(n-t)
; i--
)printf
("\nm的值為:\n");
cotnum
(m,stdout);
printf
("\n");
//進行秘密復原
zhongguo
(secret);}
return0;
}
基於中國剩餘定理的秘密共享方案 C語言實現
基於中國剩餘定理的秘密共享方案,本質上是在利用模m運算。t,n 門限,若得到的子秘密大於等於t個,則可以恢復出原始秘密 反之則不然。那麼為什麼會是這樣的呢?關鍵在於n k m,若是模乙個大於原秘密k的大數,則k就是k,算出來的結果不需要改動 而要是模乙個小於或等於原秘密k的大數m,則算出來的結果是k...
中國剩餘定理的原理
一 我們先來講兩個數學定理 a b c,則有 a k b b c 如果a b c,那麼 a k b a b a b a b c c c k c k 0 二 我們設n1除以3餘2,n2除以5餘3,n3除以7餘2。我們先從n1這個角度出發,已知n1滿足除以3餘2,能不能使得n1 n2的和仍然滿足除以3餘...
中國剩餘定理的解釋!
複習下中國剩餘定理 乙個數n,求滿足n 3 2,n 5 3,n 7 2的最小數n.先從3和5,3和7,5和7的最下公倍數中找出被7,5,3除餘1的最小數,分別是15,21,70。再分別用這三個數乘以對應的餘數相加 15 2 21 3 70 2 233 最後用233 105 2.23 餘數 105為3...