'decrypt(data, [pad], [padmode]) -> bytes
data : bytes to be encrypted
pad  : Optional argument for decryption padding. Must only be one byte
padmode : Optional argument for overriding the padding mode.
The data must be a multiple of 8 bytes and will be decrypted
with the already specified key. In PAD_NORMAL mode, if the
optional padding character is supplied, then the un-encrypted
data will have the padding characters removed from the end of
the bytes. This pad removal only occurs on the last 8 bytes of
the data (last data block). In PAD_PKCS5 mode, the special
padding end markers will be removed from the data after
decrypting, no pad character is required for PAD_PKCS5.'

def decrypt(self, data, pad=None, padmode=None):

    ENCRYPT = des.ENCRYPT
    DECRYPT = des.DECRYPT
    data = self._guardAgainstUnicode(data)
    if (pad is not None):
        pad = self._guardAgainstUnicode(pad)
    if (self.getMode() == CBC):
        self.__key1.setIV(self.getIV())
        self.__key2.setIV(self.getIV())
        self.__key3.setIV(self.getIV())
        i = 0
        result = []
        while (i < len(data)):
            iv = data[i:(i + 8)]
            block = self.__key3.crypt(iv, DECRYPT)
            block = self.__key2.crypt(block, ENCRYPT)
            block = self.__key1.crypt(block, DECRYPT)
            self.__key1.setIV(iv)
            self.__key2.setIV(iv)
            self.__key3.setIV(iv)
            result.append(block)
            i += 8
        if (_pythonMajorVersion < 3):
            data = ''.join(result)
        else:
            data = bytes.fromhex('').join(result)
    else:
        data = self.__key3.crypt(data, DECRYPT)
        data = self.__key2.crypt(data, ENCRYPT)
        data = self.__key1.crypt(data, DECRYPT)
    return self._unpadData(data, pad, padmode)
