Tah*_*ksu 5 c c# openssl biginteger diffie-hellman
我正在使用OpenSSL库进行操作的嵌入式设备和使用方法计算秘密共享密钥生成的C#软件之间实现Diffie-Hellman密钥交换算法.BIGNUMSystem.Numerics.BigInteger
但在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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
OpenSSL的C方法的一些附加信息:>
Run Code Online (Sandbox Code Playgroud)BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret);BN_bin2bn设置|*ret | 到| len |的值 来自| in |的字节,被解释为大端数字,并返回| ret |.如果| ret | 是NULL然后是新的| BIGNUM | 被分配并返回.它在分配失败时返回NULL.
Run Code Online (Sandbox Code Playgroud)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 我们正在使用大端无符号字符进行初始化。