当前位置: 首页 > 面试题库 >

如何读取PEM + PKCS#1格式的RSA公钥

尉迟栋
2023-03-14
问题内容

我有PEM格式+ PKCS#1(我想)的RSA公钥:

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+zn
JDEbNHODZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE=
-----END RSA PUBLIC KEY-----

我想在Python中获取其ASN1编码版本的SHA1摘要。第一步应该是读取此密钥,但是我在PyCrypto中无法做到这一点:

>> from Crypto.PublicKey import RSA
>> RSA.importKey(my_key)
ValueError: RSA key format is not supported

PyCrypto的文档说支持PEM +
PKCS#1,所以我很困惑。我也尝试过M2Crypto,但事实证明M2Crypto不支持PKCS#1,而仅支持X.509。


问题答案:

PyCrypto支持 PKCS#1 ,因为它可以读取X.509SubjectPublicKeyInfo对象,该对象 包含PKCS#1
编码的RSA公钥。

而是,您密钥中编码的数据是纯RSAPublicKey对象(即具有两个INTEGER(模数和公用指数)的ASN.1 SEQUENCE)。

您仍然可以阅读它。尝试类似的方法:

from Crypto.PublicKey import RSA
from Crypto.Util import asn1
from base64 import b64decode

key64 = 'MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k\
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+znJDEbNHOD\
ZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE='

keyDER = b64decode(key64)
seq = asn1.DerSequence()
seq.decode(keyDER)
keyPub = RSA.construct( (seq[0], seq[1]) )

从2.6版开始,PyCrypto还可以导入RsaPublicKeyASN.1对象。这样的代码就更简单了:

from Crypto.PublicKey import RSA
from base64 import b64decode

key64 = b'MIGJAoGBAJNrHWRFgWLqgzSmLBq2G89exgi/Jk1NWhbFB9gHc9MLORmP3BOCJS9k\
onzT/+Dk1hdZf00JGgZeuJGoXK9PX3CIKQKRQRHpi5e1vmOCrmHN5VMOxGO4d+znJDEbNHOD\
ZR4HzsSdpQ9SGMSx7raJJedEIbr0IP6DgnWgiA7R1mUdAgMBAAE='

keyDER = b64decode(key64)
keyPub = RSA.importKey(keyDER)


 类似资料:
  • 我的公共在ssh-rsa是: ssh rsa aaaab3nzac1yc2aaaaaadaqabaababaqclaxt5s/wux04oxbt9r59wcl45omau3m0063lfyja7ovqavr7/2kHtLF/LoCQCXSZMny8RTCGDjoXD7G/tGsyHFDHCI//Y1VDLE06AlDzrlu69DQY91 6gkhghgjh3sf6us5hxlihrbsflf8g

  • 例如,给定以下使用OpenSSL::PKey::RSA生成的PKCS#1/PEM格式的RSA私钥。新(2048): 我可以使用openssl生成SHA256指纹: 我如何在Ruby中做到同样的效果?我的假设是,这两种方法,即通过Ruby中的OpenSSL和OpenSSL应该产生相同的结果。

  • 我在C#中有一个传递公钥字符串的方法。 我传递的公钥字符串是 我得到一个错误组织。BouncyCastle。安全InvalidKeyException:“不是RSA密钥”。我传递给该方法的公钥格式是否不正确?

  • 我试图从已经生成的密钥对(两个s)中提取1024位RSA公钥,以便通过网络发送。我只需要一个普通的对,它应该正好占用131字节(模128字节,指数3字节)。 但是,当我以对象的形式获取密钥信息时,我得到的是140位,而不是131位。下面是一个示例结果: 在多次重试密钥生成并比较生成的对象后,所有密钥保持不变的字节是前7个: 最后三个字节看起来像指数(65537,一个公共值)。模数和指数之间还有两个

  • 我使用下面的openssl命令将公钥存储到。pem文件。 但是当我尝试使用此命令时,它将整个证书信息存储在mypubkey.pem文件中。 我已经看到我可以保存我的公钥使用 但这是一个错误。我不能使用“

  • 如果base64编码的公钥在调用“get encoded”时产生以下结果 我怎么把它变成X.509? 我需要这样做的原因是创建一个java.Security.PublicKey对象。我在这里也问过:https://security.stackexchange.com/questions/150422/what-format-is-bouncycastle-opengpg-public-key/15