簡體   English   中英

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

[英]public key to string and then back to public key java

所以我有這段代碼,我試圖在其中進行一些轉換,所以首先我生成一個公鑰並打印它,然后轉換為字節,然后轉換為字符串。 之后我將其轉換回字節,但是當我將其轉換回字節時,字節的值會發生變化,因此生成的公鑰與頂部的公鑰不同,如下面的輸出所示。

//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)

我有一個錯誤,因為當我第二次將它轉換回字節然后當它轉換回公鑰時它變得無效,因此出現錯誤。

附加信息

但是當我這樣做時它工作正常,但我的目標是首先以某種方式將公鑰轉換為字符串,然后將該字符串轉換為公鑰類型。 我能做到的唯一方法是將字符串類型的公鑰轉換為字節類型,然后將其轉換回公鑰。 我無法將字符串直接轉換為公鑰,因為它不起作用。

轉換為 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);
// here input is string to be decrypted
//function is written in scala 
    
    
    def RsaDecryption(inParm: String): String = {
          val decoded_string = inParm.getBytes()
          val strBytes = getDecoder.decode(decoded_string)
          //println("String in Bytes "+strBytes)
          val DecryptKey  = "IBIjANBgWHXEcf+NGQh3wee8Tzs6MTBQPfsPz1b97x46IN7zsJeQIDAQAB"
          val DecBytes = Base64.getDecoder().decode(DecryptKey)
          val DecSpec = new X509EncodedKeySpec(DecBytes)
          val keyFactory = KeyFactory.getInstance("RSA")
          val DecKey = keyFactory.generatePublic(DecSpec)
          val decryptionCipher2 = Cipher.getInstance("RSA")
          decryptionCipher2.init(Cipher.DECRYPT_MODE, DecKey)
          val decryptedMessage = decryptionCipher2.doFinal(strBytes)
          val decmsg = new String(decryptedMessage)
          //println(DecKey)
          //println("Public key string "+getEncoder.encodeToString(DecKey.getEncoded()))
          return decmsg
        }

這是使用 Bouncy Castle 的 ECDSA 通過 JCE 生成公鑰和私鑰的完整示例。

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import static org.bouncycastle.jce.ECNamedCurveTable.getParameterSpec;


public class PublicPrivateKeyExample {

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    private static final SecureRandom DEFAULT_SECURE_RANDOM;

    static {
        DEFAULT_SECURE_RANDOM = new SecureRandom();
        DEFAULT_SECURE_RANDOM.nextBytes(new byte[64]);
    }

    public static void main(String[] args) throws Exception {

        // -----
        // Create a random key-pair using ECDSA provided by bcprov-jdk15on from Bouncy Castle and encode as base64
        // strings
        // -----

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "BC");
        keyPairGenerator.initialize(getParameterSpec("secp521r1"), DEFAULT_SECURE_RANDOM);

        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        Base64.Encoder encoder = Base64.getEncoder();
        String publicKeyStr = encoder.encodeToString(publicKey.getEncoded());
        String privateKeyStr = encoder.encodeToString(privateKey.getEncoded());

        // -----
        // Decode the base64 public and private keys back to a JCE's PublicKey and PrivateKey
        // -----

        KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", "BC");
        Base64.Decoder decoder = Base64.getDecoder();

        PublicKey decodedPublicKey = keyFactory.generatePublic(new X509EncodedKeySpec(decoder.decode(publicKeyStr)));
        PrivateKey decodedPrivateKey =
                keyFactory.generatePrivate(new PKCS8EncodedKeySpec(decoder.decode(privateKeyStr)));

        assert publicKey.getEncoded() == decodedPublicKey.getEncoded();
        assert privateKey.getEncoded() == decodedPrivateKey.getEncoded();
    }
}

這是使用 Java 8 測試的,如下所示:

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.60</version>
</dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM