Tôi muốn tạo khóa riêng tư từ một chuỗi (một tệp .pem
) trong Java.Cách tạo khóa Riêng RSA từ chuỗi * pem trong Java
private static final String test = "-----BEGIN RSA PRIVATE KEY-----\n" +
"MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" +
// and so on
"-----END RSA PRIVATE KEY-----";
try {
String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", "");
byte [] encoded = Base64.decode(privKeyPEM);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privKey = kf.generatePrivate(keySpec);
}
catch (Exception e) {
e.printStackTrace();
}
Dòng cuối cùng (generatePrivate chức năng) được ném ngoại lệ này:
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
at java.security.KeyFactory.generatePrivate(Unknown Source)
at Test.main(Test.java:52)
Caused by: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.pkcs.PKCS8Key.decode(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.<init>(Unknown Source)
at sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(Unknown Source)
at sun.security.rsa.RSAKeyFactory.generatePrivate(Unknown Source)
... 3 more
Nếu tôi thay đổi khóa bí mật với giá trị từ một tập tin .der
nó hoạt động đúng cách, nhưng tôi cần phải tạo ra các tin tệp khóa từ tệp .pem
.
Tôi đã đính kèm ảnh chụp màn hình các byte được in dưới dạng chuỗi (một lần được mã hóa cứng bằng \ n và một khi được mã hóa cứng mà không có \ n) và một lần từ tệp.
Điều kỳ lạ là các đầu ra từ các tập tin khác với sản lượng từ chuỗi.
Nếu tôi cố gắng mã hóa tệp .der
với Base64, kết quả khác với chuỗi trong tệp .pem
. Tại sao vậy?
Bạn có tìm thấy câu trả lời nào không? –
@SankarP không thực sự. – Niklas
được. Tôi đã tìm được giải pháp. Các khóa bắt đầu bằng "----- BEGIN RSA PRIVATE KEY" là các tệp được mã hóa pkcs1. Mã hóa pkcs1 này không được Java hỗ trợ trừ khi bạn có một thư viện bên ngoài như BouncyCastle. Tôi chạy vào cùng một vấn đề ngày hôm qua và sau khoảng 8 giờ, tìm ra giải pháp. Nếu bạn mã hóa khóa riêng với pkcs8, nó sẽ bắt đầu như "--- BEGIN PRIVATE KEY ---" sẽ được xử lý bởi java cổ phiếu. HTH. –