public void decryptFile(String filePath, byte[][][] reversedSubKeys) {
        System.out.println();
        System.out.println("Decrypting Async");

        try {
            final File inputFile = new File(filePath);
            final File outputFile = new File(filePath.replace(".des",".decryptedasync"));
            final InputStream inputStream = new BufferedInputStream(new FileInputStream(inputFile));
            final OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFile));

            final List<Future<byte[]>> futures = new ArrayList<>();
            final ExecutorService executor = Executors.newFixedThreadPool(4);

            final long nbBytesFileWithoutHeader = inputFile.length() - 1;
            final long nbTotalBlocks = (long) Math.ceil(nbBytesFileWithoutHeader / (double) BLOCK_SIZE_IN_BYTES);
            System.out.println("file lenght " + inputFile.length()); 
            System.out.println("nbTotalBlocks " + nbTotalBlocks);

            final int nbBytesPadding = inputStream.read();

            byte[] block = new byte[BLOCK_SIZE_IN_BYTES];
            for (int nbBlocks = 1; nbBlocks <= nbTotalBlocks; nbBlocks++) {
                inputStream.read(block);

                final byte[] finalBlock = block;
                //System.out.println("Decrypting block async " + nbBlocks);
                futures.add(CompletableFuture.supplyAsync(() -> {
                    return DesAlgorithm.decryptBlock(finalBlock, reversedSubKeys);
                }, executor).exceptionally(ex -> {
                    throw (RuntimeException) ex;
                }));

                block = new byte[BLOCK_SIZE_IN_BYTES];
            }
            inputStream.close();

            for (int i = 1; i <= nbTotalBlocks; i++) {
                byte[] decryptedBlock = futures.get(i-1).get();
                if  (i == nbTotalBlocks) {
                    decryptedBlock = Arrays.copyOfRange(decryptedBlock, 0, BLOCK_SIZE_IN_BYTES - nbBytesPadding);
                }

                outputStream.write(decryptedBlock);
                //System.out.println("Blok " + i +" weggeschreven");
            }
            
            System.out.println("Done writing to file");
            ConsoleHelper.appendSuccess("Writing decrypted file to: " + outputFile.getPath());

            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }