簡體   English   中英

如何在 Java 中驗證公鑰和私鑰對

[英]How to validate a public and private key pair in Java

如果給定的私鑰(例如某個 *.key 文件與某個公鑰匹配)到某個使用 RSA 算法的 .pub 文件,有沒有辦法在 java 中進行驗證?

您可以通過以下方式驗證密鑰對是否匹配

  • 創建挑戰(足夠長的隨機字節序列)
  • 私鑰簽署挑戰
  • 使用公鑰驗證簽名

這為您提供了足夠高的置信度(幾乎確定),如果簽名驗證正常,則密鑰對匹配,否則絕對確定密鑰對不匹配。

示例代碼:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);

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

// create a challenge
byte[] challenge = new byte[10000];
ThreadLocalRandom.current().nextBytes(challenge);

// sign using the private key
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(privateKey);
sig.update(challenge);
byte[] signature = sig.sign();

// verify signature using the public key
sig.initVerify(publicKey);
sig.update(challenge);

boolean keyPairMatches = sig.verify(signature);

被標記為正確的答案會浪費大量 CPU 周期。 這個答案是 waaaay CPU 效率更高:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);

KeyPair keyPair = keyGen.generateKeyPair();
RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

// comment this out to verify the behavior when the keys are different
//keyPair = keyGen.generateKeyPair();
//publicKey = (RSAPublicKey) keyPair.getPublic();

boolean keyPairMatches = privateKey.getModulus().equals(publicKey.getModulus()) &&
    privateKey.getPublicExponent().equals(publicKey.getPublicExponent());

暫無
暫無

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

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