2010-11-03 32 views
2

Doit implémenter la solution avec JCE J'ai une chaîne de clé publique générée à l'aide de KeyPairGenerator. Comment est-ce que je charge ceci dans l'appel d'openSSL Api en utilisant PEM_read_bio_RSAPublicKey? Ou cela aura codé la spécification x509 comment supprimer et générer le public compatible avec l'appel API OpenSL?Chargement de PublicKey généré à partir de java thro API openSSL

try { 
    // Get the public/private key pair 
    KeyPairGenerator keyGen = KeyPairGenerator 
     .getInstance(keyAlgorithm); 
    keyGen.initialize(numBits); 
    KeyPair keyPair = keyGen.genKeyPair(); 
    PrivateKey privateKey = keyPair.getPrivate(); 
    PublicKey publicKey = keyPair.getPublic(); 

    System.out.println("\n" + "Generating key/value pair using " 
     + privateKey.getAlgorithm() + " algorithm"); 

    // Get the bytes of the public and private keys 
    privateKeyBytes = privateKey.getEncoded(); 
    publicKeyBytes = publicKey.getEncoded(); 
    try { 
     rsa_publickey = new 
      BASE64Encoder().encodeBuffer((keyPair.getPublic()).getEncoded()); 
    } 
    catch(Exception e1) 
    { 
     e1.printStackTrace(); 
    } 
    System.out.println("PublicKey :"+rsa_publickey); 
} 
catch(Exception e1) 
{ 
    e1.printStackTrace(); 
} 

Répondre

3

Peut-être que vous pourriez essayer de l'exporter à partir de Java au OpenSSL format PEM peut lire, en utilisant Bouncycastle « s PEMWriter.

EDIT: Par exemple, le code suivant:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
keyGen.initialize(2048); 
KeyPair keyPair = keyGen.genKeyPair(); 
PrivateKey privateKey = keyPair.getPrivate(); 
PublicKey publicKey = keyPair.getPublic(); 

// Solution 1: using BouncyCastle's PEMWriter 
PEMWriter pemWriter = new PEMWriter(new PrintWriter(System.out)); 
pemWriter.writeObject(publicKey); 
pemWriter.flush(); 

// Solution 2: using sun.misc.BASE64Encoder 
// (and possibly naive 64-character line split) 
sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); 
String encoded = encoder.encode(publicKey.getEncoded()); 
encoded = encoded.replace("\n", ""); 
StringBuilder builder = new StringBuilder(); 
builder.append("-----BEGIN PUBLIC KEY-----"); 
builder.append("\n"); 
int i = 0; 
while (i < encoded.length()) { 
    builder.append(encoded.substring(i, 
      Math.min(i + 64, encoded.length()))); 
    builder.append("\n"); 
    i += 64; 
} 
builder.append("-----END PUBLIC KEY-----"); 
System.out.println(builder); 

produit cette sortie:

-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0CCQ5fdVEEm8u1CrbMXa 
FK35/d5MxNjCg7EQZwKsydRhfGhbK+u+iTUiv9rkqhcCucqrMi9eXtqt/QNGreFF 
oR5auneeCMgqnXxoX7wjuZ5DBt6qN6ZSe+sAPqSKbvvLUmpBUK9pdOvxegQFGG2d 
OUCcQLg2o6vLr9r7ZJDSxdyzCb14i+TEt0TnLjFTkR846dmX41gfU7eacoPxYWoo 
Pvhq2huyH0cP8rNJ2/+2BcInjyv5TpLT+m0lYjMar6exgonqRetIJF0Gi7unM+0V 
RsBoaBMAsLeqoR5OrCrSKepWbjixjHRMmjBaTYM5wP8DAbjVupUQ9kUwqRTzHTti 
XQIDAQAB 
-----END PUBLIC KEY----- 
-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0CCQ5fdVEEm8u1CrbMXa 
FK35/d5MxNjCg7EQZwKsydRhfGhbK+u+iTUiv9rkqhcCucqrMi9eXtqt/QNGreFF 
oR5auneeCMgqnXxoX7wjuZ5DBt6qN6ZSe+sAPqSKbvvLUmpBUK9pdOvxegQFGG2d 
OUCcQLg2o6vLr9r7ZJDSxdyzCb14i+TEt0TnLjFTkR846dmX41gfU7eacoPxYWoo 
Pvhq2huyH0cP8rNJ2/+2BcInjyv5TpLT+m0lYjMar6exgonqRetIJF0Gi7unM+0V 
RsBoaBMAsLeqoR5OrCrSKepWbjixjHRMmjBaTYM5wP8DAbjVupUQ9kUwqRTzHTti 
XQIDAQAB 
-----END PUBLIC KEY----- 

