簡體   English   中英

ECC公鑰和私鑰設置器

[英]ECC public and private keys setters

我需要使用給定的公鑰和私鑰來測試ECC驗證。 我找到了用於隨機密鑰生成的方法,但是沒有用於特定公共/專用密鑰的設置器。 如何將公鑰/私鑰設置為字節數組?

 byte[] privateKeyBytes = new byte[]{(byte)0x24, (byte)0xF4, (byte)0x36, (byte)0x16, (byte)0xD0, (byte)0x96, (byte)0x12, (byte)0x63, (byte)0x90, (byte)0x2E, (byte)0x51, (byte)0xF6, (byte)0x87, (byte)0x55, (byte)0xAB, (byte)0xCB, (byte)0x5D, (byte)0xAC, (byte)0x56, (byte)0x1A, (byte)0xA5, (byte)0xFA, (byte)0x55, (byte)0xDB};
 byte[] publicKeyBytes = new byte[]{(byte)0x71, (byte)0x0B, (byte)0xCD, (byte)0xF8, (byte)0xEE, (byte)0x7F, (byte)0x36, (byte)0x32, (byte)0xF4, (byte)0x3E, (byte)0x8B, (byte)0x20, (byte)0x54, (byte)0xF7, (byte)0x84, (byte)0x26, (byte)0x4E, (byte)0x96, (byte)0xD9, (byte)0xBA, (byte)0x0F, (byte)0x82, (byte)0x84, (byte)0x2D, (byte)0xC1, (byte)0x31, (byte)0xE0, (byte)0xBF, (byte)0x9F, (byte)0x60, (byte)0x5F, (byte)0xAE, (byte)0x3A, (byte)0xA1, (byte)0x43, (byte)0x50, (byte)0x88, (byte)0x87, (byte)0xFE, (byte)0x49, (byte)0x6C, (byte)0x1F, (byte)0xF6, (byte)0x82, (byte)0x73, (byte)0xD8, (byte)0x77, (byte)0x8F};

 KeyPair pair = g.generateKeyPair();
 PublicKey pubKey = pair.getPublic();
 PrivateKey prikey = pair.getPrivate();

無法設置公鑰和私鑰,因為它們應該生成。

據此,您將無法進行設置。

通常,您可以對消息進行編碼,並將公鑰放入編碼方法中。 拜拜,您有一個像C#中一樣的“ ImportParameters”功能,您可以在其中將“ Key”導入選定的算法(例如RSA)。

編輯:根據答案,您可以像這樣導入。

我建議您生成密鑰,使用序列化形式將其存儲為JSON或其他內容,以便可以再次導入,反序列化並將其導入方法中

用於編碼鍵:

private static PrivateKey generatePrivateKey(KeyFactory factory, byte[] content){
    PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(content);
    return factory.generatePrivate(privKeySpec);
}

private static PublicKey generatePublicKey(KeyFactory factory, byte[] content) {
    X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(content);
    return factory.generatePublic(pubKeySpec);
}

對於未編碼:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp192r1");

ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(new BigInteger(1, privateKeyBytes), spec); 

ECNamedCurveSpec params = new ECNamedCurveSpec("secp192r1", spec.getCurve(), spec.getG(), spec.getN());
java.security.spec.ECPoint w = new java.security.spec.ECPoint(new BigInteger(1, Arrays.copyOfRange(publicKeyBytes, 0, 24)), new BigInteger(1, Arrays.copyOfRange(publicKeyBytes, 24, 48)));
PublicKey publicKey = factory.generatePublic(new java.security.spec.ECPublicKeySpec(w, params));

暫無
暫無

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

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