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



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

但是在爱丽丝和鲍勃交换密钥后,他们计算出不同的共享机密。

钥匙打印在(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| 设置为 |in| 中的 |len| 字节的值,解释为大端数,并返回 |ret|。如果 |ret|是空然后是新鲜的 |比格南|已分配并返回。它在分配失败时返回 NULL。

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

BN_mod_exp sets |r| 等于 |a|^{|p|} mod |m|.它使用所提供值的最佳算法来执行此操作,并且可以在恒定时间内运行,如果 |BN_FLG_CONSTTIME|设置为 |p|。它在成功时返回 1,否则返回 0。

它们会产生不同的结果。

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

提前谢谢。

通过使用

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

最新更新