给定两个SSH2密钥,如何检查它们是否属于Java中的同一密钥对?

时间:2010-12-13 11:15:29

标签: java validation rsa

我正试图找到一种方法来验证两个SSH2密钥,一个私有密钥和一个公共密钥,属于同一个密钥对。我使用JSch来加载和解析私钥。

更新:可以显示如何从私钥(SSH2 RSA)重新生成公钥的代码段可以解决问题。

4 个答案:

答案 0 :(得分:9)

您可以使用BouncyCastle轻量级API执行此操作。

例如:

InputStream in = new FileInputStream("path/to/private/key");
AsymmetricKeyParameter privateKey = PrivateKeyFactory.createKey(in);
RSAPrivateCrtKeyParameters rsaPrivateKey = (RSAPrivateCrtKeyParameters)privateKey;
BigInteger modulus = rsaPrivateKey.getModulus();
BigInteger publicExponent = rsaPrivateKey.getPublicExponent();
RSAKeyParameters publicKeyParams = new RSAKeyParameters(false, modulus, publicExponent);

RSAKeyParameters类代表实际的密钥。

希望有所帮助!

答案 1 :(得分:1)

也许这就是您所需要的:How do you test a public/private DSA keypair?

更新:对于纯Java解决方案,请查看标准化Java加密扩展(JCE):http://download.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#KeyGenerator

更新2:这是来自RSA的代码示例(名为“go”的方法生成密钥对):http://www.rsa.com/products/bsafe/documentation/cryptoj35html/doc/dev_guide/group__CJ__SAMPLES__RSANOPAD__JCE.html

更新3:这是一个处理解析JCE公钥的链接:How do we convert a String from PEM to DER format

答案 2 :(得分:1)

我使用Java安全性(普通J2SE)编写了这个util方法:

public static boolean validateRSAKeyPair(RSAPrivateCrtKey privateKey, RSAPublicKey publicKey) {
    BigInteger n = publicKey.getModulus();
    BigInteger e = publicKey.getPublicExponent();
    BigInteger d = privateKey.getPrivateExponent();
    BigInteger p = privateKey.getPrimeP();
    BigInteger q = privateKey.getPrimeQ();

    BigInteger pq = p.multiply(q);//shold equal to n
    BigInteger eulerMod = p.add(NEGATIVE_ONE).multiply(q.add(NEGATIVE_ONE));// φ(n)=(p-1)*(q-1)
    BigInteger mod = d.multiply(e).mod(eulerMod);// (d*e) mod φ(n), should be 1
    return n.equals(pq) && BigInteger.ONE.equals(mod);
}

它通过RSA算法的参数验证RSA密钥对。

答案 3 :(得分:0)

我知道是作弊但是你可以调用像这样的过程:

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

请参阅this