请建议我如何使用C语言中的openssl实现以下等式。
Out = A^x mod y;
其中指数x
是随机的,y
是Diffie-Hellman素数模数。
A
= SHA256(Buffer1与Buffer 2连接)。
答案 0 :(得分:1)
你的问题不太清楚,所以我只想指出你可能感兴趣的部分。
要制作SHA256摘要,请查看EVP_Digest page。另请查看cyprto / sha1test.c以了解用法。将EVP_sha1()
替换为此行中的EVP_sha256()
EVP_Digest(*P,strlen((char *)*P),md,NULL,EVP_sha1(), NULL);
对于x和y,它们在OpenSSL中存储为BIGNUM。 Here是BIGNUMs的简明指南。另请参阅crypto / bn / bntest.c以获取用法示例。
现在您需要将消息摘要A转换为BIGNUM,查看here并选择适合您需要的适当功能。 BN_bin2bn()
可能就是你要找的东西。如果生成的BIGNUM bn_A大于模数y
,则此函数将为您执行bn_A = bn_A mod y
:
int BN_mod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
,或者如果您希望bn_A
和y
都是非负面的,
int BN_nnmod(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
假设您已经分配了模数y
,并且想要提出一个随机数x,使0=<x<y
使用此函数
int BN_rand_range(BIGNUM *rnd, BIGNUM *range);
有关BIGNUM rand函数的信息,请参阅here。
最后是时候进行模数乘法,使用这个函数(描述here):
int BN_mod_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
对于此函数的使用,您可以参考crypto / bn / bntest.c中的函数test_mod_mul
那应该这样做。