RSA-шифрование: InvalidKeyException: неверный формат ключа - PullRequest
2 голосов
/ 12 августа 2010

Мне нужно прочитать файлы ключей pem, чтобы получить открытый ключ RSA, а затем использовать их для шифрования.Я могу сделать это с помощью openssl и конвертировать файл pem в файл der.и затем загрузите мой ключ, используя X509EncodedKeySpec и PKCS8EncodedKeySpec.Но я не хочу этого делать, потому что pem - это формат обмена ключами пользователя.Пользователь может зарегистрировать свой собственный ключ, например:

--BEGIN PUBLIC KEY-- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGi0/vKrSIIQMOm4atiw+2s8tSojOKHsWJU3oPTm

b1a5UQIH7CM3NgtLvUF5DqhsP2jTqgYSsZSl+W2RtqCFTavZTWvmc0UsuK8tTzvnCXETsnpjeL13

Hul9JIpxZVej7b6KxgyxFAhuz2AGscvCXnepElkVh7oGOqkUKL7gZSD7AgMBAAE=

--END PUBLIC KEY--

и этот ключ хранится в базе данных в этом формате ...

Вот код, который я пробовал ..

File pubKeyFile=new File("D:/public_key.pem");
DataInputStream dis = new DataInputStream(new FileInputStream(pubKeyFile));
byte[] pubKeyBytes = new byte[(int)pubKeyFile.length()];
dis.readFully(pubKeyBytes);
dis.close();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKeyBytes);
RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec);

Я получаю исключение как

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

Поскольку я совершенно не знаком с концепциями шифрования, кто-нибудь может помочь мне разрешить это исключение?

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

При упругом замке это будет сделано следующим образом:

CertificateFactory cf = CertificateFactory.getInstance("X509", "BC");
InputStream is = new FileInputStream("D:/public_key.pem");
X509Certificate certificate = (X509Certificate) cf.generateCertificate(is);
is.close();
RSAPublicKey pubKey = (RSAPublicKey)certificate.getPublicKey();
1 голос
/ 12 мая 2018

Вы были почти там, со стандартным провайдером.Вам просто нужно удалить строки верхнего и нижнего колонтитула:

List<String> lines = Files.readAllLines(Paths.get(path), StandardCharsets.US_ASCII);
if (lines.size() < 2) 
    throw new IllegalArgumentException("Insufficient input");
if (!lines.remove(0).startsWith("--"))
    throw new IllegalArgumentException("Expected header");
if (!lines.remove(lines.size() - 1).startsWith("--")) 
    throw new IllegalArgumentException("Expected footer");
byte[] raw = Base64.getDecoder().decode(String.join("", lines));
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey pub = factory.generatePublic(new X509EncodedKeySpec(raw));
0 голосов
/ 04 ноября 2018

попробуйте использовать PemReader от bouncycastele.

PublicKey getPublicKey(String pubKeyStr) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { 
    PemObject pem = new PemReader(new StringReader(pubKeyStr)).readPemObject();
    byte[] pubKeyBytes = pem.getContent();
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKeyBytes);
    RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(pubSpec);
    return pubKey;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...