Diffie-Hellman 与 BIGNUM (OpenSSL) 与 BigInteger (C#)

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

我正在使用 OpenSSL 库进行 BIGNUM 操作的嵌入式设备和使用 System.Numerics.BigInteger 方法计算共享秘密的 C# 软件之间实施 Diffie-Hellman 密钥交换算法密钥生成。

但是Alice和Bob交换密钥后,他们计算出不同的共享秘密。

每边都印有钥匙(PubA, PrivA, PubB, PrivB, DHPrime, DHGenerator),我可以看出它们是一样的。

我怀疑 little/big 字节顺序有问题,或者 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 sets |*ret| to the value of |len| bytes from |in|, interpreted as a big-endian number, and returns |ret|. If |ret| is NULL then a fresh |BIGNUM| is allocated and returned. It returns NULL on allocation failure.

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

BN_mod_exp sets |r| equal to |a|^{|p|} mod |m|. It does so with the best algorithm for the values provided and can run in constant time if |BN_FLG_CONSTTIME| is set for |p|. It returns one on success or zero otherwise.

而且它们产生不同的结果。

我该怎么办?你接下来要检查什么?

提前致谢。

通过使用 BouncyCastle Crypto Library 的 BigInteger 方法解决。无法告诉 System.Numerics.BigInteger 我们正在使用大端无符号字符进行初始化。