0

一部のデータを暗号化してからネットワーク経由で送信し、最終的に以下のクラスを使用して Android デバイスでそのデータを復号化しています。暗号化は Java サーバーで行われ、復号化は電話で行われます。電話でデータを復号化すると、「javax.crypto.BadPaddingException: パッド ブロックが壊れています」というエラーが表示されます。コンピューターで単体テストを実行すると、このエラーは発生しません。なぜこれが起こっているのかについて何か考えはありますか?

import java.security.*;
import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec;
import sun.misc.*;

public class Encryption {
private static final String ALGORITHM = "AES";
private static final byte[] keyValue = 
    new byte[] { '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G' };

public static String encrypt(String valueToEnc) throws Exception {
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encValue = c.doFinal(valueToEnc.getBytes());
    String encryptedValue = new BASE64Encoder().encode(encValue);
    return encryptedValue;
}

private static Key generateKey() throws Exception {
    Key key = new SecretKeySpec(keyValue, ALGORITHM);
    return key;
}

private static String decrypt(String encryptedValue) throws Exception {
    Key key = generateKey();
    Cipher c = Cipher.getInstance(ALGORITHM);
    c.init(Cipher.DECRYPT_MODE, key);
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);
    return decryptedValue;
}
}
4

1 に答える 1

1

私の推測では、2 つのプラットフォームがモードやパディングに異なるデフォルト値を使用していると思います。暗号のみを指定すると、基になる実装によってモードとパディングが選択されます。

両端で必要な正確な暗号/モード/パディングを指定してみてください。

Cipher.getInstance("AES/ECB/PKCS5Padding");

これはほんの一例です。必要なモードとパディングを使用します。

于 2012-08-01T15:16:30.477 に答える