2009-11-19 27 views
23

このコードは、無効なAESキーの長さのエラーを示します。どうすれば修正できますか? (私は128ビットキーのAES暗号化をしたい)無効な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); 
} 
} 

すべてのヘルプは、あなたは通常、ブロック暗号のために任意のキー長を(あなたは「超新星」とここにやっているような)を使用することはできません

答えて

21

あなたは128ビットキーの代わりに、256のキーの長さを指定する必要があります詳細な例here.ノートを見ることができますpassword.Youから鍵のバイトを導出するSecretKeyFactoryを使用して、ビットを使用します。

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

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

ここで挙げた概念(そしてもっと多くのこと)を完全に理解せずに暗号化を実行しようとすると、安全性の低いシステムになる可能性があります。

10

を高く評価しましたAESのように。選択したアルゴリズムに応じて、サポートされているキーの長さ(128,192,256など)を使用する必要があります。

これを行う一般的な方法の1つは、パスフレーズを(たとえばSHA経由で)ハッシュし、最初のNバイトを抽出することです。これは、パスフレーズが同じであっても、2人のユーザーの「キー」が同一ではないような初期設定値でパスワードを「塩」化することができるため、これは優れています。あなたが本当にこのようなことに興味があるなら、精神的な仕事はApplied Cryptography by Bruce Schneierです。実用的な実装の詳細については

see

1

使用しようとしているキーの長さが正しくない場合にこのエラーが発生することがあります。

ので擬似コードでは、あなたがこのような何かしようとしている:

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

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

キーの値を確認してください。おそらく、間違った場所に保存されています。

-1

スムース暗号化に16バイトのキー値文字列を使用します。キー "thebestsecretkey"はbase64で動作します

関連する問題