1

暗号化と復号化の機能を書きました。暗号化は正常に機能しますが、復号化で常に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())));
}

これをテストする簡単なメインメソッドは次のとおりです。

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ました。)

ありがとう

4

1 に答える 1

2

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

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

このSOの質問への回答には、base64の説明がいくつかあります。

于 2012-04-25T19:26:44.877 に答える