java RSAPrivateKey से RSAPrivateCrtKey कैसे प्राप्त करें?



cryptography (1)

मेरे पास एक java.security.interfaces.RSAPrivateKey और संबंधित java.security.interfaces.RSAPublicKey युक्त (केवल) मापांक, निजी घातांक और सार्वजनिक प्रतिपादक।

अगर मैं आरएसए सही समझता हूं, तो जावा .security.interfaces.RSAPrivateCrtKey (सीआरटी कुंजियों के लिए) के नंबरों को पुनर्प्राप्त करना संभव है।

यदि ऐसा है, तो मुझे इसे कैसे करना है? (मुझे लगता है कि कुछ कार्यान्वयन पहले से ही है)।


ऐसा करना संभव है, और मापदंडों को खोजने के लिए एक अपेक्षाकृत तेजी से एल्गोरिथ्म है यहां कुछ जावा कोड है जो एल्गोरिदम को दिखाता है।

/**
 * 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);

}




rsa