Получение открытого ключа RSA из ключа PKCS1 - PullRequest
2 голосов
/ 30 сентября 2019

Я получаю свой открытый ключ в следующем формате, и мне нужно использовать java для шифрования некоторых данных с помощью этого ключа

----- НАЧАЛО RSA PUBLIC KEY ----- MIGJAoGBAKDZp /3e4w1nJA / ImDMgaGowWfTnhlFkrvS86LBc6wh1 / zBRt51 / 2F / о / ZzaA5mZ nx5YMlhDOf3vHyzyO4KzYlG8md3RQU7eKQQDxgRfW1v0f7WVQoC2Dxbupyz0JVV4jQStYUYW ifGsh76wI3rkzlq3F2Ea / + jqMxX / AZOO30tBAgMBAAE = ----- END RSA ОТКРЫТОГО КЛЮЧА -----

* * 1005

1 Ответ

1 голос
/ 30 сентября 2019

Вы можете использовать библиотеку BouncyCastle для достижения этой цели. Ваш ключ находится в PEM fromat. Чтобы прочитать его, вы можете использовать PEMParser:

private static PublicKey readPublicKey(String path) throws InvalidKeySpecException, NoSuchAlgorithmException, IOException {
    PEMParser pemParser = new PEMParser(new FileReader(path));
    Object object = pemParser.readObject();
    SubjectPublicKeyInfo subjectPublicKeyInfo = (SubjectPublicKeyInfo) object;

    RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(subjectPublicKeyInfo);

    RSAPublicKeySpec rsaSpec = new RSAPublicKeySpec(rsa.getModulus(), rsa.getExponent());
    KeyFactory kf = KeyFactory.getInstance("RSA", new BouncyCastleProvider());
    return kf.generatePublic(rsaSpec);
}

, а затем зашифровать с помощью этого ключа:

PublicKey publicKey = readPublicKey("src/main/resources/key.pem");

String dataToEncrypt = "myMessage";
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", new BouncyCastleProvider());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal(dataToEncrypt.getBytes(StandardCharsets.UTF_8));

Протестировано с версиями: bcpkix-jdk15on иbcprov-jdk15on.

...