2017-01-07 3 views
0

У меня есть ОткрытыйКлюча/PrivateKey пары генерируемой из этой функции:конвертировать RSA ОткрытыйКлюча в base64 и наоборот

public static void generateKey() { 
     try { 
      final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM); 
      keyGen.initialize(2048); 
      final KeyPair key = keyGen.generateKeyPair(); 

      File privateKeyFile = new File(PRIVATE_KEY_FILE); 
      File publicKeyFile = new File(PUBLIC_KEY_FILE); 

      // Create files to store public and private key 
      if (privateKeyFile.getParentFile() != null) { 
       privateKeyFile.getParentFile().mkdirs(); 
      } 
      privateKeyFile.createNewFile(); 

      if (publicKeyFile.getParentFile() != null) { 
       publicKeyFile.getParentFile().mkdirs(); 
      } 
      publicKeyFile.createNewFile(); 

      // Saving the Public key in a file 
      ObjectOutputStream publicKeyOS = new ObjectOutputStream(
        new FileOutputStream(publicKeyFile)); 
      publicKeyOS.writeObject(key.getPublic()); 
      publicKeyOS.close(); 

      // Saving the Private key in a file 
      ObjectOutputStream privateKeyOS = new ObjectOutputStream(
        new FileOutputStream(privateKeyFile)); 
      privateKeyOS.writeObject(key.getPrivate()); 
      privateKeyOS.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

Теперь я хочу, чтобы преобразовать ОткрытыйКлюча в base64 при записи и использовать эту base64 декодирование, чтобы получить ОткрытыйКлюче назад, как это можно сделать?

+0

Hah, думал, что я был на Crypto из-за редактирования e-sushi: P –

ответ

0

Как правило, если вы хотите сохранить файл в базе 64, вы можете просто закодировать массив байтов. Вы даже можете поместить поток Base64 между ObjectOutputStream и FileOutputStream (с поддержкой класса Base64 в Java 8).

Однако открытые ключи и закрытые ключи имеют стандартные форматы, которые можно получить, используя свои getEncoded метод:

PublicKey publicKey = key.getPublic(); 
byte[] encodedPublicKey = publicKey.getEncoded(); 
String b64PublicKey = Base64.getEncoder().encodeToString(encodedPublicKey); 

try (OutputStreamWriter publicKeyWriter = 
     new OutputStreamWriter(
       new FileOutputStream(publicKeyFile), 
       StandardCharsets.US_ASCII.newEncoder())) { 
    publicKeyWriter.write(b64PublicKey); 
} 

Это сохраняет открытый ключ в формате SubjectPublicKeyInfo, то, что можно читать и записывать различными типами программного обеспечения и криптографических библиотек.

Например, вы можете paste it in an online ASN.1 decoder (он-лайн декодер сам преобразует его в шестнадцатеричный, но он также проанализирует базу 64). Формат байтов находится в так называемом ASN.1/DER (который является общим форматом, так же, как вы можете кодировать несколько типов файлов в XML).

+0

Я узнал позже abt getencoded method, это отлично работает, хотя я использую файловый менеджер для записи в файл из строки base64;) –

+0

Мне нравится явно укажите набор символов. Для base64 это обычно не проблема, за исключением случаев, когда по умолчанию используется UTF-16. Иначе идентично. –