2015-10-31 7 views
1

У меня есть закрытый ключ, который я хотел бы экспортировать в формат .pem Проблема в том, что при вызове privateKey.getEncoded() я получаю null. Но я могу получить всю информацию, такую ​​как показатель экспоненты, модуль и так один (все из интерфейса RSAPrivateKey). privateKey - org.mozilla.jss.pkcs11.PK11RSAPrivateKey Object.Как экспортировать закрытый ключ RSA в формат pem с помощью java

public String exportPrivateKey(PrivateKey privateKey) throws Throwable { 
    byte[] encoded = privateKey.getEncoded();//this is null:< 
    String body = DatatypeConverter.printBase64Binary(encoded); 

    return RSA_PRIVATE_HEADER + body + RSA_PRIVATE_FOOTER; 
} 

Как экспортировать этот ключ в файл pem?

+1

Да, реализации которых я вижу в Интернете все возвращение 'null' для этих значений. Вы уверены, что можете экспортировать информацию секретного ключа из токена безопасности? Это возможно, но обычно вы не можете просто извлекать информацию ключа ключа из токена; это как бы идея маркера в первую очередь. –

+1

Возможно, вы захотите посмотреть, можете ли вы также использовать команду 'RSAPrivateCrtKey'; который содержит больше параметров для более эффективной работы RSA. –

+0

@MaartenBodewes yup Я могу использовать, но между тем (и я получаю доступ к p, q и т. Д.). Я нашел фрагмент кода, который дает мне кодированную версию. Если вы можете проверить этот ответ ниже ... –

ответ

1

Метод я нашел в PKCS12Export, и Propably работает: P

private byte[] getEncodedKey(PrivateKey var1) throws Exception { 
    CryptoManager var2 = CryptoManager.getInstance(); 
    CryptoToken var3 = var2.getInternalKeyStorageToken(); 
    KeyGenerator var4 = var3.getKeyGenerator(KeyGenAlgorithm.DES3); 
    SymmetricKey var5 = var4.generate(); 
    KeyWrapper var6 = var3.getKeyWrapper(KeyWrapAlgorithm.DES3_CBC_PAD); 
    byte[] var7 = new byte[]{(byte)1, (byte)1, (byte)1, (byte)1, (byte)1, (byte)1, (byte)1, (byte)1}; 
    IVParameterSpec var8 = new IVParameterSpec(var7); 
    var6.initWrap(var5, var8); 
    byte[] var9 = var6.wrap(var1); 
    Cipher var10 = var3.getCipherContext(EncryptionAlgorithm.DES3_CBC_PAD); 
    var10.initDecrypt(var5, var8); 
    return var10.doFinal(var9); 
} 
+2

Да, обертывание, а затем расшифровка может работать очень хорошо. Однако вы все равно должны преобразовать в базу 64 и добавить верхний и нижний колонтитулы. Вы можете использовать функциональность «PEMWriter» в Bouncy Castle для этого ... Если выше работает, вы, вероятно, остаетесь с закрытым ключом PKCS # 8 (используя только внутренние структуры ASN.1 PKCS # 8). –

+0

@MaartenBodewes: Спасибо за помощь Maarten! Возможно, вы знаете, могу ли я найти аналогичную функциональность PFX/PKCS12Writer в Bouncy Castle?: P –

+1

Да, многие из стандартов PKCS должны быть где-то там, PKCS # 12 определенно является одним из них. –

Смежные вопросы