Rumah  >  Artikel  >  Java  >  Bagaimana untuk Mengekstrak Kunci Peribadi RSA daripada Fail Dikodkan PEM?

Bagaimana untuk Mengekstrak Kunci Peribadi RSA daripada Fail Dikodkan PEM?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-09 04:52:02491semak imbas

How to Extract an RSA Private Key from a PEM Encoded File?

Mendapatkan Kunci Peribadi RSA daripada Fail Kunci Peribadi Dikodkan PEM

Dalam kes ini, kunci peribadi yang disediakan dikodkan dalam format PEM , khususnya menggunakan PKCS#1. Untuk mendapatkan semula kunci persendirian RSA daripada fail berkod PEM ini, anda boleh menggunakan salah satu daripada pendekatan berikut:

Pendekatan 1: Kod Diubah Suai dengan Penghuraian Jujukan DER

Yang disediakan Kod Java membaca kunci yang dikodkan PEM dan cuba menyahkodnya. Pengubahsuaian yang dicadangkan di bawah akan membolehkannya menghuraikan kunci persendirian format PKCS#1:

...
// Skip version seq[0];
BigInteger modulus = seq[1].getBigInteger();
BigInteger publicExp = seq[2].getBigInteger();
BigInteger privateExp = seq[3].getBigInteger();
...
RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);

KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePrivate(keySpec);
...

Pendekatan 2: Kod yang Diperbaiki Menggunakan Pembekal Matahari

Penyelesaian alternatif ialah dengan memanfaatkan penyedia sun.security untuk penghuraian jujukan DER dan pakej java.security untuk penjanaan kunci. Pendekatan ini menyediakan pelaksanaan yang lebih ringkas dan patuh FIPS:

import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.PrivateKey;

public static PrivateKey pemFileLoadPrivateKeyPkcs1(File pemFileName) throws GeneralSecurityException, IOException {
    // PKCS#1 format
    String PEM_RSA_PRIVATE_START = "-----BEGIN RSA PRIVATE KEY-----";
    String PEM_RSA_PRIVATE_END = "-----END RSA PRIVATE KEY-----";

    Path path = Paths.get(pemFileName.getAbsolutePath());
    String privateKeyPem = new String(Files.readAllBytes(path));
    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);

    if (seq.length < 9) {
        throw new GeneralSecurityException("Could not parse a PKCS1 private key.");
    }

    // Skip version seq[0];
    BigInteger modulus = seq[1].getBigInteger();
    BigInteger publicExp = seq[2].getBigInteger();
    BigInteger privateExp = seq[3].getBigInteger();
    BigInteger prime1 = seq[4].getBigInteger();
    BigInteger prime2 = seq[5].getBigInteger();
    BigInteger exp1 = seq[6].getBigInteger();
    BigInteger exp2 = seq[7].getBigInteger();
    BigInteger crtCoef = seq[8].getBigInteger();

    RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(keySpec);
}

Kod ini akan berjaya membaca dan menghuraikan kunci persendirian daripada fail PEM yang disediakan dan memberikan anda objek kunci persendirian RSA.

Atas ialah kandungan terperinci Bagaimana untuk Mengekstrak Kunci Peribadi RSA daripada Fail Dikodkan PEM?. 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