# ------------------------------------------------------------------------------ # # SHA-512-BASED FEISTEL CIPHER # by Toni Mattis # # Feistel Function: SHA-512(Block || Key) # Key Size: Fully Dynamic # Block Size: 1024 Bits # Rounds: User-Specified # # ------------------------------------------------------------------------------ from hashlib import sha512 BPOS = tuple(range(64)) def enc_block(block, key, rounds = 16): x = block[:64] y = block[64:] for i in xrange(rounds): h = sha512(x + key).digest() y = ''.join([chr(ord(y[k]) ^ ord(h[k])) for k in BPOS]) h = sha512(y + key).digest() x = ''.join([chr(ord(x[k]) ^ ord(h[k])) for k in BPOS]) return x + y def dec_block(block, key, rounds = 16): x = block[:64] y = block[64:] for i in xrange(rounds): h = sha512(y + key).digest() x = ''.join([chr(ord(x[k]) ^ ord(h[k])) for k in BPOS]) h = sha512(x + key).digest() y = ''.join([chr(ord(y[k]) ^ ord(h[k])) for k in BPOS]) return x + y