【问题标题】:Creating a rsa public key from its modulus and exponent根据模数和指数创建 rsa 公钥
【发布时间】:2012-07-17 11:28:07
【问题描述】:

我想验证 RSA 签名。我有要验证的数据、签名和模数和指数形式的公钥。我想使用 openssl 进行验证。可能吗?我知道我可以使用openssl rsautl -verify -in sig -inkey key.pem,但我不知道如何(使用openssl)创建一个只有模数和指数的公钥。

也许其他想法如何检查这个签名(除了编写一些程序)?

【问题讨论】:

  • "...除了编写一些程序..." 如果您阅读了FAQ,您就会知道这就是 stackoverflow 的用途。
  • GregS:不是这样的 :) 我有程序可以做到,但我的客户声称它不能正常工作。因此,为了证明他是错的,我想证明 openssl(他可以信任)的行为与我的程序相同。
  • 你想要来自给定模数和指数的 RSA * 结构吗?

标签: openssl rsa


【解决方案1】:

要生成 PEM 格式的 RSA 公钥以用于openssl,您可以按照以下步骤操作。

创建 ASN1 定义文件

修改以下模板以包含您的模数和指数

# Start with a SEQUENCE
asn1=SEQUENCE:pubkeyinfo

# pubkeyinfo contains an algorithm identifier and the public key wrapped
# in a BIT STRING
[pubkeyinfo]
algorithm=SEQUENCE:rsa_alg
pubkey=BITWRAP,SEQUENCE:rsapubkey

# algorithm ID for RSA is just an OID and a NULL
[rsa_alg]
algorithm=OID:rsaEncryption
parameter=NULL

# Actual public key: modulus and exponent
[rsapubkey]
n=INTEGER:0x%%MODULUS%%

e=INTEGER:0x%%EXPONENT%%

您可能还想使用 sed 编写脚本,而不是编辑

sed -i "s/%%MODULUS%%/$(xxd -ps -c 256 mymodulus.bin)/" def.asn1

注意-c 256 应根据您的密钥长度(以字节为单位)进行选择。

您可以对指数使用类似的命令。

生成您的 RSA 密钥

使用以下 openssl 命令。这将为您提供一个 DER 编码的 RSA 密钥。

openssl asn1parse -genconf def.asn1 -out pubkey.der -noout

然后将其转换为 PEM 密钥

openssl rsa -in pubkey.der -inform der -pubin -out pubkey.pem

使用您的密钥验证

您可以使用openssl dgst -verifyopenssl rsautl -verify

【讨论】:

    【解决方案2】:

    检查手册页应该会给你以下信息

     # generate private key
     openssl genrsa > key.priv
    
     # use it to sign something
     echo "Dirk should be given $10" | openssl rsautl -inkey key.priv -sign > msg.sig
    
     # create a pub key (modules, exp) from the private key
     openssl rsa -pubout < key.priv > key.pub
    
     # use that to verify the signature.
     openssl rsautl -in msg.sig -verify -inkey key.pub -pubin
    

    所有这一切都假设您想要原始密钥。如果我理解您在下方的评论 - 您似乎没有正常格式的模块/exp。因此,您首先必须将其打包在 ASN.1 中 以便与常用工具一起使用。

    您必须为此编写一些 c/java/etc 代码。一个简单的方法是使用 openssl 库;并填写 RSA * 结构。

    【讨论】:

    • 我看不出它如何解决我的问题。我只有两个数字:一个模数和一个指数。我想创建一个文件 key.pub ,其中包含基于这些数字创建的公钥。没有其他的。我很久以前就问过这个问题,但仍然不知道该怎么做。
    • 假设你没有模块和指数不在正常的 BER 包装中 - 你将不得不编写一些 ASN.1 包装来包装它。
    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2014-04-16
    • 1970-01-01
    • 2023-03-21
    • 2019-12-11
    • 2018-06-10
    相关资源
    最近更新 更多