2016-03-02 7 views
1

Я пытаюсь создать зашифрованный закрытый ключ и CSR с использованием Java в Matlab. Matlab добавляет некоторую второстепенную сложность, но это в основном проблема Java. Я начинаю с закрытым ключом:Вывод зашифрованного закрытого ключа PK8 из Java BouncyCastle

java.security.Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider()); 
keyGen = java.security.KeyPairGenerator.getInstance('RSA', 'BC'); 
keyGen.initialize(2048, java.security.SecureRandom()); 
keypair = keyGen.generateKeyPair(); 
privateKey = keypair.getPrivate(); 

Если зашифровать ключ и выводит его в PEM:

m=org.bouncycastle.openssl.PKCS8Generator.PBE_SHA1_3DES; 
encryptorBuilder = org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8EncryptorBuilder(m); 
encryptorBuilder.setRandom(java.security.SecureRandom()); 
encryptorBuilder.setPasssword(password); 
oe = encryptorBuilder.build(); 
gen = org.bouncycastle.openssl.jcajce.JcaPKCS8Generator(privateKey,oe); 
privKeyObj = gen.generate(); 
fos = java.io.FileWriter('private.pem'); 
pem = org.bouncycastle.openssl.jcajce.JcaPEMWriter(fos); 
pem.writeObject(privKeyObj); 
pem.flush(); 
fos.close(); 

я получаю совершенно хороший ключ. Проблема в том, что я хочу использовать ключ с jdbc, поэтому мне нужен файл pK8 с форматированием DER. Я не могу понять, как это сделать из BouncyCastle. Клудж обходной путь, который преуспевает:

textWriter = java.io.StringWriter(); 
pem = org.bouncycastle.openssl.jcajce.JcaPEMWriter(textWriter); 
pem.writeObject(privateKey); 
pem.flush(); 
thekey = char(textWriter.toString()); 
cmd = ['echo "' thekey '"|openssl pkcs8 -topk8 -out private.pk8 -inform PEM -outform DER -passout pass:' password]; 
system(cmd); 

Теперь, очевидно, это выставляет как незашифрованный закрытый ключ и пароль. Я пробовал всякие вещи, чтобы принуждать privKeyObj к DER, но они обычно покидают меня:

$openssl pkcs8 -inform DER -outform PEM -in private.pk8 -out private.pem 
Error decrypting key 
140735211835472:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1201: 
140735211835472:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:765: 
140735211835472:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:697:Field=version, Type=PKCS8_PRIV_KEY_INFO 

Цель этого кода для генерации CSR на компьютере конечного пользователя, который я затем подписать, и который зашифровывается MAC-адресом машины (и солью), так что программа будет работать только на авторизованном компьютере, и только авторизированные машины смогут получить доступ к моей базе данных PostgreSql.

Предложения?

+0

Обратите внимание, что я полностью пропустил это сообщение, так как ему не хватало Java и криптографические тэги. Всегда используйте теги с высоким уровнем посещаемости и укажите свой язык. Это более важно, чем использование более конкретных: они в основном служат для того, чтобы ваш вопрос был замечен другими. –

ответ

1

Я понял. В моем исходном коде я использовал BcPKCS12PBEOutputEncryptorBuilder. Неправильно! Правильный вызов - JcePKCSPBEOutputEncryptorBuilder. Правильный код (в MATLAB, но преобразование в Java является простой):

java.security.Security.addProvider(org.bouncycastle.jce.provider.BouncyCastleProvider()); 
    keyGen = java.security.KeyPairGenerator.getInstance('RSA', 'BC'); 
    keyGen.initialize(2048, java.security.SecureRandom()); 
    keypair = keyGen.generateKeyPair(); 
    privateKey = keypair.getPrivate(); 
    builder=org.bouncycastle.pkcs.jcajce.JcaPKCS8EncryptedPrivateKeyInfoBuilder(privateKey); 

    m=org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers.pbeWithSHAAnd3_KeyTripleDES_CBC; 
    encryptorBuilder = org.bouncycastle.pkcs.jcajce.JcePKCSPBEOutputEncryptorBuilder(m); 
    password = 'test'; 
    outputBuilder = encryptorBuilder.build(password); 
    privKeyObj = builder.build(outputBuilder); 
    fos = java.io.FileOutputStream('testkey.pk8'); 
    fos.write(privKeyObj.getEncoded()); 
    fos.flush(); 
    fos.close(); 

Это создает DER отформатирован PCS # 8 файл.

openssl pkcs8 -inform DER -outform PEM -in testkey.pk8 -out testkey.pem 

Теперь возвращает закрытый ключ PEM. Чтобы прочитать ключ:

myPath = java.nio.file.Paths.get(pwd,'testkey.pk8'); 
    encodedKey = java.nio.file.Files.readAllBytes(myPath); 
    privKeyObj =org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo(encodedKey); 
    cp=org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter(); 
    cp.setProvider('BC'); 

    decryptorBuilder = org.bouncycastle.pkcs.jcajce.JcePKCSPBEInputDecryptorProviderBuilder(); 
    inputBuilder = decryptorBuilder.build(password); 
    info = privKeyObj.decryptPrivateKeyInfo(inputBuilder); 
    decodedKey=cp.getPrivateKey(info); 

Обратите внимание, что в MATLAB, вам не нужно объявлять тип возвращаемого объекта, и вам не нужно ставить «новый» перед конструктором.

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

  • Нет связанных вопросов^_^