基於中國剩餘定理的秘密共享方案

2021-10-10 13:53:21 字數 2166 閱讀 7008

//秘密的位數

#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...