(Si vous voulez le faire sans BouncyCastle, vous pouvez utiliser une autre base 64 codeur, car il n'est généralement pas recommandé d'utiliser des packages sun.* qui peuvent ne pas être exposés ou disponibles sur tous les JRE.)

Je n'ai pas essayé de charger avec l'API OpenSSL, mais avec OpenSSL sur la ligne de commande, quand vous collez la clé ci-dessus, vous obtenez ceci (notez que ce qui est entre les délimiteurs BEGIN/END est stdin, collé ici) :

$ openssl rsa -inform PEM -pubin -text -noout 
-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0CCQ5fdVEEm8u1CrbMXa 
FK35/d5MxNjCg7EQZwKsydRhfGhbK+u+iTUiv9rkqhcCucqrMi9eXtqt/QNGreFF 
oR5auneeCMgqnXxoX7wjuZ5DBt6qN6ZSe+sAPqSKbvvLUmpBUK9pdOvxegQFGG2d 
OUCcQLg2o6vLr9r7ZJDSxdyzCb14i+TEt0TnLjFTkR846dmX41gfU7eacoPxYWoo 
Pvhq2huyH0cP8rNJ2/+2BcInjyv5TpLT+m0lYjMar6exgonqRetIJF0Gi7unM+0V 
RsBoaBMAsLeqoR5OrCrSKepWbjixjHRMmjBaTYM5wP8DAbjVupUQ9kUwqRTzHTti 
XQIDAQAB 
-----END PUBLIC KEY----- 
Modulus (2048 bit): 
    00:d0:20:90:e5:f7:55:10:49:bc:bb:50:ab:6c:c5: 
    da:14:ad:f9:fd:de:4c:c4:d8:c2:83:b1:10:67:02: 
    ac:c9:d4:61:7c:68:5b:2b:eb:be:89:35:22:bf:da: 
    e4:aa:17:02:b9:ca:ab:32:2f:5e:5e:da:ad:fd:03: 
    46:ad:e1:45:a1:1e:5a:ba:77:9e:08:c8:2a:9d:7c: 
    68:5f:bc:23:b9:9e:43:06:de:aa:37:a6:52:7b:eb: 
    00:3e:a4:8a:6e:fb:cb:52:6a:41:50:af:69:74:eb: 
    f1:7a:04:05:18:6d:9d:39:40:9c:40:b8:36:a3:ab: 
    cb:af:da:fb:64:90:d2:c5:dc:b3:09:bd:78:8b:e4: 
    c4:b7:44:e7:2e:31:53:91:1f:38:e9:d9:97:e3:58: 
    1f:53:b7:9a:72:83:f1:61:6a:28:3e:f8:6a:da:1b: 
    b2:1f:47:0f:f2:b3:49:db:ff:b6:05:c2:27:8f:2b: 
    f9:4e:92:d3:fa:6d:25:62:33:1a:af:a7:b1:82:89: 
    ea:45:eb:48:24:5d:06:8b:bb:a7:33:ed:15:46:c0: 
    68:68:13:00:b0:b7:aa:a1:1e:4e:ac:2a:d2:29:ea: 
    56:6e:38:b1:8c:74:4c:9a:30:5a:4d:83:39:c0:ff: 
    03:01:b8:d5:ba:95:10:f6:45:30:a9:14:f3:1d:3b: 
    62:5d 
Exponent: 65537 (0x10001) 

EDIT: Si vous voulez exporter quelque chose dans le lieu BEGIN RSA PUBLIC KEY, vous pouvez essayer quelque chose comme ceci:

RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey; 
RSAPublicKeyStructure pubkeyStruct = new RSAPublicKeyStructure(
    rsaPublicKey.getModulus(), rsaPublicKey.getPublicExponent()); 
pubkeyStruct.getDEREncoded(); // base64-encode this between the delimiters 
+0

Pouvez-vous s'il vous plaît vous suggérons d'utiliser JCE – MSSV

+0

Il ne fonctionne même pas thro le PEMWriter de Bouncycastle – MSSV

+0

@MSSV, I J'ai juste ajouté un exemple, je ne suis pas sûr que ce soit ce que vous cherchez. – Bruno