python, encryption of any size code with a smaller key
所以我正在努力创建一个可以接受两个输入的程序,比如
1 | encrypt('12345','12') |
它会回来的
1 | '33557' |
其中代码("12345")由右向左递增键("12")。
我已经创建了一个可以在代码和键都是8长的情况下使用的代码,但是如果允许代码是任何大小的话,我就无法解决这个问题,可能需要嵌套用于语句吗?
这是我早些时候做的,这样你就能更好地了解我在做什么。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def code_block(char,charBlock): if len(char) == 8 and len(charBlock) == 8: #Check to make sure both are 8 didgets. c = char cB = charBlock line ="" for i in range(0,8): getDidget = code_char2(front(c),front(cB)) c = last(c) cB = str(last(cB)) line =line + getDidget print(line) else: print("Make sure two inputs are 8 didgets long") def front(word): return word[:+1] def last(word): return word[+1:] |
在python 3.2上测试的一些代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from decimal import Decimal import itertools def encrypt(numbers_as_text, code): key = itertools.cycle(code[::-1]) num = Decimal(numbers_as_text) power = 1 for _ in numbers_as_text: num += power * int(next(key)) power *= Decimal(10) return num if __name__ =="__main__": print(encrypt('12345','12')) |
一些解释:
code[::-1] 是一种很酷的反转字符串的方法。从这里偷来的itertools.cycle 不停地重复你的钥匙。因此,变量key 现在包含一个生成2 、1 、2 、1 、2 、1 等的发生器。Decimal 是一种可以处理任意精度数字的数据类型。实际上,python 3的整数就足够了,因为它们可以处理任意位数的整数。将类型名作为函数Decimal() 调用,调用该类型的构造函数,从而创建该类型的新对象。Decimal() 构造函数可以处理一个参数,然后将该参数转换为十进制对象。在本例中,numbers_as_text 字符串和整数10 都通过其构造函数转换为Decimal 类型。power 是一个以1 开头的变量,它乘以10 得到我们处理过的每个数字(从右边算起)。它基本上是一个指针,指向在当前循环迭代中需要修改num 的地方。for 循环头确保我们对给定输入文本中的每个数字进行一次迭代。我们也可以使用像for index in range(len(numbers_as_text)) 这样的东西,但这是不必要的复杂
当然,如果您想对文本进行编码,这种方法是行不通的。但由于这不在您的问题规范中,所以这是一个专注于处理整数的函数。