2012-11-02 108 views
0

我正在嘗試使用OpenSSL實現Shamir祕密共享。我在解密消息時遇到了很多麻煩!Shamir祕密共享的OpenSSL實現

我曾嘗試解密幾種實現方式,都這一個: http://www.cs.cornell.edu/courses/cs754/2001fa/307.pdf

這一個(引用上面的紙,但使用不同的方法):

http://i9.photobucket.com/albums/a60/cacollo/confused1.jpg(注意我是知道的計算錯字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。有什麼辦法可以解決這個問題嗎?

您看到我的代碼還有其他問題嗎?提前致謝。

回答

1

當你做sub,div,mul時,你需要做模塊化算術。即分母上的BN_mod_sub,BN_mod_inverse和BN_mod_mul。

+0

感謝您的幫助!我做了你的建議,但仍然有解密問題。我沒有做過其他更改: 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); (對不起,我不能格式化工作!) –

+0

我也檢查了我的密鑰生成器,以確保我正在做所有模數計算...我沒有,但它沒有解決我的問題。如果需要,我可以發佈關鍵分路器。 –

+0

你根本不應該做一個div,而應該用分母的倒數來修改mk。 – Frank

1

BN_div是一個整數除法。

對於拉格朗日,你需要做一個模數轉換然後乘。

+0

我想這不是OP正在尋找的東西。 – mtk

+0

這是正確的答案,但弗蘭克在3個月前正確回答了它。 –