web-dev-qa-db-ja.com

無効なAESキー長エラー

このコードは、無効なAESキーの長さエラーを示します。どうすれば修正できますか? (128ビットキーのAES暗号化が必要です)

package org.temp2.cod1;
import Java.security.*;

import javax.crypto.*;
import javax.crypto.spec.*;
import Java.io.*;

public class Code1 {

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
    String s = "9882623867";
    byte[] plaintext = s.getBytes("UTF-16");
    String s2 = "supernova";
    byte[] key = s2.getBytes("UTF-16");
    Cipher c = Cipher.getInstance("AES");
    SecretKeySpec k =  new SecretKeySpec(key, "AES");
    c.init(Cipher.ENCRYPT_MODE, k);
    byte[] encryptedData = c.doFinal(plaintext);
    System.out.println(encryptedData);
}
}

助けていただければ幸いです

25
silverkid

SecretKeyFactoryを使用してパスワードからキーバイトを取得します。詳細な例を参照できます here。 256ビットではなく128ビットキーのキー長を指定する必要があることに注意してください。その例に示すように。

次に遭遇する問題は、パディング方式を指定していないことです。メッセージが16バイトの倍数(AESブロックサイズ)でない限り、エラーが発生します。例に示すように、PKCS5Paddingを使用します。

暗号でCBCモードを使用するには、各メッセージに対して新しい初期化ベクトルを選択する必要があります。この一意のIVは、暗号化されたメッセージとともに受信者に送信する必要があります。

ここで取り上げた概念(およびそれ以上)を完全に理解せずに暗号化を実行しようとすると、システムが安全でなくなる可能性があります。

22
erickson

通常、AESのようなブロック暗号では、任意のキーの長さ(ここでは「スーパーノバ」で実行しているような)は使用できません。選択したアルゴリズムに適した、サポートされているキー長(128、192、256など)を使用する必要があります。

これを行う一般的な方法の1つは、パスフレーズをハッシュ化し(たとえば、SHAを介して)、最初のNバイトを抽出することです。これは、パスフレーズが同じであっても2人のユーザーの「キー」が同一にならないように初期化値でパスワードを「ソルト」できるため、とにかく優れています。このようなものに本当に興味があるなら、独創的な仕事は ブルース・シュナイアーによる応用暗号 です。

実際の実装の詳細については、 see

10
DarkSquid

使用しようとしているキーが適切な長さでない場合、このエラーが発生する可能性があります。

擬似コードでは、次のようなことを試みています:

String key = "123";
SecretKeySpec k =  new SecretKeySpec(key, "AES");

しかし、キーは短すぎます-31文字の長さのようなものである必要があります。

キー値を確認してください->おそらくどこかに間違って保存されています。

1
Brad Parks