请建议我如何在 C 中使用 openssl 实现以下方程。
Out = A^x mod y;
其中 Exponentx
是随机的并且y
是 Diffie-Hellman 素数模数。
A
= SHA256(缓冲区 1 与缓冲区 2 连接)。
请建议我如何在 C 中使用 openssl 实现以下方程。
Out = A^x mod y;
其中 Exponentx
是随机的并且y
是 Diffie-Hellman 素数模数。
A
= SHA256(缓冲区 1 与缓冲区 2 连接)。
你的问题不是很清楚,所以我只指出你可能感兴趣的部分。
要制作 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 以获取使用示例。
现在您需要将消息摘要 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_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 函数信息。
最后是时候进行模数乘法了,使用这个函数(在此处描述):
int BN_mod_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
这个函数的使用可以参考test_mod_mul
crypto/bn/bntest.c中的函数
那应该这样做。