【问题标题】:Key Computation using openSSL APIs in C在 C 中使用 openSSL API 进行密钥计算
【发布时间】:2013-06-27 15:10:06
【问题描述】:

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

Out = A^x mod y; 

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

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

【问题讨论】:

  • 如果您尝试执行 Diffie-Hellman 的第一部分(生成私钥),则有一个函数 DH_generate_key()。但对生成器 (SHA256) 使用随机(不受控制的)值可能不是一个好主意。

标签: openssl


【解决方案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 是一个清晰而简单的 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_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);

请参阅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

应该这样做。

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多