我正在嘗試使用OpenSSL實現Shamir祕密共享。我在解密消息時遇到了很多麻煩!Shamir祕密共享的OpenSSL實現
我曾嘗試解密幾種實現方式,都這一個: http://www.cs.cornell.edu/courses/cs754/2001fa/307.pdf
這一個(引用上面的紙,但使用不同的方法):
(注意我是知道的計算錯字
u2
)
我相信我的問題可能是在使用BIGNUM值表示關鍵數字時對ik /(ik-ij)執行拉格朗日插值時的精度損失。我寫了一個小功能,將int
(如鍵號)轉換爲BIGNUM值。
我會爲您省去我的密鑰生成代碼,因爲我非常確定它工作正常。下面是我的實現,我鏈接的JPEG(不是PDF)的:
int i;
for (i = 0; i < 3; i++) {
aij[i] = BN_new();
BN_mod_exp(aij[i], c.c1, key[i].key, p, ctx);
}
BIGNUM *ik = BN_new();
BIGNUM *ij = BN_new();
BIGNUM *denomTmp = BN_new();
BIGNUM *numTmp = BN_new();
BIGNUM *divTmp = BN_new();
BIGNUM *accum = BN_new();
int j, k;
/* Lagrange Interpolation */
for (j = 0; j < 3; j++) {
BN_one(accum);
for (k = 0; k < 3; k++) {
if(j == k) continue;
else {
ik = int2BN(key[k].keynum); //int2BN is my function for converting ints to BNs
ij = int2BN(key[j].keynum);
BN_sub(denomTmp, ik, ij);
BN_div(divTmp, NULL, ik, denomTmp, ctx);
BN_mul(accum, accum, divTmp, ctx);
}
}
cij[j] = BN_new();
BN_mod(cij[j], accum, q, ctx); // accum % q = cij[j]
}
// Now for the second half...
int a;
u1 = BN_new();
BIGNUM *u1tmp = BN_new();
BN_one(u1);
for (a = 0; a < 3; a++) {
BN_mod_exp(u1tmp, aij[a], cij[a], p, ctx);
BN_mod_mul(u1, u1, u1tmp, p, ctx);
}
,當我在CIJ吐出的計算值[],我得到:2,-5,0使用按鍵時[2,4,5]。根據我親手做的一些數學,它實際上應該是10/3,5和8/3。有什麼辦法可以解決這個問題嗎?
您看到我的代碼還有其他問題嗎?提前致謝。
感謝您的幫助!我做了你的建議,但仍然有解密問題。我沒有做過其他更改: ik = int2BN(key [k] .keynum); ij = int2BN(key [j] .keynum); BN_mod_sub(denomTmp,ik,ij,q,ctx); BN_div(divTmp,NULL,ik,denomTmp,ctx); BN_mod_inverse(divTmp,divTmp,q,ctx); BN_mod_mul(accum,accum,divTmp,q,ctx); (對不起,我不能格式化工作!) –
我也檢查了我的密鑰生成器,以確保我正在做所有模數計算...我沒有,但它沒有解決我的問題。如果需要,我可以發佈關鍵分路器。 –
你根本不應該做一個div,而應該用分母的倒數來修改mk。 – Frank