2010-02-07 34 views
8

Trong Java, tôi có khóa công khai ECDH mà tôi đang gửi dưới dạng mảng byte.Biến mã hóa byte trở lại thành ECPublicKey ban đầu trong Bouncy Castle

Khi tôi đã nhận được mảng byte làm thế nào tôi có thể biến nó trở lại thành một khóa công khai?

Tôi đang sử dụng Lâu đài Bouncy nhưng giải pháp Java sẽ hữu ích.

Cảm ơn

+1

lớp bạn đang sử dụng để đại diện cho Java ECDH của bạn là gì khóa công khai? Bạn nhận được câu trả lời tốt hơn bằng cách hiển thị mã của bạn và không yêu cầu mọi người đoán. –

Trả lời

-1

Làm thế nào các byte thô được định dạng cho khóa ECDH? Bạn nhận được byte thô ở đâu?

Thông thường, người ta sử dụng lớp * Spec thích hợp để biến nguyên liệu chính thành Khóa nhưng các lớp ECPublicKeySpecDHPublicKeySpec không chấp nhận mảng byte thô.

4

Khi bạn nhận khóa được mã hóa, giả sử bạn đã sử dụng phương thức "[keyPair] .getPublic(). GetEncoded()" mặc định của bạn, thao tác này sẽ hoạt động.

X509EncodedKeySpec ks = new X509EncodedKeySpec(pubKeyByteString.toByteArray()); 
    KeyFactory kf; 
    try { 
     kf = java.security.KeyFactory.getInstance("ECDH"); 
    } catch (NoSuchAlgorithmException e) { 
     log.error("Cryptography error: could not initialize ECDH keyfactory!", e); 
     return; 
    } 

    ECPublicKey remotePublicKey; 

    try { 
     remotePublicKey = (ECPublicKey)kf.generatePublic(ks); 
    } catch (InvalidKeySpecException e) { 
     log.warn("Received invalid key specification from client",e); 
     return; 
    } catch (ClassCastException e) { 
     log.warn("Received valid X.509 key from client but it was not EC Public Key material",e); 
     return; 
    } 
+0

bạn đã lưu ngày của tôi .. Cảm ơn câu trả lời của bạn .. – Bunny

+0

Tôi nhận được java.security.spec.InvalidKeySpecException: thông số khóa được mã hóa không được nhận dạng – Justas

3

Tôi đã tìm thấy giải pháp trên bởi @LaceCard không có tác dụng đối với tôi. Nói chung đây là không rõ ràng nhưng sau đó một lần nữa không có gì trong mật mã là;)

String key = "MihU9ztW9sEvkBL6BxyaOMgkSbodNS8yoHaHcio+WE...blahblah" 
byte[] keyBytes = Base64.decode(key); 

//If using Android and Spongycastle provider should be "SC" 
KeyFactory kf = KeyFactory.getInstance("ECDH", "BC"); 
//CURVE_NAME e.g prime192v1 
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(CURVE_NAME); 
ECPoint point = ecSpec.getCurve().decodePoint(keyBytes); 
ECPublicKeySpec pubSpec = new ECPublicKeySpec(point, ecSpec); 

ECPublicKey myECPublicKey = (ECPublicKey) kf.generatePublic(pubSpec); 

Lưu ý: bạn sẽ cần phải xử lý các trường hợp ngoại lệ tiềm năng một cách thích hợp