2012-03-12 30 views
5

Tôi đang tạo cặp khóa trên nền tảng bằng cách sử dụng gói Bouncy Castle.Cách lấy PublicKey từ AsymmetricCipherKeyPair, không phải tham số publickeycipher?

SecureRandom random = new SecureRandom(); 

ECKeyPairGenerator pGen = new ECKeyPairGenerator(); 

ECKeyGenerationParameters genParam = new ECKeyGenerationParameters(params,random); 

pGen.init(genParam); 

AsymmetricCipherKeyPair pair = pGen.generateKeyPair(); 

Ở đây, pair thuộc loại AsymmetricCipherKeyPair. Và, tôi cần phải tạo ra một X509V1Certificate tại máy chủ bằng cách sử dụng cặp này. Nhưng, X509Certificate's setPublicKey(PublicKey pubkey) chỉ chấp nhận các đối tượng thuộc loại PublicKey. Vì vậy, tôi cần truy xuất số PublicKey từ số AsymmetricCipherKeyPair tại máy chủ. Nhưng, tôi nhận được ECPublicKeyParameters, không được chấp nhận theo phương thức setPublicKey.

Vì vậy, yêu cầu của tôi ở đây là lấy số PublicKey từ số AsymmetricCipherKeyPair.

+0

Nếu bạn đang ở trong Java Môi trường ME thì bạn không có java.se curity.PublicKey hoặc java.security.cert. –

+0

Cảm ơn bạn đã trả lời .. Tôi đang gửi khóa công khai của ứng dụng khách j2me đến máy chủ để nhận chứng chỉ ứng dụng khách. Máy chủ nhận khóa công khai nhưng khi tạo X509Certificate, không thể đặtPublicKey() bằng khóa công khai đã nhận. Vì đã nhận được khóa công khai của loại ECPublicKeyparameters. Vì vậy, tôi muốn thay đổi loại khóa công khai này thành PublicKey tại máy chủ. Vui lòng đề cập đến các đề xuất. Cảm ơn bạn trước. –

+0

Vậy làm cách nào để bạn gửi khóa từ máy khách j2me đến máy chủ? Bạn đã tuần tự hóa hoặc mã hóa nó theo một cách nào đó? –

Trả lời

3

Cách đơn giản nhất là sử dụng BouncyCastle như JavaCryptoProvider:

  1. Tạo cặp khóa

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC"); 
    ECGenParameterSpec ecsp = new ECGenParameterSpec(keyAlg); 
    kpg.initialize(ecsp); 
    KeyPair kp = kpg.generateKeyPair(); 
    
  2. Hãy X509v1 Cert

    X509V1CertificateGenerator certGen = new X509V1CertificateGenerator(); 
    X500Principal dnName = new X500Principal("CN=C3"); 
    Calendar c = Calendar.getInstance(); 
    c.add(Calendar.YEAR, 10); 
    certGen.setSerialNumber(keyId); 
    certGen.setIssuerDN(dnName); 
    certGen.setNotBefore(new Date()); 
    certGen.setNotAfter(c.getTime()); 
    certGen.setSubjectDN(dnName);      
    certGen.setPublicKey(keyPair.getPublic()); 
    certGen.setSignatureAlgorithm("SHA256withECDSA"); 
    certGen.generate(keyPair.getPrivate(), "BC"); 
    
+0

Thư viện lâu đài bouncy nhẹ (được sử dụng trong nền tảng J2ME) không chứa lớp KeyPairGenerator. SO, tôi đã sử dụng ECKeyPairGenerator thay cho lớp KeyPairGenerator. Và cặp mà chúng tôi đã thu được từ điều này, dưới hình thức AsymmetricCipherKeyPair. Nhưng X.509V1CertificateGenerator không cho phép một cặp khóa của loại này. Vì vậy, tôi cần phải chuyển đổi biểu mẫu này thành biểu mẫu KeyPair. Cảm ơn bạn. –

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