public String decrypt(String inputFileName, String key) throws Exception {
		if (!getExtension(inputFileName).equalsIgnoreCase("cheng")) {
			// the input file must have extension .cheng
			return "Your File has wrong extension.";
		}
		SecretKeySpec tempKey = null;
		// if user has put in the key, generate a key by the string that user
		// has put in
		if (key != null) {
			tempKey = this.generateKey(key);
		} else {
			// otherwise use defaultkey initialized before
			tempKey = FileEncryptor.defaultKey;
		}
		cypher.init(Cipher.DECRYPT_MODE, tempKey);
		FileInputStream inputStream = new FileInputStream(inputFileName);
		File tmpFile = new File(inputFileName);
		// create output file
		String outFileName = this.saveDir.getAbsolutePath() + "/"
				+ getFileName(tmpFile.getName());
		FileOutputStream outputStream = new FileOutputStream(outFileName);
		// read and write from inputfile to outputfile through a buffer bytes
		// this buff array could be improved by using PureBAOS class, but I
		// haven't fully
		// understand the GZIP mechanism
		// ***********************//
		// get help form Ru Peng student ID: G00307401
		// I was used PureBAOS to create dynamic buffer before,but not work
		// **********************//
		byte[] b = new byte[20496];
		// get dynamic buffer
		PureBAOS pb = new PureBAOS();
		byte[] temp = pb.getBuf();
		while (inputStream.read(b) > 0) {
			temp = cypher.doFinal(b);
		}
		// after read action because we defined a byte array with fixed size
		// we should delete the extra null values
		// otherwise the output file be represent wrong and take more space
		outputStream.write(trim(temp));
		pb.close();
		inputStream.close();
		outputStream.close();
		return outFileName;
	}