Python,用较小的密钥加密任意大小的代码
我正在尝试创建一个程序,它可以接受两个输入,比如
encrypt('12345','12')
然后它会返回
'33557'
其中代码('12345')是通过密钥('12')从右到左进行递增的。
我已经创建了一个可以处理代码和密钥都是8位长的情况,但我不知道如果代码可以是任意长度,应该怎么做,可能需要用到嵌套的循环?
这是我之前做的一个例子,这样你可以更清楚我想要实现的功能
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:]
1 个回答
1
以下是一些在 Python 3.2 上测试过的代码:
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()
的构造函数可以接受一个参数,这个参数会被转换成一个 Decimal 对象。在这个例子中,numbers_as_text
字符串和整数10
都被转换成了Decimal
类型的对象。power
是一个变量,初始值为1
,在我们处理每一位数字时都会乘以10
(从右边开始计数)。它基本上是一个指针,用来指示我们在当前循环迭代中需要修改num
的位置。for
循环的开头确保我们对输入文本中的每一位数字进行一次迭代。我们也可以用for index in range(len(numbers_as_text))
这样的方式,但那样会复杂一些。
当然,如果你想编码文本,这种方法就不适用了。但因为这不是你问题的要求,所以这个函数主要是处理整数的。