Maison >Java >javaDidacticiel >Comment extraire une clé privée RSA d'un fichier codé PEM ?

Comment extraire une clé privée RSA d'un fichier codé PEM ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-09 04:52:02534parcourir

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

Obtention de la clé privée RSA à partir d'un fichier de clé privée codé PEM

Dans ce cas, la clé privée fournie est codée au format PEM , en utilisant spécifiquement PKCS#1. Pour récupérer la clé privée RSA de ce fichier codé PEM, vous pouvez utiliser l'une des approches suivantes :

Approche 1 : Code modifié avec analyse de séquence DER

Le code fourni Le code Java lit la clé codée PEM et tente de la décoder. La modification suggérée ci-dessous lui permettra d'analyser les clés privées au 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);
...

Approche 2 : Code amélioré à l'aide des fournisseurs Sun

Une solution alternative consiste à exploitez les fournisseurs sun.security pour l’analyse des séquences DER et le package java.security pour la génération de clés. Cette approche fournit une implémentation plus concise et conforme à la 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);
}

Ce code lira et analysera avec succès la clé privée du fichier PEM fourni et vous fournira un objet de clé privée RSA.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn