簡體   English   中英

橢圓曲線密碼學 (ECDSA) 私鑰匹配公鑰 (Java - Bouncy Castle)

[英]Elliptic Curve Cryptography (ECDSA) Private Key Matches Public Key (Java - Bouncy Castle)

我嘗試將橢圓曲線數字簽名算法 (ECDSA) 與 Bouncy Castle 和 Java 一起使用。 我想生成一個公鑰和私鑰。 問題是這些鍵具有完全相同的值。 讓我們看一下代碼:

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "BC");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
ECGenParameterSpec params = new ECGenParameterSpec("prime256v1");
keyPairGenerator.initialize(params, secureRandom); 
KeyPair keyPair = keyPairGenerator.generateKeyPair();

我使用java.security相關的類:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;

一切正常,但問題是公鑰與私鑰匹配。 我很困惑,因為公鑰應該是橢圓曲線上的一個點(到目前為止還不錯)。 私鑰應該是一個整數,但它與公鑰在同一點(在曲線上)。 我錯過了什么嗎? 當我打印公鑰和私鑰值時:

EC Public Key [f9:63:ec:0b:ca:a4:c6:f8:50:d0:2f:29:8b:23:10:13:d8:1c:2f:16]
        X: 818af4b0ed955e273c4d81c1480db282293b95881b7f04dba897da0cef3a91de
        Y: 3b00a30ced960780a8a830b928601dbfd32ac09e8e19e2297f8831f66e80fd15

EC Private Key [f9:63:ec:0b:ca:a4:c6:f8:50:d0:2f:29:8b:23:10:13:d8:1c:2f:16]
        X: 818af4b0ed955e273c4d81c1480db282293b95881b7f04dba897da0cef3a91de
        Y: 3b00a30ced960780a8a830b928601dbfd32ac09e8e19e2297f8831f66e80fd15

您剛剛對對象進行了系統輸出。 這些確實是公共規格。 如果您檢查密鑰的實際字節,您會看到不同之處:

@Test
void stackOverflowQuestion() throws Exception{
    Security.addProvider(new BouncyCastleFipsProvider());

    final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", BouncyCastleFipsProvider.PROVIDER_NAME);
    final SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    final ECGenParameterSpec params = new ECGenParameterSpec("prime256v1");
    keyPairGenerator.initialize(params, secureRandom);
    final KeyPair keyPair = keyPairGenerator.generateKeyPair();

    System.out.println(keyToBase64String(keyPair.getPrivate()));
    System.out.println(keyToBase64String(keyPair.getPublic()));
}

public static String keyToBase64String(final Key key) {
    return bytesToBase64(key.getEncoded());
}

private static String bytesToBase64(final byte[] bytes) {
    return Base64.getEncoder().encodeToString(bytes);
}

輸出:

MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQggbwdSOULxslgm+ckKNW9d0gtPAPUrSjU29Rtk6szTeKgCgYIKoZIzj0DAQehRANCAASP3lAcUGCqmvYUt9hZEjPArtcdBlUYC3Sac9XSpZFRkFnWmIHxwx40ejFXxE9U2mq+VDMe21rjXBvdnqxHyCV4
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEj95QHFBgqpr2FLfYWRIzwK7XHQZVGAt0mnPV0qWRUZBZ1piB8cMeNHoxV8RPVNpqvlQzHtta41wb3Z6sR8gleA==

另外,不要使用 SHA1PRNG。 您可以信任 BC 提供的安全隨機數。 改用: keyPairGenerator.initialize(params);

暫無
暫無

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

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