2011-07-29 30 views
3

AES、CBCブロックサイズ16バイト、キー256ビットのファイルを暗号化する必要があります。ファイルは16バイトの倍数にゼロで埋められる必要があります。そして、ファイルを暗号化した後に、最後に付加されたゼロの量を追加する必要があります。Android AES暗号化ゼロパディング

たとえば、ファイルが9バイトの場合、7バイトが付加されます。 16バイトが暗号化され、読み込みデータの長さ9が最後に追加されます。したがって、全長は17バイトで、最後のバイトは暗号化されていないはずです。

私はCipherクラスを使用していますが、私は "AES/CBC /"を使用することを知っていますが、私が望むものを記述するパディング方法があるかどうかはわかりません。

EDIT: 最後のバイトは、最後の16バイトの埋め込みセル内の実際のデータの何バイトであるべきですか。

+0

私はあなたの問題を理解しているかどうかわかりませんが、正しいパディングまたはバッファを使用してバッファを構築する方法を尋ねています。 – Idistic

+0

パディング方法の名前があるかどうかを知りたいのですが、手動で行う必要がありますか?名前があればサポートされていますか? – Hank

+0

timothyjcの回答に記載されているように、埋め尽くされたパディングメカニズムが使用されているため、「AES/ECB/PKCS7Padding」ブロックサイズが最大255バイトまで処理されます。 – Idistic

答えて

0

これを簡単に行うために必要なすべてのライブラリ(JCE経由)がAndroidに用意されているため、手動で行う必要はありません。

私はここにAndroidアプリのために書いたいくつかのAES encryotionコードを掲載:http://pocket-for-android.1047292.n5.nabble.com/Encryption-method-and-reading-the-Dropbox-backup-td4344194.html#a4454327

あなたは私の場合にはPKCS5Paddingたパディングスキームに注意を払うようにしたいかもしれません。

+0

私が特に探しているのは、スキーム、私は私の質問で上記で説明したものです。 – Hank

+0

ANSI X.923 ... http://stackoverflow.com/questions/1329730/java-ansi-x923-padding、http://ja.wikipedia.org/wiki/Padding_%28cryptography%29を試すことができます。 – timothyjc

+0

長さバイトも暗号化されているため、ANSI X.923は類似していますが同じではありません。 – Hank

2

あなたの問題を既に解決しているかどうかはわかりませんが、探しているパディングタイプはです。ゼロビットパディングです。このコードは2.3.3シミュレータで私のために働きます:

String stringKey = "60380131061660211660380426804995"; 
String message = "This is a secret message"; 
try { 
    SecretKeySpec sks = new SecretKeySpec(stringKey.getBytes(),"AES"); 
    Cipher c = Cipher.getInstance("AES/ECB/ZeroBytePadding"); // Change to CBC and use appropriate IV 
    c.init(Cipher.ENCRYPT_MODE, sks); 
    c.update(message.getBytes()); 
    byte[] ciphertext = c.doFinal(); 
    Log.i("CE", new String(ciphertext)); 

    } catch (NoSuchAlgorithmException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (NoSuchPaddingException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (InvalidKeyException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (IllegalBlockSizeException e) { 
     Log.e("CE",e.getMessage()); 
    } catch (BadPaddingException e) { 
     Log.e("CE",e.getMessage()); 
} 
+0

あなたの質問を再読したところ、ZeroBytePaddingはあなたが望むものではないと思います。最後のバイトを暗号化したくないため、ANSI X.923も必要でない場合は、パディングルーチンを自分で記述する必要があります。したがって、メッセージをX.923で埋め、最後のバイトをコピーして暗号化し、最後のバイトをゼロパッド長でファイルに追加します。 – Chopstick

+3

'Cipher cipher = Cipher.getInstance(" AES/ECB/ZeroBytePadding ");' yields ''" AES/ECB/ZeroBytePadding "をサポートするプロバイダが見つかりません。どのプロバイダを使用すべきか知っていますか? –

+0

@OneTwoThree ZeroBytePaddingはBouncy Castleコードに基づいているためAndroidでは動作しますが、JREでは動作しません。利用できない場合は、Bouncy Castleプロバイダを追加して設定するか、Spongy Castleを使用してください。 –