ホームページ >Java >&#&チュートリアル >「InvalidKeySpecException」が発生した場合に、PEM エンコードされたファイルから RSA 秘密キーを抽出するにはどうすればよいですか?

「InvalidKeySpecException」が発生した場合に、PEM エンコードされたファイルから RSA 秘密キーを抽出するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-10 10:28:02820ブラウズ

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

PEM エンコードされたファイルから RSA 秘密キーを抽出しています

問題:
エンコードされた秘密キー ファイルがありますPEM BASE64 形式で保存されており、それを外部コンテキストで使用したいと考えています。ただし、キーをデコードしようとしているときにエラーが発生しました。

コード スニペットとエラー:
秘密キーを読み取り、BASE64 データをデコードするための Java コード スニペット:

// Code omitted for brevity

エラー発生した問題:

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

解決策:

このエラーは、キーが PKCS#1 形式であることを示しており、これには、対象となる PKCS#8 形式とは異なる処理が必要です。あなたのコード。この問題に対処する改訂されたソリューションは次のとおりです。

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");
}

この更新されたコードは PKCS#8 と PKCS#1 の両方の形式を処理するため、秘密キーを正常に抽出して目的の用途に進むことができます。

以上が「InvalidKeySpecException」が発生した場合に、PEM エンコードされたファイルから RSA 秘密キーを抽出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。