Java.Security.InvalidKeyException: キーのサイズが不正です

Mehvish Ashiq 2023年10月12日
  1. Java の java.security.InvalidKeyException: Illegal key size
  2. java.security.InvalidKeyException: Illegal key size の考えられる理由
  3. java.security.InvalidKeyException: Illegal key size を根絶する
Java.Security.InvalidKeyException: キーのサイズが不正です

このチュートリアルでは、java.security.InvalidKeyException: Illegal key size を含む Java コードを紹介します。 次に、考えられる理由を学びます。

最後に、指定されたエラーを根絶することで解決策に導きます。

Java の java.security.InvalidKeyException: Illegal key size

コード例 (App1.java クラス):

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class App1 {
  private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

  public String cryptAString(String str) {
    String ret = "";
    try {
      byte[] crypKeyData = this.crypKey.getBytes();
      SecretKeySpec secretKeySpec = new SecretKeySpec(crypKeyData, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
      ret = new String(cipher.doFinal(str.getBytes("UTF-8")));

    } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException
        | UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException ex) {
      ex.printStackTrace();
    }
    return ret;
  }
}

crypKey は次のとおりです。

private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

上記の関数は、string 型の引数を受け入れます。 このプログラムを実行すると暗号化されるはずですが、java.security.InvalidKeyException: Illegal key sizeエラーが発生します。

それは何を意味し、その理由は何ですか? 次のセクションで見てみましょう。

java.security.InvalidKeyException: Illegal key size の考えられる理由

このエラーは、当社の Java 仮想マシン (JVM) が、米国の輸出法により制限された暗号化キー サイズのみを許可するポリシーを使用していることを意味します。

ここで重要なのは、なぜこのエラーが発生するのかということです。 以下に 2つの可能性を示します。

  1. まず、n ビット暗号化を必要とするアルゴリズムを使用しています。 超えると、このエラーが発生します。
  2. 無制限強度管轄ポリシーファイルはまだインストールしていません。

これらのファイルは何ですか? これらのファイルは、Java アプリケーションが 標準アルゴリズム の強力なバージョンを利用できるようにする Java Cryptography Extensions (JCE) です。

Java ドキュメント によると、Java Development Kit (JDK) の最新バージョンでは、これらの種類のファイルは必要ありません。 古いバージョンの JDK を使用する場合にのみ必要です。

次の質問は、どの JDK バージョンに対してどのファイルをインストールする必要があるかということです。 以下でそれを学びましょう。

Java 9 以降

Java 9 の移行ガイドのセキュリティ更新 に従って、無制限強度の管轄ポリシー ファイルは Java 9 に既に含まれており、デフォルトで使用されます。

JCE 無制限強度管轄ポリシー ファイルを必要とするアプリケーションを古いバージョンの JDK で実行する場合、それらをダウンロードして Java 9 以降でインストールする必要はありません。 その理由は、それらがすでに含まれており、デフォルトで使用されているためです。

Java 9 での作業中にこのエラーが引き続き発生する場合は、ポリシー構成がより制限的なポリシー (limited) に変更されています。 ただし、利用できる Java 暗号化ポリシー ファイルは限られているため、これは問題ではありません。

2 番目の理由は、指定された string 型の引数を暗号化する際に間違ったアルゴリズムを使用している可能性があります。 場合によっては、デフォルトで提供されるいずれのポリシー ファイルでも要件が満たされないことがあります。 そのような状況では、ニーズを満たすようにポリシー ファイルをカスタマイズできます。

そのためには、<java-home>/conf/security/java.security ファイルの crypto.policy という名前のセキュリティ プロパティを確認するか、 暗号強度構成

