with mkyong from example encrypt code java cryptography rsa

mkyong - rsa java code



¿Cómo obtener una RSAPrivateCrtKey desde una RSAPrivateKey? (1)

Tengo una java.security.interfaces.RSAPrivateKey y la java.security.interfaces.RSAPublicKey correspondiente que contiene (solo) módulo, exponente privado y exponente público.

Si entiendo bien RSA, debería ser posible recuperar los números para java.security.interfaces.RSAPrivateCrtKey (para claves CRT).

Si es así, ¿cómo lo hago? (Supongo que ya hay alguna implementación).


Es posible hacer esto, y hay un algoritmo relativamente rápido para encontrar los parámetros. Aquí hay un código de Java que ilustra el algoritmo.

/** * Find a factor of n by following the algorithm outlined in Handbook of Applied Cryptography, section * 8.2.2(i). See http://cacr.uwaterloo.ca/hac/about/chap8.pdf. * */ private static BigInteger findFactor(BigInteger e, BigInteger d, BigInteger n) { BigInteger edMinus1 = e.multiply(d).subtract(BigInteger.ONE); int s = edMinus1.getLowestSetBit(); BigInteger t = edMinus1.shiftRight(s); for (int aInt = 2; true; aInt++) { BigInteger aPow = BigInteger.valueOf(aInt).modPow(t, n); for (int i = 1; i <= s; i++) { if (aPow.equals(BigInteger.ONE)) { break; } if (aPow.equals(n.subtract(BigInteger.ONE))) { break; } BigInteger aPowSquared = aPow.multiply(aPow).mod(n); if (aPowSquared.equals(BigInteger.ONE)) { return aPow.subtract(BigInteger.ONE).gcd(n); } aPow = aPowSquared; } } } public static RSAPrivateCrtKey createCrtKey(RSAPublicKey rsaPub, RSAPrivateKey rsaPriv) throws NoSuchAlgorithmException, InvalidKeySpecException { BigInteger e = rsaPub.getPublicExponent(); BigInteger d = rsaPriv.getPrivateExponent(); BigInteger n = rsaPub.getModulus(); BigInteger p = findFactor(e, d, n); BigInteger q = n.divide(p); if (p.compareTo(q) > 1) { BigInteger t = p; p = q; q = t; } BigInteger exp1 = d.mod(p.subtract(BigInteger.ONE)); BigInteger exp2 = d.mod(q.subtract(BigInteger.ONE)); BigInteger coeff = q.modInverse(p); RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(n, e, d, p, q, exp1, exp2, coeff); KeyFactory kf = KeyFactory.getInstance("RSA"); return (RSAPrivateCrtKey) kf.generatePrivate(keySpec); }