代码之家  ›  专栏  ›  技术社区  ›  Aravind S

如何在Java中验证公钥和私钥对

  •  7
  • Aravind S  · 技术社区  · 8 年前

    是否有一种方法可以在java中验证给定的私钥,比如说,确定*。密钥文件与某个公钥匹配,以达到某个。使用RSA算法发布文件?

    2 回复  |  直到 8 年前
        1
  •  15
  •   Peter Walser    8 年前

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

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

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

    示例代码:

    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);
    
        2
  •  3
  •   neubert    5 年前

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