将String解析为公钥时出现问题;密钥格式无效

问题描述 投票:0回答:2

我正在尝试将字母数字字符串“解析”为Java中的PublicKey对象。我想从该键读取模数和指数。我是一个新手,所以我不知道我应该在这做什么。

我尝试通过读取包含String的文件,或者只是使用InputStream等读取文件,并始终一直持续到最后一部分;将字节解析为PublicKey。

这是我试图解析的Key;

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: Encryption Desktop 10.3.2 (Build 15495)

mQENBFyL1ngBCADPZR4FPDxi9v5wNVXDksXzo9IEQvFoQIIfmGaomQ8PrAZHH2jb
nUGK6Y56p/Mlxz3uqfOR0fyBNuq/beszk/jChcy9sqCF3TwKBOdWVcXiIU/XiS0V
...
+FnyI/aT7n+jXBpQSWiyHQyM9RfS0rBeO9w7Q4nWwMyAEHfYxqaajYgJZ+N+Jw==
=Adx/
-----END PGP PUBLIC KEY BLOCK-----

这就是我正在尝试的代码;

fis = new FileInputStream(FilePath);
InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr);

while ((line = br.readLine()) != null) {
rd+=line+",";
}
partes=rd.split(",");
String llaveses="";
int i=2;
while (partes.length>i){
    if (i == partes.length-1){
    llaveses+="";
    }else
    llaveses+=partes[i];
    i++; }

byte[] bytepuk = llaveses.getBytes();
X509EncodedKeySpec spec = new X509EncodedKeySpec(bytepuk);
KeyFactory kfRSA = KeyFactory.getInstance("RSA");
PublicKey pukrsa=kfRSA.generatePublic(spec); //i always got stuck in this part

我已经尝试了这个,以及PGPPublicKey,但不,它总是说“无效的密钥格式”

我只是想获得这两个数据;模数和指数任何帮助或建议都会很棒!还有,对不起我可怜的英语!

java base64 rsa public-key pgp
2个回答
0
投票

使用Java,您可以使用这种着名的Bouncy Castle加密库来解析PGP公钥。

在您的问题中,FilePath是包含PEM编码公钥的文件的路径,因此这里有一种获取公共指数和模数值的方法:

  • 创建解析FilePath内容的密钥环对象;
  • 从密钥环中提取公钥;
  • 将通用公钥对象转换为RSAPublicBCPGKey的实例,以访问getPublicExponent()和getModulus()方法。

这是代码片段。

package net.fenyo.tstpgp;

import java.io.*;
import org.bouncycastle.bcpg.*;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.jcajce.*;

public class App {
    static String FilePath = "d:/temp/publickey.pem";

    public static void main(String[] args) throws IOException, PGPException {
        // Import the PEM encoded key in a key ring
        JcaPGPPublicKeyRingCollection pgpPub = new JcaPGPPublicKeyRingCollection(org.bouncycastle.openpgp.PGPUtil
                .getDecoderStream(new FileInputStream(new File(FilePath))));
        // Extract the public key from the ring
        PGPPublicKey pk = pgpPub.getKeyRings().next().getPublicKey();
        RSAPublicBCPGKey rsa = (RSAPublicBCPGKey) pk.getPublicKeyPacket().getKey();

        // Display the components of the public key
        System.out.println("public exponent: " + rsa.getPublicExponent().toString());
        System.out.println("modulus: " + rsa.getModulus().toString());
    }
}

以下是该程序输出的示例,其中已从该处下载文件d:/temp/publickey.pem的内容:https://keyserver.pgp.com/vkd/DownloadKey.event?keyid=0x5F6C8AE0F08B18EC

public exponent: 65537
modulus: 864707173482092744188671562103373011522752303482519808998088798903008001989099675905283831755832233822390078023832521726213457271249972815470211175966041907569318308362891570478941689686712697599623242011017193503964284513039591891526529083515353888885379235878670749376434323941202586223991854576398690573826518569769985809172651040238653272623223118871290893821208919901304705818060395766177710540558136309696633947940763393190279817250884876978530480176563952524356940770342282654575132991815388460879205229175539573644598040510846046356206518680485904082394070023094993115791279506109927248743485104551955556126256899738972837743577201916815523009590547379892261434498517119972252725514435930097571692392590872567503156038414424344470094696986970708719252723773350549916905691632234402052848270487256520247608379181338474223362079571903909236852815812080392096829534242568109033526006705931306007816143593663131528165731422403611912314397882216433246741610889521014679759861466346273746749512271029719491507151898623753390849376017894676856788535056943964836442355399016103191720725346349409014858505159766120737574239682242298505299052720937352185330272669848438756037873927573782283883754416499218933913671945750838607217911481

注意:这是一个maven pom文件的示例,用于自动下载Bouncy Castle依赖项并编译该程序:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>net.fenyo</groupId>
  <artifactId>tstpgp</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>tstpgp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcpg-jdk15on</artifactId>
      <version>1.61</version>
    </dependency>
  </dependencies>
</project>

-1
投票

你的while循环有点令人困惑,所以为了简单起见,我们假设你的字母数字字符串存储在your_string变量中。请尝试以下代码

String public_key = your_string.replace("-----BEGIN PUBLIC KEY-----\n", "").replace("-----END PUBLIC KEY-----", "");
byte[] encoded_public_key = Base64.decode(publicKey);    
X509EncodedKeySpec spec = new X509EncodedKeySpec(encoded_public_key);
KeyFactory keyfactory = KeyFactory.getInstance("RSA");
keyfactory.generatePublic(spec)
© www.soinside.com 2019 - 2024. All rights reserved.