Python,用较小的密钥加密任意大小的代码

0 投票
1 回答
526 浏览
提问于 2025-04-17 18:25

我正在尝试创建一个程序,它可以接受两个输入,比如

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 现在包含一个生成器,它会依次输出 212121,等等。
  • Decimal 是一种可以处理任意精度数字的数据类型。其实 Python 3 的整数就足够了,因为它们可以处理任意位数的整数。调用类型名称作为函数 Decimal(),会调用这个类型的构造函数,从而创建一个该类型的新对象。Decimal() 的构造函数可以接受一个参数,这个参数会被转换成一个 Decimal 对象。在这个例子中,numbers_as_text 字符串和整数 10 都被转换成了 Decimal 类型的对象
  • power 是一个变量,初始值为 1,在我们处理每一位数字时都会乘以 10(从右边开始计数)。它基本上是一个指针,用来指示我们在当前循环迭代中需要修改 num 的位置。
  • for 循环的开头确保我们对输入文本中的每一位数字进行一次迭代。我们也可以用 for index in range(len(numbers_as_text)) 这样的方式,但那样会复杂一些。

当然,如果你想编码文本,这种方法就不适用了。但因为这不是你问题的要求,所以这个函数主要是处理整数的。

撰写回答