Rumah >Java >javaTutorial >Bagaimanakah cara saya mengekstrak kunci persendirian RSA daripada fail yang dikodkan PEM apabila menemui 'InvalidKeySpecException'?

Bagaimanakah cara saya mengekstrak kunci persendirian RSA daripada fail yang dikodkan PEM apabila menemui 'InvalidKeySpecException'?

Patricia Arquette
Patricia Arquetteasal
2024-11-10 10:28:02894semak imbas

How do I extract an RSA private key from a PEM encoded file when encountering an

Mengekstrak Kunci Peribadi RSA daripada Fail Dikodkan PEM

Masalah:
Anda mempunyai fail kunci peribadi yang dikodkan dalam format PEM BASE64 dan ingin menggunakannya dalam konteks luaran. Walau bagaimanapun, menghadapi ralat semasa cuba menyahkod kekunci.

Coretan Kod dan Ralat:
Coretan kod Java anda untuk membaca kunci peribadi dan menyahkod data BASE64:

// Code omitted for brevity

Ralat yang dihadapi:

InvalidKeySpecException: Inappropriate key specification: DerInputStream.getLength(): lengthTag=127, too big.

Penyelesaian:

Ralat menunjukkan bahawa kunci berada dalam format PKCS#1, yang memerlukan pengendalian yang berbeza daripada Format PKCS#8 disasarkan dalam kod anda. Berikut ialah penyelesaian yang disemak yang menangani isu ini:

import sun.security.util.DerInputStream;
import sun.security.util.DerValue;

// Code omitted for brevity

public static PrivateKey pemFileLoadPrivateKeyPkcs1OrPkcs8Encoded(File pemFileName) throws GeneralSecurityException, IOException {
    // PKCS#8 format
    final String PEM_PRIVATE_START = "-----BEGIN PRIVATE KEY-----";
    final String PEM_PRIVATE_END = "-----END PRIVATE KEY-----";

    // PKCS#1 format
    final String PEM_RSA_PRIVATE_START = "-----BEGIN RSA PRIVATE KEY-----";
    final String PEM_RSA_PRIVATE_END = "-----END RSA PRIVATE KEY-----";

    Path path = Paths.get(pemFileName.getAbsolutePath());

    String privateKeyPem = new String(Files.readAllBytes(path));

    if (privateKeyPem.indexOf(PEM_PRIVATE_START) != -1) { // PKCS#8 format
        // Code omitted for brevity
    } else if (privateKeyPem.indexOf(PEM_RSA_PRIVATE_START) != -1) {  // PKCS#1 format
        privateKeyPem = privateKeyPem.replace(PEM_RSA_PRIVATE_START, "").replace(PEM_RSA_PRIVATE_END, "");
        privateKeyPem = privateKeyPem.replaceAll("\s", "");

        DerInputStream derReader = new DerInputStream(Base64.getDecoder().decode(privateKeyPem));

        DerValue[] seq = derReader.getSequence(0);

        // Code omitted for brevity
    }

    throw new GeneralSecurityException("Not supported format of a private key");
}

Kod yang dikemas kini ini mengendalikan kedua-dua format PKCS#8 dan PKCS#1, membolehkan anda berjaya mengeluarkan kunci persendirian dan meneruskan penggunaan yang anda inginkan.

Atas ialah kandungan terperinci Bagaimanakah cara saya mengekstrak kunci persendirian RSA daripada fail yang dikodkan PEM apabila menemui 'InvalidKeySpecException'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn