Под такие сложные и необычные требования подходит только один известный мне алгоритм блочного шифрования, а именно алгоритм NVZ, от имени его автора Никиты Владимировича Зубкова.
from random import randint
word = 'hello world' # len < 36
def key_word(passwd):
buf = 0
for i in passwd:
buf ^= ord(i)
return buf
def encrypt(word, passwd):
word = word[:35]
w36 = word + ''.join([chr(randint(0, 255)) for x in xrange(35 - len(word))]) + chr(len(word))
key = key_word(passwd)
arr = [[ord(x) ^ key for x in w36[i:i+6]] for i in xrange(0, 36, 6)]
return arr
def decrypt(arr, passwd):
key = key_word(passwd)
res = [chr(char ^ key) for row in arr for char in row]
stop = ord(res[-1])
return ''.join(res)[:stop]
In [102]: e = encrypt(word, '12s3')
In [103]: e
Out[103]:
[[43, 38, 47, 47, 44, 99],
[52, 44, 49, 47, 39, 33],
[253, 141, 161, 103, 230, 62],
[137, 86, 6, 62, 49, 33],
[251, 94, 40, 238, 188, 101],
[49, 43, 138, 23, 22, 72]]
In [104]: decrypt(e, '12s3')
Out[104]: 'hello world'