Chiffre doFinal pad block corrupted beim entschlüsseln der Datei mit AES

Erstelle ich ein Programm, das ermöglicht Benutzern das hochladen und herunterladen von verschlüsselten Dateien und entschlüsselt werden, wenn Sie die richtigen Berechtigungen haben, um so zu tun. Verschlüsseln und hochladen ist in Ordnung, und so ist der Download, aber wenn ich versuche zu entschlüsseln, bekomme ich den "pad block corrupted" - Fehler.

Was ich versuche zu tun ist, nehmen Sie die verschlüsselte Datei, und erstellen Sie dann eine Kopie, die Sie unverschlüsselt

Ich verkürzt, was ich konnte, also bitte nicht den Kommentar, dass es aussieht unvollständig.

KeyGen:

public static SecretKey genGroupSecretKey() {
    try {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES", "BC");
        keyGen.init(128);
        return keyGen.generateKey();
    } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
        System.err.println("Error: " + e.getMessage());
        e.printStackTrace(System.err);
    }
    return null;
}

Verschlüsseln:

try (FileInputStream fis = new FileInputStream(sourceFile)) {
    response = Utils.decryptEnv((byte[]) tempResponse.getObjContents().get(0), fsSecretKey, ivSpec);

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

    do {
        byte[] buf = new byte[4096];

        int n = fis.read(buf); //can throw an IOException
        else if (n < 0) {
            System.out.println("Read error");
            fis.close();
            return false;
        }

        byte[] cipherBuf = cipher.doFinal(buf);

        //send through socket blah blah blah

    } while (fis.available() > 0);

Entschlüsseln:

   ...     

   Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC");
   cipher.init(Cipher.DECRYPT_MODE, secKey, ivSpec);

    File file = new File("D_" + filename); //D_ for decrypted
    FileOutputStream fos = null;
    if (!file.exists()) {
        file.createNewFile();
        fos = new FileOutputStream(file);
    }

    try (FileInputStream fis = new FileInputStream(filename)) {
        do {
            byte[] buf = new byte[4096];
            int n = fis.read(buf);
            if (n < 0) {
                System.out.println("Read error");
                fis.close();
                return false;
            }

            byte[] cipherBuf = cipher.doFinal(buf);  //ERROR HERE
            System.out.println("IS THIS WORKING WTF: " + new String(cipherBuf));
            fos.write(cipherBuf, 0, n);

        } while (fis.available() > 0);
        fis.close();
        fos.close();
        return true;
InformationsquelleAutor Tim | 2014-04-03
Schreibe einen Kommentar