2013-08-21 35 views
6

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.

Bigger Image

Output

Đ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?

+0

Bạn có tìm thấy câu trả lời nào không? –

+0

@SankarP không thực sự. – Niklas

+0

đượ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. –

Trả lời

1

Bạn nói rằng dòng cuối cùng là ném ngoại lệ, ví dụ:

PrivateKey privKey = kf.generatePrivate(keySpec);

Trên dòng hoạt động trên keyspecs được thiết lập đúng, tức là

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);

vấn đề Vì vậy, thực tế là với byte được mã hóa mảng. Bạn đã thực hiện System.out sau byte [] encoded = Base64.decode(privKeyPEM); và xem đầu ra là gì không.

Tôi hiểu rằng nếu thư ở định dạng MIME, thì sau một số ký tự, nó sẽ kết hợp vận chuyển trở lại và dòng mới để các chuỗi không quá dài cho hệ thống e-mail hoặc bất cứ nơi nào bạn đang sử dụng.

Kiểm tra chuỗi cuối cùng có một số '\ n' trong văn bản gốc mà bạn sử dụng. Bạn đã thoát khỏi văn bản khác phù hợp dưới đây,

String privKeyPEM = test.replace("-----BEGIN RSA PRIVATE KEY-----\n", ""); 
    privKeyPEM = privKeyPEM.replace("-----END RSA PRIVATE KEY-----", ""); 

Nhưng, nhìn vào chuỗi,

"MIIEpAIBAAKCAQEAvcCH8WsT1xyrZqq684VPJzOF3hN5DNbowZ96Ie//PN0BtRW2\n" + 
// and so on 
     "-----END RSA PRIVATE KEY-----"; 

nó có thể có một số chi tiết '\ n' trái mà có thể dẫn đến một số ký tự không mong muốn khi bạn tạo ra keyspec. Hãy thử System.out hơn và xem những gì mảng byte được mã hóa là như thế và cũng trước đó kiểm tra String privKeyPEM và xem nếu bất kỳ nhân vật phụ không còn lại trong nó.

Hy vọng con thỏ này.

+1

Tôi đã tải lên đầu ra của 'được mã hóa'. http://pastebin.com/YUsNdhgW. Tôi cũng đã thay đổi thử nghiệm thành chuỗi thuần mà không có '\ n' và nó cũng không hoạt động. – Niklas

+0

Tôi cũng đã tải lên ảnh chụp màn hình với đầu ra dưới dạng chuỗi. – Niklas

+0

Giải mã Base64 bỏ qua các dấu ngắt dòng và thường là tất cả khoảng trắng. –

Các vấn đề liên quan