Расшифруйте зашифрованный закрытый ключ: данные не являются идентификатором объекта - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь расшифровать зашифрованную строку закрытого ключа, как это

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBO...
-----END ENCRYPTED PRIVATE KEY-----

И я также снимаю голову и ногу. Но это исключение:

Exception in thread "main" java.io.IOException: ObjectIdentifier() -- data isn't an object ID (tag = 48)
    at sun.security.util.ObjectIdentifier.<init>(ObjectIdentifier.java:257)
    at sun.security.util.DerInputStream.getOID(DerInputStream.java:314)
    at com.sun.crypto.provider.PBES2Parameters.engineInit(PBES2Parameters.java:267)
    at java.security.AlgorithmParameters.init(AlgorithmParameters.java:293)
    at sun.security.x509.AlgorithmId.decodeParams(AlgorithmId.java:132)
    at sun.security.x509.AlgorithmId.<init>(AlgorithmId.java:114)
    at sun.security.x509.AlgorithmId.parse(AlgorithmId.java:372)
    at javax.crypto.EncryptedPrivateKeyInfo.<init>(EncryptedPrivateKeyInfo.java:95)
    at com.cargosmart.mci3.as2.process.as2control.KeystoreController.decryptKey(KeystoreController.java:162)
    at com.cargosmart.mci3.as2.process.as2control.KeystoreController.main(KeystoreController.java:147)

Вот код

import org.bouncycastle.util.encoders.Base64;

String key = "-----BEGIN ENCRYPTED PRIVATE KEY-----MIII-----END ENCRYPTED PRIVATE KEY-----";
key = standardizePem(key);
key = key.replace("-----BEGIN ENCRYPTED PRIVATE KEY-----\n", "").replace("\n-----END ENCRYPTED PRIVATE KEY-----", "");
byte[] b = Base64.decode(key);

// here is the exception line
EncryptedPrivateKeyInfo pkinfo = new EncryptedPrivateKeyInfo(b);

А функция standardizePem предназначена для форматирования строки ключа

public static String standardizePem(String cert) {
        String SEPARATOR = "-----";
        String LINE_SEPERATOR = "\n";
        String temp[] = cert.split(SEPARATOR);
        String certHead = temp[1];
        String certEnd = temp[3];
        String certContent = temp[2];
        String regex = "(.{64})";
        certContent = certContent.replaceAll(regex,"$1\n");
        final String pem = SEPARATOR + certHead + SEPARATOR + LINE_SEPARATOR +  certContent + LINE_SEPARATOR + SEPARATOR + certEnd + SEPARATOR;
        return pem;
    }

Может ли кто-нибудь иметь решения?

Спасибо за вашу помощь.

...