【问题标题】:How to validate a public and private key pair in Java如何在 Java 中验证公钥和私钥对
【发布时间】:2018-08-31 18:48:32
【问题描述】:

有没有办法在 java 中验证给定的私钥,比如某个 *.key 文件是否与某个公钥匹配,是否使用 RSA 算法验证某个 .pub 文件?

【问题讨论】:

标签: java cryptography rsa


【解决方案1】:

您可以通过验证密钥对是否匹配

  • 创建挑战(足够长的随机字节序列)
  • 签署使用私钥挑战
  • 验证使用公钥的签名

这为您提供了足够高的置信度(几乎可以确定),如果签名验证正常,则密钥对匹配,并且绝对确定密钥对不匹配。

示例代码:

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

【讨论】:

  • 非常感谢,它成功了!我也必须研究这段代码。
  • 您能否提供与此相关的任何链接,以便我了解它的工作原理?
  • Java 教程:生成和验证签名 -> docs.oracle.com/javase/tutorial/security/apisign/index.html
  • 通常使用签名来验证消息是否未被更改。它还可用于通过使用经过签名然后验证的质询来识别各方(一个拥有私钥,另一个拥有公钥)。我们将其用于身份验证:服务器提出质询,客户端对其进行签名(使用私钥),服务器通过验证签名质询(使用客户端的公钥)来验证身份。
  • 感谢您的解释,也将查看链接。
【解决方案2】:

标记为正确的答案会浪费大量 CPU 周期。这个答案的 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());

【讨论】:

    猜你喜欢
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2020-04-04
    相关资源
    最近更新 更多