8

私のアプリケーションでは、secretKey を使用してデータを暗号化および復号化しています。そのために、AES アルゴリズムを使用しています。しかし、秘密鍵を使用して既に暗号化された 3 つの値のうちの 1 つの値である、復号化で例外が発生しています。

例外は次のとおりです。

Illegal Block Size Exception Input length must be multiple of 16 when decrypting with padded cipher.

以下は私のコードです:

値を暗号化する関数

public static String symmetricEncrypt(String text, String secretKey) {
    BASE64Decoder decoder = new BASE64Decoder();
    byte[] raw;
    String encryptedString;
    SecretKeySpec skeySpec;
    BASE64Encoder bASE64Encoder = new BASE64Encoder();
    byte[] encryptText = text.getBytes();
    Cipher cipher;
    try {
        raw = decoder.decodeBuffer(secretKey);
        skeySpec = new SecretKeySpec(raw, "AES");
        cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        encryptedString = bASE64Encoder.encode(cipher.doFinal(encryptText));
    } 
    catch (Exception e) {
        e.printStackTrace();
        return "Error";
    }
    return encryptedString;
}

値を復号化する関数

public static String symmetricDecrypt(String text, String secretKey) {
    BASE64Decoder decoder = new BASE64Decoder();
    BASE64Decoder base64Decoder = new BASE64Decoder();
    Cipher cipher;
    String encryptedString;
    byte[] encryptText = null;
    byte[] raw;
    SecretKeySpec skeySpec;
    try {
        raw = decoder.decodeBuffer(secretKey);
        skeySpec = new SecretKeySpec(raw, "AES");
        encryptText = base64Decoder.decodeBuffer(text);
        cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        encryptedString = new String(cipher.doFinal(encryptText));
    } catch (Exception e) {
        e.printStackTrace();
        return "Error";
    }
    return encryptedString;
}

以下は、私が暗号化および復号化している値です

String secretKey = "XMzDdG4D03CKm2IxIWQw7g==";
String value1= "ABCD";
String enctypedValue1= "3uweh4pzoVyH1uODQmVNJA==";
String enctypedValue2= "37PTC20w4DMZYjG3f+GWepSvAbEJUccMXwS/lXilLav1qM/PrCTdontw5/82OdC1zzyhDEsFVRGo rV6gXAQcm+Zai15hliiUQ8l8KRMtUl4=";
String value4= "20000";

/**  Ecnryption and decryption of value1 **/
String encryptedValue1= symmetricEncrypt(value1, secretKey);
String decryptedValue1 = symmetricDecrypt(encryptedValue1, secretKey);

/**  Decryption of  enctypedValue1 **/
String decryptedValue2 = symmetricDecrypt(enctypedValue1, secretKey);
System.out.println(decryptedValue2);

/**  Decryption of  enctypedValue2 (Not decrypted)**/
String decryptedValue3 = symmetricDecrypt(enctypedValue2, secretKey);
System.out.println(decryptedValue3);

/**  Ecnryption and decryption of value4 **/
String encryptedValue4= symmetricEncrypt(value4, secretKey);
String decryptedValue4 = symmetricDecrypt(encryptedValue4, secretKey);

テスト関数では、次の 3 つのテスト ケースを記述しました。

  1. 秘密鍵を使用して暗号化および復号化される新しい値 (value1)。
  2. 同じ秘密鍵を使用して復号化されている 2 つの暗号化された値の例 (enctypedValue1、enctypedValue2)。同じ秘密鍵を使用して復号化中に問題が発生した encryptedValue2。
  3. 秘密鍵を使用して暗号化および復号化される新しい値 (value4)。

encryptedValue2 を復号化すると、次の例外が発生します。

Illegal Block Size Exception Input length must be multiple of 16 when decrypting with padded cipher

以下は、私が今まで導き出したものです。

  1. 問題のある値はデコード中に問題があるようですが、復号化できない 81 の長さの配列を返しますか?

  2. この問題が発生した場合、すべての値で発生するはずです。

  3. これは値固有の問題ですか、それともパディングに関連するものですか、それともブラウザーや OS が異なると動作が異なる可能性がありますか?

4

1 に答える 1