2017-06-19 16 views
7

Tôi đang cố chuyển đổi khóa gpg ECC bọc thép thành lớp java tương ứng ECPrivateKey/ECPublicKey.Khóa công khai/riêng tư ECC bọc thép (được tạo từ gpg cli) trong java

Để tạo cặp khóa Tôi đang sử dụng: gpg --expert --full-generate-key

sau đó chọn (9) ECC và ECC (hoặc (10) ECC (chỉ đăng))

Sau đó chọn (3) NIST P- 256

Hệ quả là:

-----BEGIN PGP PUBLIC KEY BLOCK----- 

mFIEWUdzwhMIKoZIzj0DAQcCAwQkAvZC1PIJ8ke1myyKhNny9vN78TIYo2MuAOY+ 
F38L9S3+Za9cKV/iIHOqfapbMoqdSmSnqDkevwQSr5MF2UOXtCJzaWduZWNjIChF 
Q0Mgc2lnbiBvbmx5KSA8c3NAc3MuY28+iJAEExMIADgWIQRiC+kefVkjnjKovKy5 
XANFl5+n1gUCWUdzwgIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRC5XANF 
l5+n1mzGAQDsgutymxDTTXPKFfpFFVp4fxacx1MSqxP71gNJYjguXwD8CEXD20Vm 
aU1WMi2jU7JC6oJn94Y4vWHwTLOU1zmQ19o= 
=swfS 
-----END PGP PUBLIC KEY BLOCK----- 

-----BEGIN PGP PRIVATE KEY BLOCK----- 

lHcEWUdzwhMIKoZIzj0DAQcCAwQkAvZC1PIJ8ke1myyKhNny9vN78TIYo2MuAOY+ 
F38L9S3+Za9cKV/iIHOqfapbMoqdSmSnqDkevwQSr5MF2UOXAAD9FhS2HZoWOyIi 
l9nj+WPa9S1o50jM5bNIRALzcyS8SgoP97Qic2lnbmVjYyAoRUNDIHNpZ24gb25s 
eSkgPHNzQHNzLmNvPoiQBBMTCAA4FiEEYgvpHn1ZI54yqLysuVwDRZefp9YFAllH 
c8ICGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQuVwDRZefp9ZsxgEA7ILr 
cpsQ001zyhX6RRVaeH8WnMdTEqsT+9YDSWI4Ll8A/AhFw9tFZmlNVjIto1OyQuqC 
Z/eGOL1h8EyzlNc5kNfa 
=qHBB 
-----END PGP PRIVATE KEY BLOCK----- 

làm thế nào để tôi nhận được từ định dạng văn bản bọc thép này cho một người java.security.interfaces.ECPrivateKey và java.security.interfaces.ECP hợp lệ ublicKey lớp java?

mục tiêu cuối cùng của tôi là để đăng nhập theo cách sau:

String createSignatureFromJson(String jsonPayload, byte[] privateKey) { 
     Payload payload = new Payload(jsonPayload) 
     def key = privateKeyParse(privateKey) 

     JWSSigner signer = new ECDSASigner((ECPrivateKey)key) 
     JWSHeader header = new JWSHeader.Builder(JWSAlgorithm.ES256).build() 

     JWSObject jwsObject = new JWSObject(header, payload) 
     jwsObject.sign(signer) 
     jwsObject.signature 
    } 

Trả lời

1
public static ECPrivateKey privateKeyParse(byte[] privateKey) throws Exception { 

     InputStream pgpIn = PGPUtil.getDecoderStream(new ByteArrayInputStream(privateKey)); 

     PGPObjectFactory pgpFact = new PGPObjectFactory(pgpIn, new JcaKeyFingerprintCalculator()); 
     PGPSecretKeyRing pgpSecRing = (PGPSecretKeyRing) pgpFact.nextObject(); 
     PGPSecretKey pgpSec = pgpSecRing.getSecretKey(); 

     PGPPrivateKey pgpPriv = pgpSec.extractPrivateKey(null); 

     JcaPGPKeyConverter converter = new JcaPGPKeyConverter(); 
     // this is the part i was missing from Peter Dettman's answer. pass BC provider to the converter 
     converter.setProvider(new BouncyCastleProvider()); 
     PrivateKey key = converter.getPrivateKey(pgpPriv); 
     return (ECPrivateKey) key; 
    } 
4

Nếu bạn chỉ cần vượt qua trong 'khối private key', điều này sẽ trích xuất các ECPrivateKey:

private static ECPrivateKey privateKeyParse(byte[] privateKey) throws Exception 
{ 
    InputStream pgpIn = PGPUtil.getDecoderStream(new ByteArrayInputStream(privateKey)); 

    PGPObjectFactory pgpFact = new PGPObjectFactory(pgpIn, new JcaKeyFingerprintCalculator()); 
    PGPSecretKeyRing pgpSecRing = (PGPSecretKeyRing)pgpFact.nextObject(); 
    PGPSecretKey pgpSec = pgpSecRing.getSecretKey(); 
    PGPPrivateKey pgpPriv = pgpSec.extractPrivateKey(null); 

    return (ECPrivateKey)new JcaPGPKeyConverter().getPrivateKey(pgpPriv); 
} 

Để trả lời một câu hỏi nhận xét về cách nhận 'khóa riêng tư', nếu toàn bộ:

-----BEGIN PGP PRIVATE KEY BLOCK----- 
... 
-----END PGP PRIVATE KEY BLOCK----- 

có trong tệp, đọc toàn bộ tập tin vào một byte []:

InputStream fIn = new BufferedInputStream(new FileInputStream(...)); 
byte[] privateKey = org.bouncycastle.util.io.Streams.readAll(fIn); 
+0

bạn có thể cụ thể hơn về làm thế nào để nhận được từ khối private key để byte [] tham số privateKey? –

+0

Tôi nhận được java.io.IOException: PGP chưa biết công thuật toán quan trọng gặp trên: PGPSecretKeyRing pgpSecRing = (PGPSecretKeyRing) pgpFact.nextObject() khi cung cấp các khối private key để phương pháp của bạn theo cách sau: privateKeyBlock. split ('\ n'). join(). bytes –

+0

Bạn đang sử dụng phiên bản BC nào? Tôi nghĩ rằng khóa PGP EC chỉ được hỗ trợ từ khoảng 1,50. –

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