使用C语言中的openSSL API进行密钥计算

时间:2013-06-27 15:10:06

标签: openssl

请建议我如何使用C语言中的openssl实现以下等式。

Out = A^x mod y; 

其中指数x是随机的,y是Diffie-Hellman素数模数。

A = SHA256(Buffer1与Buffer 2连接)。

1 个答案:

答案 0 :(得分:1)

你的问题不太清楚,所以我只想指出你可能感兴趣的部分。

SHA256摘要

要制作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以获取用法示例。

SHA256消化为BIGNUM

现在您需要将消息摘要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_Ay都是非负面的,

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

随机BIGNUM x

假设您已经分配了模数y,并且想要提出一个随机数x,使0=<x<y使用此函数

int BN_rand_range(BIGNUM *rnd, BIGNUM *range);

有关BIGNUM rand函数的信息,请参阅here

BIGNUM的模块化乘法

最后是时候进行模数乘法,使用这个函数(描述here):

int BN_mod_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);

对于此函数的使用,您可以参考crypto / bn / bntest.c中的函数test_mod_mul

那应该这样做。