'undigest(blocks : [string]) : string
Perform the reverse package transformation on a list of message
blocks.  Note that the ciphermodule used for both transformations
must be the same.  blocks is a list of strings of bit length
equal to the ciphermodule\'s block_size.'

def undigest(self, blocks):

    if (len(blocks) < 2):
        raise ValueError, 'List    must    be    at    least    length    2.'
    blocks = map(bytes_to_long, blocks)
    K0 = (self.__K0digit * self.__key_size)
    hcipher = self.__newcipher(K0)
    block_size = self.__ciphermodule.block_size
    hashes = []
    for i in range(1, len(blocks)):
        mticki = (blocks[(i - 1)] ^ i)
        hi = hcipher.encrypt(long_to_bytes(mticki, block_size))
        hashes.append(bytes_to_long(hi))
    key = (blocks[(-1)] ^ reduce(operator.xor, hashes))
    mcipher = self.__newcipher(long_to_bytes(key, self.__key_size))
    parts = []
    for i in range(1, len(blocks)):
        cipherblock = mcipher.encrypt(long_to_bytes(i, block_size))
        mi = (blocks[(i - 1)] ^ bytes_to_long(cipherblock))
        parts.append(mi)
    padbytes = int(parts[(-1)])
    text = b('').join(map(long_to_bytes, parts[:(-1)]))
    return text[:(- padbytes)]
