从整数中加载rsa私钥,并在openssl中转换为PEM格式或rsa结构以对消息进行签名

从整数中加载rsa私钥,并在openssl中转换为PEM格式或rsa结构以对消息进行签名,openssl,rsa,pem,Openssl,Rsa,Pem,我有RSA密钥的公共指数(e)、模数(n)和私有指数(d),如何将它们转换为PEM格式的RSA密钥或openssl中定义的RSA结构 我想在Ccode或openssl实用程序中使用RSA私钥和openssl对文本进行签名 我在互联网上搜索过,有相当多的帖子可以从PEM键中提取参数,但没有找到关于如何使用C将参数转换回PEM的有用信息。似乎这不是常见的情况 编辑:很抱歉,标题有点误导,我的最终目的是使用它来签署消息(如描述中所述)我认为您没有RSA密钥所需的一切。具体来说,您没有生成RSA密钥所需

我有RSA密钥的
公共指数
(e)、
模数
(n)和
私有指数
(d),如何将它们转换为
PEM
格式的RSA密钥或openssl中定义的RSA结构

我想在
C
code或
openssl
实用程序中使用RSA私钥和openssl对文本进行签名

我在互联网上搜索过,有相当多的帖子可以从
PEM
键中提取参数,但没有找到关于如何使用
C
将参数转换回PEM的有用信息。似乎这不是常见的情况


编辑:很抱歉,标题有点误导,我的最终目的是使用它来签署消息(如描述中所述)

我认为您没有RSA密钥所需的一切。具体来说,您没有生成RSA密钥所需的素数,
p
q

RSA密钥需要用于计算
n
e
d
的原始素整数,因此仅拥有它们不足以生成整个RSA密钥

有关更多信息,请参阅有关ASN1编码的文档

编辑:@GregS:
n
d
对于公私密钥对来说是不够的,因为
e
实际上是密钥
(n,e)
(d,e)
的一部分

从中可以看出,RSA私钥需要
prime1,p
prime2,q
,而公钥只需要
(n,e)

RSA私钥文件(PKCS#1) RSA私钥PEM文件特定于RSA密钥


RSA math只需要
n
d
来实现签名。此外,OpenSSL的实现也只需要
n
d
进行签名。您可以直接在RSA结构中设置这些值。此示例仅显示了一个“…在C代码中使用RSA私钥对文本进行openssl签名…并忽略PEM查询”的示例

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
静态void printerrors(){
char errbuf[1024];
而(1){
无符号长错误=ERR_get_error();
如果(错误==0){
打破
}
ERR_error_字符串(error,errbuf);
FPUT(errbuf、stderr);
}
fflush(stderr);
}
静态无效符号(RSA*RSA,常量字符*消息){
EVP_PKEY*PKEY=EVP_PKEY_new();
如果(!EVP_PKEY_set1_RSA(PKEY,RSA))出现错误;
EVP_MD_CTX*CTX=EVP_MD_CTX_create();
如果(!EVP_DigestSignInit(ctx,NULL,EVP_sha256(),NULL,pkey))出现错误;
如果(!EVP_DigestSignUpdate(ctx,(const void*)消息,strlen(消息)))转到错误;
尺寸标志;
如果(!EVP_DigestSignFinal(ctx、NULL和siglen))出现错误;
无符号字符*签名=malloc(siglen);
如果(签名==NULL)转到错误;
如果(!EVP_DigestSignFinal(ctx、签名和签名))出现错误;
对于(int i=0;in=BN_-dup(rsa->n);
rsa2->e=BN_-dup(rsa->e);
rsa2->d=BN_-dup(rsa->d);
RSA_print_fp(标准输出,rsa2,0);
签名(rsa2,“请给我签名”);
无RSA_(rsa2);
RSA_-free(RSA);
}

通常与私钥相关的其他值,
p
q
等不是严格必需的。如果有,它们可以用来加速私钥操作,包括利用中国剩余定理进行签名。此外,如果需要,它们可以很容易地从
n
d
e
中派生出来:例如参见。

所需要的只是
n
d
@GregS-我在野外看到过使用非标准
e
(即,不是3、17或65535)的证书。在这种情况下,您无法猜测
e
是一个众所周知的值。@jww:To sign,这是OP请求的,只需要n和d。感谢这一点,实际上我发现RSA结构中有很多参数,因此,我不确定我是否可以只使用
n
d
e
-幸运的是它可以工作。“…或者openssl实用程序是可以接受的”-如果您需要有关使用openssl命令的帮助,那么您应该询问on或。Stack Overflow是一个编程和开发问答网站。还有一些网站可以帮助您使用命令。@jww,实际上我想用c程序来实现它,但是如果有openssl命令来解决这个问题,我可以通过引用openssl的源代码来制作我的程序……非常感谢!我曾经认为openssl可能需要更多参数来执行rsa签名操作(如@ice13berg中所列,除了
n
d
d
之外,还有许多其他字段)
RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
    }