从整数中加载rsa私钥,并在openssl中转换为PEM格式或rsa结构以对消息进行签名
我有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密钥所需
公共指数
(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
}