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

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

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

您可以使用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类表示实际的键。

希望有所帮助!

也许这就是你要找的: 你如何测试公共/私人DSA密钥对?

更新:对于纯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公钥的链接: 我们如何将字符串从PEM转换为DER格式

我使用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算法的参数validationRSA密钥对。

我知道是作弊但是你可以调用一个过程:

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

看到这个 。