簡體   English   中英

具有BIGNUM(OpenSSL)與BigInteger(C#)的Diffie-Hellman

[英]Diffie-Hellman with BIGNUM (OpenSSL) vs. BigInteger (C#)

我正在使用OpenSSL庫進行BIGNUM操作的嵌入式設備和使用System.Numerics.BigInteger方法計算秘密共享密鑰生成的C#軟件之間實現Diffie-Hellman密鑰交換算法。

但在Alice和Bob交換密鑰后,他們會計算出不同的共享秘密。

密鑰打印在每一面(PubA, PrivA, PubB, PrivB, DHPrime, DHGenerator) ,我可以看到它們是相同的。

我懷疑有一個關於小/大字節序的問題,或者openssl不關心指數的負數,我不知道如何調試這些操作。 我現在沒有代碼,但所有操作都保持簡單,就像這樣。

C#方面

BigInteger bintA = new BigInteger(baByteArrayReceived);
BigInteger bintb = new BigInteger(baRandomBobSecret);
BigInteger bintDHPrime = new BigInteger(baDHPrime2048);

BigInteger bintSharedSecret = bintA.ModPow(bintb,bintDHPrime);

C方面

BIGNUM *bnB = BN_new();
BIGNUM *bna = BN_new();
BIGNUM *bnDHPrime = BN_new();
BIGNUM *bnResult = BN_new();
BN_CTX *bnctx = BN_CTX_new();

BN_bin2bn(baBReceived, 256,bnB);
BN_bin2bn(baRandomAliceSecret, 256,bna);
BN_bin2bn(baDHPrime2048, 256,bnDHPrime);

BN_mod_exp(bnResult,bnB,bna,bnDHPrime,bnctx);

OpenSSL的C方法的一些附加信息:>

 BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret); 

BN_bin2bn設置| * ret | 到| len |的值 來自| in |的字節,被解釋為大端數字 ,並返回| ret |。 如果| ret | 是NULL然后是新的| BIGNUM | 被分配並返回。 它在分配失敗時返回NULL。

  int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx); 

BN_mod_exp設置| r | 等於| a | ^ {| p |} mod | m |。 對於提供的值,它使用最佳算法,並且如果| BN_FLG_CONSTTIME |,則可以在恆定時間內運行。 設置為| p |。 它會在成功時返回一個,否則返回零。

它們會產生不同的結果。

我該怎么辦? 你接下來要檢查什么?

提前致謝。

通過使用BouncyCastle Crypto Library的BigInteger方法解決。 無法告訴System.Numerics.BigInteger我們正在使用大端無符號字符進行初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM