我正试图找到一种方法来验证两个SSH2密钥,一个私有密钥和一个公共密钥,属于同一个密钥对。我使用JSch来加载和解析私钥。
更新:可以显示如何从私钥(SSH2 RSA)重新生成公钥的代码段可以解决问题。
答案 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)