Illegale Blockgröße Ausnahme-Input-Länge muss ein Vielfaches von 16 beim entschlüsseln mit gepolsterten cipher

In meine Anwendung bin ich ver-und Entschlüsselung von Daten mithilfe von secretKey. Dafür bin ich mit dem AES-Algorithmus. Aber ich bin immer Ausnahme entschlüsseln, einen Wert von drei bereits verschlüsselten Werte mit Schlüssel.

Ausnahme:

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

Unten ist mein code:

Funktion encyrpt Wert

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;
}

Funktion zu entschlüsseln Wert

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;
}

Folgenden sind die Werte, die ich verschlüsseln und entschlüsseln von

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);

In der test-Funktion, die ich geschrieben habe, die folgenden drei Testfällen.

  1. Einen neuen Wert (Wert1) verschlüsselt und entschlüsselt, mit einem geheimen Schlüssel.
  2. Beispiel zwei verschlüsselte Werte (enctypedValue1, enctypedValue2), die entschlüsselt werden unter Verwendung desselben geheimen Schlüssels. encryptedValue2, die ein problem beim entschlüsseln mit der gleichen geheimen Schlüssel.
  3. Einen neuen Wert (value4) verschlüsselt und entschlüsselt, mit einem geheimen Schlüssel.

Auf die Entschlüsselung encryptedValue2 ich bin immer folgende exception:

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

Folgende ist, was ich abgeleitet haben, bis jetzt.

  1. Den problematischen Wert zu haben scheint ein problem beim Dekodieren, es gibt 81 Länge-array, die nicht entschlüsselt?
  2. Wenn dieses problem war zu geschehen, es hätte geschehen sollen, um alle Werte.
  3. Ist das ein Wert spezifisches problem oder ist es etwas im Zusammenhang mit Polsterung oder es kann ein anderes Verhalten auf unterschiedliche browser, unterschiedliche os?
in Ihrem decrypt-Methode, die Sie verwendet cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); Jedoch in Ihrer encrypt-Methode, die Sie verwendet cipher = Cipher.getInstance("AES");. Sie müssen die gleichen sein. Hinzufügen Polsterung an Chiffre verschlüsseln-Methode.
Dieser link könnte hilfreich sein :stackoverflow.com/questions/7640463/...
danke für die Korrektur. Eigentlich ist es das schreiben Fehler. Bitte sehen Sie die bearbeitete Frage.
wird es erfordern,, um hinzufügen Polsterung in SecretKeySpec oder bei der Erzeugung der geheimen Schlüssel?
Es ist nicht notwendig von selbst. Jedoch in der realen Welt, block-cipher-algorithmen nicht unmittelbar allein für die übertragung der Daten. Sie sind in verschiedenen Modi wie CBC-Modus verwendet SSL. Hier ist eine gute Lektüre über Polsterung: en.wikipedia.org/wiki/Padding_%28cryptography%29 Auch, ich empfehle das Lesen über block cipher Verschlüsselungsverfahren (AES ist ein Blockchiffre-Algorithmus): en.wikipedia.org/wiki/Block_cipher

InformationsquelleAutor JankiPanwala | 2013-07-10

Schreibe einen Kommentar