【问题标题】:python, encryption of any size code with a smaller keypython,用较小的密钥加密任何大小的代码
【发布时间】:2013-03-11 03:32:07
【问题描述】:

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

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:]

【问题讨论】:

  • 你为什么要滚动你自己的加密?这可能相当危险......
  • 还可以更有趣!

标签: python encryption


【解决方案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)) 之类的东西,但这太复杂了

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

【讨论】:

  • @jack:如果您认为某个答案有用,请点赞。如果答案解决了您的问题,请接受它(单击它旁边的复选标记)。您也应该为其他未解决的问题这样做。如果您从不这样做,人们将不再关注您的问题。提供反馈总是好的 :-)
  • 我会这样做,但我还没有 +15 代表,否则我肯定会,尽管我可能还有一些问题。
  • @jack:我对赞成、接受答案的错误应该有效,并且也会给你+2(iirc)的声誉。当然,只有在它对你合理有效的情况下才接受——而不是为了 +2 代表;-)
  • 为什么?这个对我有用! print(encrypt('19349','12')) 最后打印出40561。您使用的是哪个 Python 版本?你到底在做什么,结果是什么?
  • @jack:在项目符号中添加了一些关于Decimal() 构造函数的文本。
猜你喜欢
  • 2014-02-21
  • 1970-01-01
  • 2014-07-15
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多