Java 8 以前

  1. Java 8 Update 161 以降 - Java 8 u161 の時点で、Java 8 は無制限の強度の管轄ポリシーにデフォルト設定されています。 それでもこのエラーが発生する場合は、構成が limited に変更されています。

    次のセクションでは、無制限に変更する手順について説明します。

  2. Java 8 Update 151 以降 - Java 8 u151 以降、Java 8 には強度無制限の管轄ポリシーが含まれていますが、デフォルトではアクティブ化されていません。

    これを有効にするには、<java_home>/jre/lib/security (JDK の場合) または <java_home>/lib/security (<java_home>/lib/security の場合) にある java.security ファイルを編集する必要があります。 JRE)。 次の行のコメントを外す/含める:

    crypto.policy = unlimited
    

    管理者として実行されているエディターを使用して、このファイルを編集していることを確認してください。 ポリシーは再起動後にのみ有効になるため、Java 仮想マシンを再起動することを忘れないでください。

    これは、Tomcat などの実行時間の長いサーバー プロセスに特に必要です。 下位互換性を考慮して、次のセクションの手順に従ってポリシー ファイルをインストールすることもできます。

  3. Java 8 Update 151 より前 - Java 8 u144 以前の場合、Oracle の公式 Web サイトで入手できる Java Cryptography Extension (JCE) の無制限強度管轄ポリシー ファイルをインストールする必要があります。

以下の手順に従って、これらのファイルをインストールします。

  1. Java Cryptography Extension の無制限強度管轄ポリシー ファイルをダウンロードします。

    ここ(https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html) および ここ(https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html) にアクセスして、それぞれ Java 6 および 7 用の Java Cryptography Extension Unlimited Strength Jurisdiction ポリシー ファイルをダウンロードできます。

  2. それらを解凍し、ダウンロードしたファイルに解凍します。 その結果、jce という名前のサブディレクトリが作成されます。

    このディレクトリには、次のファイルが含まれます。

    README.txt
    local_policy.jar
    US_export_policy.jar
    
  3. 無制限強度ポリシー JAR ファイルをインストールします。 元の強力制限付きのポリシー バージョンに戻したい場合は、元の Java Cryptography Extension ポリシー ファイル (US_export_policy.jarおよびlocal_policy.jar) のコピーを作成することを忘れないでください。

  4. strong ポリシー ファイルを、前の手順で抽出した無制限の強度のバージョンに置き換えます。 Java Cryptography Extension 管轄ポリシー JAR ファイルの標準的な場所は次のとおりです。

    4.1 <java-home>/lib/security (Unix オペレーティング システム用)。
    4.2 <java-home>\lib\security Windows オペレーティング システム用。
    4.3 JDK の場合、jre/lib/security にあります。

java.security.InvalidKeyException: Illegal key size を根絶する

コード例 (App1.java クラス):

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class App1 {
  private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

  public String cryptAString(String str) {
    String ret = "";
    try {
      byte[] crypKeyData = this.crypKey.getBytes();
      SecretKeySpec secretKeySpec = new SecretKeySpec(crypKeyData, "ARCFOUR");
      Cipher cipher = Cipher.getInstance("ARCFOUR");
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
      ret = new String(cipher.doFinal(str.getBytes("UTF-8")));

    } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException
        | UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException ex) {
      ex.printStackTrace();
    }
    return ret;
  }
}

コード例 (Test.java クラス):

public class Test {
  public static void main(String[] args) {
    App1 app = new App1();
    String str = "ThisIsFoundation";
    String cryptedStr = app.cryptAString(str);
    System.out.println(cryptedStr);
    System.out.println(cryptedStr.chars().count());
  }
}

それは暗号化された文字列を ??c[D]???J??n? として表示し、その文字列の文字数は 15 です。これはどのように解決しましたか?

InvalidKeyException を取り除く方法は 2つあります。

  1. Java Cryptography Extension (JCE) ポリシー ファイルをインストールすることで解決することもできます (すべての詳細は前のセクションに記載されています)。
  2. アルゴリズム名も変更できます。

私たちの場合、問題は crypKey のサイズが 16 文字を超えていることが原因です。 そのため、Cipher クラスでは、128 ビット を超える鍵サイズで暗号化することはできません (ここで、128 ビット == 16 バイト == 16 文字)。

したがって、crypKey の値は 16 文字 の制限を超えることはできません。

16 文字を超える場合は、JCE ポリシー ファイルをインストールするか、アルゴリズム名を更新します。 組み込みの鍵サイズ制限を維持したいので、アルゴリズム名を変更します。

そこで、アルゴリズム名を AES から ARCFOUR に更新します。 これは、ARCFOUR アルゴリズムがさまざまな鍵サイズで使用できるためです。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - Java Exception