你的问题不是很清楚,所以我只指出你可能感兴趣的部分。
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 是一个清晰而简单的 BIGNUM 指南。另请参阅 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_A 和 y 都是非负数,
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);
请参阅here 了解 BIGNUM rand 函数信息。
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
应该这样做。