公钥到字符串然后回到公钥java

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

所以我有这段代码,我试图做一些转换,所以首先我生成一个公钥并打印然后转换为字节然后转换为字符串然后我将其转换回字节,但当我将其转换回字节字节的值会更改,因此生成的公钥与顶部的公钥不同,如下面的输出中所示

//generating public key     
  PublicKey public_key = CryptographyHelper.ellipticCurveCrypto().getPublic();
  System.out.println("PUBLIC KEY::" + public_key);

       //converting public key to byte            
        byte[] byte_pubkey = public_key.getEncoded();
        System.out.println("\nBYTE KEY::: " + byte_pubkey);

          //converting byte to String 
        String str_key = Arrays.toString(byte_pubkey);
        System.out.println("\nSTRING KEY::" + str_key);

//converting string to Bytes
        byte_pubkey = str_key.getBytes();
        System.out.println("BYTE KEY::" + byte_pubkey);

//converting it back to public key
   KeyFactory factory = KeyFactory.getInstance("ECDSA", "BC");
        public_key = (ECPublicKey) factory.generatePublic(new X509EncodedKeySpec(byte_pubkey));
        System.out.println("FINAL OUTPUT" + public_key);

产量

    PUBLIC KEY::EC Public Key [4d:53:40:86:3f:a8:91:49:b6:27:b5:58:14:b8:8b:f1:ff:8a:78:70]
            X: c8e1028cad7b105814d4a2e0e292f5f7904aad7b6cbc46a5
            Y: 312272321a1ba4ff14caa73b42acb35eb025d9f6fc2ca6b3


BYTE KEY::: [B@1a1d6a08

STRING KEY::[48, 70, 48, 16, 6, 7, 42, -122, 72, -50, 61, 2, 1, 6, 5, 43, -127, 4, 0, 31, 3, 50, 0, 4, -56, -31, 2, -116, -83, 123, 16, 88, 20, -44, -94, -32, -30, -110, -11, -9, -112, 74, -83, 123, 108, -68, 70, -91, 49, 34, 114, 50, 26, 27, -92, -1, 20, -54, -89, 59, 66, -84, -77, 94, -80, 37, -39, -10, -4, 44, -90, -77]
BYTE KEY[B@37d31475
Exception in thread "main" java.security.spec.InvalidKeySpecException: encoded key spec not recognized: failed to construct sequence from byte[]: Extra data detected in stream
    at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
    at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi.engineGeneratePublic(Unknown Source)
    at java.security.KeyFactory.generatePublic(KeyFactory.java:328)
    at blahblah.Driver.main(Driver.java:44)
C:\Users\blahblah\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 1 second)

我有一个错误,因为当我第二次将它转换回字节然后当它转换回公钥时它变得无效因此错误

附加信息

但是当我这样做它工作正常,但我的目标是首先将公钥转换为字符串,然后将该字符串转换为类型公钥,我能做到的唯一方法是转换字符串中的公钥键入一个字节类型,然后将其转换回公钥我不能将字符串直接转换为公钥,因为它不会工作

java type-conversion public-key
1个回答
1
投票

转换为String类型时,需要使用Base64编码系统。 tostring()方法使用不支持您的字符的JVM默认编码。

PublicKey public_key = CryptographyHelper.ellipticCurveCrypto().getPublic();     
System.out.println("PUBLIC KEY::" + public_key);

//converting public key to byte            
byte[] byte_pubkey = public_key.getEncoded();
System.out.println("\nBYTE KEY::: " + byte_pubkey);

//converting byte to String 
String str_key = Base64.getEncoder().encodeToString(byte_pubkey);
// String str_key = new String(byte_pubkey,Charset.);
System.out.println("\nSTRING KEY::" + str_key);

//converting string to Bytes
byte_pubkey  = Base64.getDecoder().decode(str_key);
System.out.println("BYTE KEY::" + byte_pubkey);


//converting it back to public key
KeyFactory factory = KeyFactory.getInstance("ECDSA", "BC");
public_key = (ECPublicKey) factory.generatePublic(new X509EncodedKeySpec(byte_pubkey));
System.out.println("FINAL OUTPUT" + public_key);
© www.soinside.com 2019 - 2024. All rights reserved.