5

Android/Java アプリでは、

byte[] data = ":ʺ$jhk¨ë‹òºÃ"; // fetched from php server..
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, mKeyspec);
return new String(cipher.doFinal(data));

上記のコードはBadPaddingException: pad block corrupted、次の 16 バイトの暗号化されたデータに対して 常にスローします。

data = ":ʺ$jhk¨ë‹òºã" (データは 16 文字)

キーの長さは 16 バイトです。

データがすでにブロックのサイズになっているのに、なぜこの例外がスローされるのですか? パディングは必要ありません。

注: 暗号化されたデータは、php サーバーから取得されます。

編集:

に変更
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");

Cipher cipher = Cipher.getInstance("AES");

復号化メソッドは成功しますが、この出力が得られます ここに画像の説明を入力

4

2 に答える 2

8

私が扱ってきたほとんどのケースBadPaddingExceptionは、サーバー側で異なるパディングで暗号化されたものを復号化しようとしたとき、または場合によっては復号化さえされなかったときでした。したがって、まず最初に、方法を見て、サーバーがBase64エンコードされているだけでなく、暗号化された文字列を返していることを確認することをお勧めしますAES。注意すべきもう 1 つのことは、サーバー側の暗号化で:AES/CBC/NoPaddingや. その場合、Android で同じパディングを使用して、文字列を復号化する必要があります。AES/CBC/PKCS5PaddingAES/CBC/PKCS7Padding

于 2013-03-01T13:11:29.703 に答える
1

初期化ベクトルを必要としない方法を使用して、16 バイトのみの固定長のデータを暗号化するには、 に変更AESAES/ECB/NoPaddingます。

于 2013-03-01T13:12:49.857 に答える