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

从BigIntegers将RSA密钥转换为SubjectPublicKeyInfo表单

沈飞翔
2023-03-14
问题内容

警告 :最初的问题是关于PKCS#1编码的密钥,而该问题中的实际示例需要SubjectPublicKeyInfo(X.509)编码的密钥。

我目前正在从头开始在Java中实现RSA算法,尤其是在密钥生成方面。现在,我的代码可以使我得到三个BigIntegers n,e和d。

从网上可以看到,RSA密钥(很像PGP签名)通常是字符的混合,而不仅仅是很长的数字。显然,这是因为密钥已加密/翻译(我不太确定)到PKCS#1中。

我将如何自己做?此外, PKCS#1 SubjectPublicKeyInfo是我想要显示的键,还是有更新的格式?

编辑:为清楚起见,这是我正在寻找的示例:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0
FPqri0cb2JZfXJ/DgYSF6vUpwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/
3j+skZ6UtW+5u09lHNsj6tQ51s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQAB
-----END PUBLIC KEY-----

我目前有:

Public Key (n,e): (25130290470670502980544427869200613840944965290040433220698179071215137002904823499373962164071905921326803837460733139500455896910114421141830335882737678919237073090149470600927019562678483947908156329730770276498955439764614844798829603416304775442087438623389826719642285111749464396302305124179886483673046650125158307930593778247437940929550491287419436361905923356252487704851166279431792122641372330876814779543893241235355988829436458897455503500810769146739895787437926366072829812130032509796362669335922016603663923790043992999351304972183762844549989472560311169566110061553119311399708581940621713200371,65537)

我不知道如何将如此庞大的数目转换成标准格式的密钥。


问题答案:

最好的方法是使用Java API。只需创建一个RSAPublicKeyand即可getEncoded()。否则,您可以使用Bouncy
Castle库并使用Bouncy内部ASN.1编码结构来构造公钥(可能从Bouncy Castle
JCE实现中“窃取”实现,它们也必须实现getEncoded())。

最后,您可以简单地查找PKCS#1 RSA标准并实现ASN.1结构。如果这样做,则必须至少学习ASN.1和DER编码规则的子集。请注意,如果您想从头开始实现
完整的 ASN.1解析器+ BER / DER编码器/解码器,则将需要几个月的实施时间和几年的经验。

请注意,它getEncoded()仅包含二进制DER编码的ASN.1结构。您需要转换为base
64并添加起始行和起始行来创建您展示给我们的PEM结构。有时也称为“
ASCII防护”,因为当您通过邮件发送结构(PEM表示“隐私增强型邮件”)时,它可以保护二进制代码不受损坏。



 类似资料:
  • 我在我的C#代码中使用了RSACryptoServiceProvider,它工作得很好,我可以导出RSA XML私有和公共密钥,但是出于某种原因,我需要将这个密钥转换为*。带格式的PEM(pkcs 8未加密) 我的私钥就像 我想把它转换成(PKCS8未加密)如下 我不是这个安保人员的专业人员,我不确定我们能不能把它换成非专业人员?有人能帮忙做代码示例吗?

  • 我有作为字符串的公钥和私钥,它们是由Webcrypto API RSA-OAEP算法生成的。我想加密和解密一些纯文本,使用这些和获得异常时,试图转换字符串到字节数组 Java代码: 例外情况: 线程“main”Java.lang.IllegalArgumentException中出现异常:Java.util.base64$Decoder.Decode0(base64.:714)Java.util.

  • 问题内容: 我有以下格式的公钥 我需要将其转换为以下格式 基本上,问题是我正在使用用Java编写的第三方库。 第三方库使用Java类“ RSAPublicKeySpec”从字符串生成RSAPublicKey类型的实例。 我提供给该第三方库的字符串取自以下格式的文件: 仔细研究一下代码之后,我可以看到,如果我使用java类“ X509EncodedKeySpec”来加载此公共密钥,则代码的签名验证部

  • 问题内容: 有没有办法以编程方式将Jsch生成的SSH RSA密钥转换为javax.crypto.Cipher可以用于加密的格式?我几乎看到了与此类似的答案: 但是我没有访问openSSL或shell命令的权限。顺便说一句:我只使用JDK6。 由于@erickson对他的帮助,我可以从转换RFC4716的公共密钥使用的指数和模量作为Java公共密钥传递给类型同。他的解决方案如下。 现在,我正在尝试

  • null BouncyCastle/Java ASN1-DER和PEM中的密钥结构 RFC3447 RFC4716 RSA_KEY_BREAKER

  • 让我先解释一下我的问题。我从CA购买了一个证书,并使用以下格式生成csr和私钥: 有趣的是,在aws文档页面上,他们显示的示例私钥以“------开始RSA私钥-------”开头 有没有办法使用OpenSSL将我的私钥转换为RSA私钥?