c - Openssl中的大数模一个小整数

标签 c openssl

我想知道是否有可能在 Openssl 中以一个小整数为模大数?

假设我生成了两个大素数:

BN_generate_prime(p,512,0,0,0,0,0);
BN_generate_prime(q,512,0,0,0,0,0);

并计算产品 N :
BN_mul(N,p,q,ctx);

我想测试 N是一个“Blum 整数”(N mod 4==3),但是我不知道如何做到这一点,因为函数 BN_mod只支持大数字。

最佳答案

是的,这是可能的。

jww的回答中给出了最好和有效的方法,即调用BN_mod_word() .

一种效率较低的方法是通过将小整数转换为 BIGNUM第一的。这很麻烦,但并不困难。我将向您展示创建 BIGNUM 的两种方法。通过计算 11 mod 3BN_mod .首先,为您的号码声明一个 BIGNUM。

BIGNUM *N = BN_new();
BIGNUM *M = BN_new();

方法一 :将您的数字转换为字符串,然后将字符串转换为 BIGNUM。
#include <sstream>
int n = 11;
std::ostringstream num_str;
num_str << n;
BN_dec2bn( &N, num_str.str().c_str() );

(在 C 中你可以做 char buf[12]; sprintf(buf, "%d", n); BN_dec2bn(&N, buf); )

方法二 :将您的数字作为字节数组提供,但请注意 OpenSSL 希望您的字节采用大端格式,并且始终将您的字节解释为正数。
#include <arpa/inet.h>   // For htonl to make the integer big endian
int m = 3;
m = htonl(m);
BN_bin2bn( (unsigned char *) &m, sizeof(m), M);

然后像往常一样使用您的 OpenSSL 功能。
BN_mod(rem, N, M, ctx);
BN_print_fp(stdout, rem);  // (Using N=11 and M=3 above, this line prints 2)

并释放您的BIGNUM s。
BN_free(N);
BN_free(M);

关于c - Openssl中的大数模一个小整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4038938/

相关文章:

C - 将 base64 方法添加到我的文件中

c - 简单选项菜单 (C)

c++ - 如何强制执行额外的预处理器宏扫描

c - 操纵变量的地址来存储较小的类型?

c++ - 在 C++ 示例中解密 AES

c - PCF8574a 没有响应 - TWI

c - OpenSSL 函数 EVP_PKEY_keygen 中的内存泄漏

php - Node.js:如何破译用 php 加密的文本?

security - OpenSSL 库可以针对电压攻击进行修复吗?SSL 库也是吗?

Python 客户端工具(应该在浏览器中工作)从 pfx 文件中提取值并对其进行签名