ホームページ >Java >&#&チュートリアル >「InvalidKeySpecException」が発生した場合に、PEM エンコードされたファイルから RSA 秘密キーを抽出するにはどうすればよいですか?
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 サイトの他の関連記事を参照してください。