我想验证 RSA 签名。我有要验证的数据、签名和模数和指数形式的公钥。我想使用 openssl 进行验证。可能吗?我知道我可以使用openssl rsautl -verify -in sig -inkey key.pem
,但我不知道如何(使用 openssl)创建一个只有模数和指数的公钥。
也许其他想法如何检查这个签名(除了编写一些程序)?
为了生成 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 -verify
或openssl rsautl -verify
检查手册页应该给你下面
# 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 * 结构。