0

请建议我如何在 C 中使用 openssl 实现以下方程。

Out = A^x mod y; 

其中 Exponentx是随机的并且y是 Diffie-Hellman 素数模数。

A= SHA256(缓冲区 1 与缓冲区 2 连接)。

4

1 回答 1

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。是一个清晰而简单的 BIGNUM 指南。另请查看 crypto/bn/bntest.c 以获取使用示例。

SHA256 摘要到 BIGNUM

现在您需要将消息摘要 A 转换为 BIGNUM,查看此处并选择适合您需要的适当函数。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 函数信息。

BIGNUM 的模乘法

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

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

这个函数的使用可以参考test_mod_mulcrypto/bn/bntest.c中的函数

那应该这样做。

于 2013-06-28T02:17:52.190 回答