python,使用较小的密钥加密任何大小的代码

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现在包含一个生成212121等的发生器。
  • Decimal是一种可以处理任意精度数字的数据类型。实际上,python 3的整数就足够了,因为它们可以处理任意位数的整数。将类型名作为函数Decimal()调用,调用该类型的构造函数,从而创建该类型的新对象。Decimal()构造函数可以处理一个参数,然后将该参数转换为十进制对象。在本例中,numbers_as_text字符串和整数10都通过其构造函数转换为Decimal类型。
  • power是一个以1开头的变量,它乘以10得到我们处理过的每个数字(从右边算起)。它基本上是一个指针,指向在当前循环迭代中需要修改num的地方。
  • for循环头确保我们对给定输入文本中的每个数字进行一次迭代。我们也可以使用像for index in range(len(numbers_as_text))这样的东西,但这是不必要的复杂

当然,如果您想对文本进行编码,这种方法是行不通的。但由于这不在您的问题规范中,所以这是一个专注于处理整数的函数。