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

时间:2013-03-08 13:54:49

标签: python encryption

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

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 个答案:

答案 0 :(得分: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]是一种很酷的方法来反转字符串。 Stolen from here
  • itertools.cycle endlessly repeats your key。因此变量key现在包含一个生成212121的生成器,等
  • Decimal is a datatype which can handle arbitrary precision numbers。实际上Python 3的整数就足够了,因为它们可以处理任意位数的整数。将类型名称作为函数Decimal()调用,调用该类型的constructor,并因此创建该类型的新对象。 Decimal()构造函数可以处理一个参数,然后将其转换为Decimal对象。在示例中,numbers_as_text字符串和整数10都转换为Decimal with its constructor类型。
  • power是一个以1开头的变量,对于我们处理过的每个数字都乘以10(从右边开始计算)。它基本上是指向我们需要在当前循环迭代中修改num的指针
  • for循环标头确保我们对给定输入文本中的每个数字进行一次迭代。我们也可以使用类似for index in range(len(numbers_as_text))的东西,但那是不必要的复杂

当然,如果你想编码文本,这种方法不起作用。但由于这不是你问题的规范,这是一个专注于处理整数的函数。