Rumah > Java > javaTutorial > teks badan

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

Patricia Arquette
Lepaskan: 2024-11-10 10:28:02
asal
757 orang telah melayarinya

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
Salin selepas log masuk

Ralat yang dihadapi:

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

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");
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan