2011-08-01 41 views
14

このコードをAndroidで実行すると、エラーは発生しませんが、標準のJavaプログラムで実行すると例外が生成されます。java.security.InvalidKeyException:Illegal key size。java.security.InvalidKeyException:不正なキーサイズ

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
SecretKeySpec keySpec = new SecretKeySpec(CHUNK_ENCRYPTION_KEY.getBytes(), 0, 32, "AES"); 
IvParameterSpec initVector = new IvParameterSpec(AES_INITIALIZATION_VECTOR.getBytes(), 0 , 16); 
cipher.init(Cipher.ENCRYPT_MODE, keySpec, initVector); 

CHUNK_ENCRYPTION_KEYは、プログラムにハードコードされた32バイトのキーです。 AES_INITIALIZATION_VECTORは、16バイトのハードコードされた初期化ベクトルです。

デスクトップではなくAndroidで動作する理由は誰にも分かりますか?

+0

あなたの質問には疑問符がありません。 – Snicolas

+0

@ハンク私は同様の問題に直面しています。これを解決しましたか? – NovusMobile

+0

いいえ、これは決して解決できませんでした – Hank

答えて

-1

あなたの提供されたKEYと初期化ベクトルには、それぞれ16バイトの長さの32バイトがないかもしれません。 AESは、(日/オラクルからJREやJDKを使用して)デフォルトのデスクトップJVMのインストールで

SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec(iv); 
+0

変換時にバイト長を確認しましたそれらをバイト配列に変換します。オフセットと長さを指定しない場合、同じ例外が生成されます。 – Hank

+0

あなたは16進文字列をバイトに変換していますか? –

+0

ええ、私の全体のキーストリングは32個のユニコード文字で構成されています。 – Hank

24

:あなたはまた、パラメータにキーのオフセットと長さを取ることはありませんコンストラクタを使用しようとすることができます128ビットのキーサイズに制限されています。これは、暗号ソフトウェアの輸出入に関する法律の残りの部分です。より大きいAESキーサイズのロックを解除するには、「JCE Unlimited Strength Jurisdiction Policy Files」(this pageの下部を参照)をダウンロードして適用する必要があります。

鍵サイズの制限は、Cipherクラス内のコードによって強制されます。暗号化プロバイダを変更すると(Bouncy CastleまたはIAIKプロバイダのいずれかに)、この制限を回避することはできません。

Stringで生のgetBytes()メソッドを使用したくない場合は、結果が現在のロケール(すべての人がUTF-8またはASCII互換のエンコーディングを使用するわけではない)に依存するためです。キーをリテラル文字列として表現したい場合は、少なくとも以下のような明示的なエンコーディングを使用してください:CHUNK_ENCRYPTION_KEY.getBytes("UTF-8")

1

「JCE Unlimited Strength Jurisdiction Policy Files」はあなたの中のjreにコピーする必要がありますJDK、それ以外の場合は動作しません。ファイルのパス:/path/to/jdk1.7.0_xx/jre/lib/security