Проблема создания открытого ключа RSA из текста в Bouncy Castle - PullRequest
0 голосов
/ 09 апреля 2019

У меня проблема с созданием открытого ключа из текста открытого ключа.Я нашел решение по этой ссылке Создание открытого ключа RSA из строки .Они упомянули Bouncy Castle (облегченный API) в качестве библиотеки для решения ошибки InvalidKeySpecException при преобразовании строки открытого ключа в открытый ключ RSA.Но это решение не удалось с моим делом.Программа выдает здесь исключение

Исключение в потоке "main" java.lang.IllegalArgumentException: неверный размер последовательности: 9

Создание открытого ключа RSA из строки

   String publicKeyB64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3AQKDhhtcM5A1a8R9/VX" +
            "mrocKGaQlat2/MRFy/Y1fTabYyKkfgaRXyrHiRn+imq3ljEgx/vLRTTPtLt8H79a" +
            "iMU6WJkQwG504NCnDRVB9DZBoAYDtBkjtje7I2Xs3tzvlNwM0bcCmmj/6QE9rHEv" +
            "xhvvXO8M332hINORLNiCF6NvYHrIVSa8EU4F0bnlWpoNi0YhP45uyOOuPpVmsaxp" +
            "MWOycf3nTICKK5BDylnVO7kMcL1utJxOOb1fsotaLuge4fF84DG4cPpLZko3ksB/" +
            "voOLTDv5QRsn++8qRciK4sptlnOs8g2TrXjE/rZlP9QmpUV4a3iQ1WmsqWQVizmw" +
            "PwIDAQAB";

    byte[] decoded = Base64.getDecoder().decode(publicKeyB64);
    org.bouncycastle.asn1.pkcs.RSAPublicKey pkcs1PublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(decoded);
    BigInteger modulus = pkcs1PublicKey.getModulus();
    BigInteger publicExponent = pkcs1PublicKey.getPublicExponent();
    RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    PublicKey generatedPublic = kf.generatePublic(keySpec);
    System.out.printf("Modulus: %X%n", modulus);
    System.out.printf("Public exponent: %d ... 17? Why?%n", publicExponent); // 17? OK.
    System.out.printf("See, Java class result: %s, is RSAPublicKey: %b%n", generatedPublic.getClass().getName(), generatedPublic instanceof RSAPublicKey);

Так что я действительно жду совета, чтобы справиться с этим.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Данные, которые вы отредактировали, являются открытым ключом, но не в формате PKCS1; это более распространенный (и обычно более полезный) формат X.509 SubjectPublicKeyInfo. Эта разница объясняется в Q, который вы связали . Хотя этот формат поддерживается BouncyCastle, он также поддерживается непосредственно Java crypto (JCA) с использованием (технически неточного) имени X509EncodedKeySpec, поэтому гораздо проще сделать следующее:

byte[] decoded = Base64.getDecoder().decode(publicKeyB64);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey generatedPublic = kf.generatePublic(new X509EncodedKeySpec(decoded));
0 голосов
/ 09 апреля 2019

Если ваш открытый ключ правильный, вы сможете прочитать его в командной строке, чтобы устранить проблему.Попробуйте использовать эти команды:

$ openssl rsa -inform PEM -pubin -in pub.key -text -noout
$ openssl pkey -inform PEM -pubin -in pub.key -text -noout

Замените "pub.key" на ваш файл открытого ключа.

...