2012-04-25 16 views
1

暗号化と復号化機能を記述しました。暗号化はうまく動作しますが、私は常に復号化でIllegalBlockSizeExceptionを取得します。復号化時にIllegalBLockSizeExceptionが発生する

public static String aes_encrypt (String text, String key) 
{ 
    SecretKey skey = new SecretKeySpec(key.getBytes(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE"); 
    cipher.init(Cipher.ENCRYPT_MODE, skey); 

    return new String((cipher.doFinal(text.getBytes()))); 

} 

そして、ここで復号化機能です:

public static String aes_decrypt (String text, String key) 
{ 

    SecretKey skey = new SecretKeySpec(key.getBytes(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE"); 
    cipher.init(Cipher.DECRYPT_MODE, skey); 

    return new String((cipher.doFinal(text.getBytes()))); 
} 

ここでこれをテストする簡単なmainメソッドです:

public static void main (String args[]) 
{ 
    String text = "Hello, world!"; 
    String key = "nv93h50sk1zh508v"; 
    String en, de; 

    System.out.println("Text: " + text); 
    System.out.println("Encrypted: " + (en = aes_encrypt(text, key)) 
      + " length = " + en.length()); 
    System.out.println("Decrypted: " + (de = aes_decrypt(en, key))); 
} 

は、誰もが適切になるようにどのように「パッド」に暗号化された文字列を知っています私はそれを解読することができますか? (私は長さが16の倍数になるまで0で文字列を水増ししようとしたが、string not properly paddedのようなものを得ました。)

おかげ

+0

あなた自身のコードを書く理由は何ですか?あなたは "Bouncy Castle"ライブラリを試しましたか? (http://www.bouncycastle.org/java.html) –

+0

私は、第三者のライブラリを使いたくないです。 –

+0

@CarlosTasadaバウンシーキャッスルは多くのことをしています。 CMSなどのコンテナ形式を使用することを意味する場合は、例を指し示してください。 –

答えて

2

を私は問題はあなたがStringコンストラクタを使用していると思います。これは、バイト配列のすべての値を保持しない可能性があるテキストエンコーディングメカニズムを使用して文字列に変換しています。システムのデフォルトエンコーディングでサポートされていないものは破棄されます。文字列表現が必要な場合は、代わりに16進数または64進数のエンコーディングに変換します。解読メソッドの開始時にここで使用するエンコーディングを逆にします。

パディングの問題ではありません。暗号化呼び出しでこの問題が解決されます。バイト配列を文字列にエンコードする手段があるため、バイトが足りません。

this SO questionの回答には、基本的な64命令があります。

+0

もっと具体的に教えてください。だから私は16進値にバイト配列を変換する必要がありますか?ありがとう –

+0

あなたは明らかに文字列を渡すことができるようにバイト配列のテキスト表現が必要です(ただし、暗号化された形式をバイト配列として保持することはできますが...)。これを行う一般的な方法は、16進数(32,65,99を含むバイト配列は204163になります)、または64を基底として(同じ配列はIEFjになります)変換することです。 –

関連する問題