27

このコードは、無効な 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);
}
}

任意の助けをいただければ幸いです

4

4 に答える 4

24

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

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

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

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

于 2009-11-19T04:27:34.437 に答える
11

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

これを行う一般的な方法の 1 つは、パスフレーズを (SHA などを介して) ハッシュし、最初の N バイトを抽出することです。とにかく、パスフレーズが同じであっても、2人のユーザーの「キー」が同一にならないように、パスワードを初期化値で「ソルト」できるため、これは優れています。このことに本当に興味があるなら、影響力のある作品はBruce Schneier による Applied Cryptographyです。

実際の実装の詳細については、を参照してください。

于 2009-11-19T04:00:22.417 に答える
0

スムーズな暗号化には 16 バイトのキー値文字列を使用します。たとえば、キー「thebestsecretkey」は base64 で機能します。

于 2016-06-27T07:51:40.357 に答える