Зашифровать закрытый ключ с помощью кода Java

Я сгенерировал закрытый ключ с Java-кодом и сохранил его так:

KeyPair keys;
    try {
        keys = KeyTools.genKeys("2048", AlgorithmConstants.KEYALGORITHM_RSA);
        //SAVE PRIVKEY
        //PrivateKey privKey = keys.getPrivate();
        //byte[] privateKeyBytes = privKey.getEncoded();
        PKCS10CertificationRequest  pkcs10 = new PKCS10CertificationRequest("SHA256WithRSA",
                CertTools.stringToBcX509Name("CN=NOUSED"), keys.getPublic(), null, keys.getPrivate());

        //Save Privatekey
        String privateKeyFilename = "C:/Users/l.calicchio/Downloads/privateKey.key";
        String password="prismaPrivateKey";
        byte[] start="-----BEGIN PRIVATE KEY-----\n".getBytes();
        byte[] end="\n-----END PRIVATE KEY-----".getBytes();
        byte[] privateKeyBytes = keys.getPrivate().getEncoded();

        byte[] encryptedPrivateKeyBytes = passwordEncrypt(password.toCharArray(), privateKeyBytes);

        File f=new File(privateKeyFilename);
        if (f.exists()){
            f.delete();
        }

        FileOutputStream fos = new FileOutputStream(f,true);
        fos.write(start);
        fos.write(Base64.encode(encryptedPrivateKeyBytes));
        fos.write(end);
        fos.close();

Теперь я хочу добавить кодовую фразу к закрытому ключу. поэтому я нашел этот код:

private static byte[] passwordEncrypt(char[] password, byte[] plaintext) throws Exception {
    String MYPBEALG = "PBEWithSHA1AndDESede";

    int count = 20;// hash iteration count
    SecureRandom random = new SecureRandom();
    byte[] salt = new byte[8];
    random.nextBytes(salt);

    // Create PBE parameter set
    PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, count);
    PBEKeySpec pbeKeySpec = new PBEKeySpec(password);
    SecretKeyFactory keyFac = SecretKeyFactory.getInstance(MYPBEALG);
    SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);

    Cipher pbeCipher = Cipher.getInstance(MYPBEALG);

    // Initialize PBE Cipher with key and parameters
    pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);

    // Encrypt the encoded Private Key with the PBE key
    byte[] ciphertext = pbeCipher.doFinal(plaintext);

    // Now construct  PKCS #8 EncryptedPrivateKeyInfo object
    AlgorithmParameters algparms = AlgorithmParameters.getInstance(MYPBEALG);
    algparms.init(pbeParamSpec);
    EncryptedPrivateKeyInfo encinfo = new EncryptedPrivateKeyInfo(algparms, ciphertext);

    // and here we have it! a DER encoded PKCS#8 encrypted key!
    return encinfo.getEncoded();

но когда я использую эту команду openssl openssl asn1parse -in privateKey.key, у меня нет ошибки, но когда я пробую это: openssl rsa -noout -modulus -in privatekey. у меня есть ошибка:

невозможно загрузить закрытый ключ 9964: ошибка: 0D0680A8: процедуры кодирования asn1: ASN1_CHECK_TLEN: неправильный тег:. \ crypto \ as n1 \ tasn_dec.c: 1319: 9964: ошибка: 0D06C03A: процедуры кодирования asn1: ASN1_D2I_EX_PRIMITIVE: nested . \ crypto \ asn1 \ tasn_dec.c: 831: 9964: ошибка: 0D08303A: подпрограммы кодирования asn1: ASN1_TEMPLATE_NOEXP_D2I: вложенная ошибка asn1:. \ crypto \ asn1 \ tasn_dec.c: 751: Поле = версия, Тип = PKCSEY_PRF ошибка: 0907B00D: подпрограммы PEM: PEM_READ_BIO_PRIVATEKEY: ASN1 lib:. \ crypto \ pem \ p em_pkey.c: 132:

Я думаю, что в закрытом ключе отсутствует следующая строка: Proc-Type: 4, ENCRYPTED «DEK-Info:» + «AES-256-CBC» ...... но как я это добавляю (где я получаю эту информацию ?)? tnx


person luca    schedule 30.09.2014    source источник


Ответы (1)


Пожалуйста, прочтите руководство, man rsa дает следующие подробности:

Обратите внимание, что эта команда использует традиционный совместимый с SSLeay формат для шифрования закрытого ключа: новые приложения должны использовать более безопасный формат PKCS # 8 с помощью утилиты pkcs8.

person Maarten Bodewes    schedule 30.09.2014
comment
В моем ответе чего-то не хватает, лука? - person Maarten Bodewes; 03.10.2014