c++ - 如何从 unsigned char * 模数和指数 65537(RSA_F4) 创建 RSA 公钥

标签 c++ c linux openssl

我正在尝试从模数类型 char[] 生成一个 rsa 公钥,我现在的指数是 RSA_F4(65537); 但是当我尝试使用“n”和“e”的值生成我的公钥时,RSA_public_encrypt 返回 -1;

谢谢!

我的代码:

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <crypt.h>
#include <iostream>
#include <stdlib.h>
#include <openssl/rsa.h>
#include <openssl/aes.h>
#include <openssl/opensslconf.h>
#include <openssl/engine.h>
#include <openssl/pem.h>
#include <openssl/rc4.h>

using namespace std;
int main(void)
{

//modulus in format char hex;
char key[] = "C0E7FC730EB5CF85B040EC25DAEF288912641889AD651B3707CFED9FC5A1D3F6C40062AD46E3B3C3E21D4E71CC4800C80226D453242AEB2F86D748B41DDF35FD";

    char palavra[] = "teste";
    char crip[512];
    int ret;
    RSA * pubkey = RSA_new();
    BIGNUM * modul = BN_new();
    BIGNUM * expon = BN_new();

    BN_hex2bn(&modul, (const char *) key);
    BN_hex2bn(&expon, "010001");

    cout << "N KEY: " << BN_bn2hex(modul) << endl;
    cout << "E KEY: " << BN_bn2hex(expon) << endl;

    pubkey->n = modul;
    pubkey->e = expon;

    cout << "N PUB KEY: " << BN_bn2hex(pubkey->n) << endl;
    cout << "E PUB KEY: " << BN_bn2hex(pubkey->e) << endl;

    if (RSA_public_encrypt(strlen((const char *) palavra), (const unsigned char *) palavra, (unsigned char *) crip, pubkey, RSA_PKCS1_PADDING ))
    {
        printf("ERRO encrypt\n");
    }
    else
    {
        printf("SUC encrypt\n");
    }
return 0;
}

最佳答案

您可能想要看起来更像的东西:

RSA *pubkey = RSA_new();
int len = BN_hex2bn(&pubkey->n, (const char *)p);
if (len == 0 || p[len])
    fprintf(stderr, "'%s' does not appear to be a valid modulus\n", p);
BN_hex2bn(&pubkey->e, "010001");

编辑

除了错误检查,您的代码工作正常。 RSA_public_encrypt 在成功时返回密文的大小,而不是 0,因此要使上面的代码有效,请添加 <= 0测试 if行:

if (RSA_public_encrypt(....) <= 0)

关于c++ - 如何从 unsigned char * 模数和指数 65537(RSA_F4) 创建 RSA 公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10742451/

相关文章:

c++ - 使用WIN32 API设置无资源程序图标

c - 为什么 sscanf 需要 & %d 整数而不是 %s 字符串

linux - 为什么 syslog-ng 无法使用 SELinux TYPE syslogd_exec_t 启动?

c++ - 如何从模板结构创建二维数组

c++ - OpenGL 到 DirectX(缓冲区到纹理到屏幕)

c# - C# 中的 ref 和 out 是否与 C++ 中的指针相同?

c - 从 ANSI C 中的字符串中获取特定行

c - System V AMD64 ABI 浮点可变参数顺序

linux - emacs 窗口一侧奇怪的垂直线,同时最大化

linux - 将每月的 linux 文件移动到另一个文件夹脚本