基础数学(?)/简单加密

时间:2016-02-12 10:59:47

标签: python

我正在建立一个或多或少的简单加密。 现在经过一些模糊和摆弄后,我遇到了一个我似乎无法找到解决方案的问题。

在加密过程中,我将一个字符串作为输入并将其转换为二进制文件,以便对其进行一些数学运算。在“mathing”部分后我得到这样的字符串:

56010479313713691637235922367138913625577411202663921330215486595

现在在这一步之后我将字符串解析成2对 像这样:

56 01 04 79 31 37 13 69 16 37 23 59 22 36 71 38 13 62 55 77 41 12 02 66 39 21 33 02 15 48 65 95 

现在仍然是1个字符串对象。我现在的问题是,我似乎无法构建一种方法来实际使用这些对1 1来对它们进行更多的数学计算(之后我也想将结果转换为ascii或其他东西)。可能只是缺乏睡眠,但我似乎无法找到解决方案,任何帮助将不胜感激:)

编辑:我现在使用了timgeb提供的功能来进一步处理我的代码。 现在我停留在另一个相当愚蠢的地方,让我们称之为bug。

下面是从文件tmp.txt读取加密字符串(数字)的代码片段,注释解释其余部分我猜。 我现在的问题是,当我运行脚本时,它会将int连接回一个字符串,但之后将数字对替换为字母根本不起作用。

#***** Read from tmp.txt *****
 alphaStr2 = linecache.getline('tmp.txt', 1)
 alphaStr2 = int(alphaStr2) / 123456789
 alphaStr = str(alphaStr2)

#***** Split into pairs of 2 *****
 alphaStr = " ".join(alphaStr[i:i+2] for i in range(0, (len(alphaStr) + 1), 2))

#***** Convert to list *****
 numStr = alphaStr.split()

#***** Convert list content to int's *****
 numStr = map(int, numStr)

#***** simple math to adjust to alphabet lenght of 51 (Aa-Zz) *****
 numMath = lambda x: x / 1.96078431372549
 numStr = map(numMath, numStr)

#***** "round" float numbers to integer *****
 numStr = [int(i) for i in numStr]

#***** convert back to string *****
 numStr = ' '.join(str(x).zfill(2) for x in numStr)

#***** Convert numbers into letters *****
 alphaStr = numStr.replace("00 ", "a")   
 alphaStr = numStr.replace("01 ", "b")   
 alphaStr = numStr.replace("02 ", "c")
 alphaStr = numStr.replace("03 ", "d")     
 alphaStr = numStr.replace("04 ", "e")
 .......

3 个答案:

答案 0 :(得分:0)

拆分你的字符串:

>>> s = '56 01 04 79 31'
>>> numbers = s.split()
>>> numbers
['56', '01', '04', '79', '31']

将它们变成整数:

>>> numbers = map(int, numbers)
>>> numbers
[56, 1, 4, 79, 31]

与他们做一些数学

>>> some_math = lambda x: x+1
>>> numbers = map(some_math, numbers)
>>> numbers
[57, 2, 5, 80, 32]

转换回字符串(假设您希望数字< 10用零填充):

>>> ' '.join(str(x).zfill(2) for x in numbers)
'57 02 05 80 32'

或者bytearray-&gt; str如果这就是你所追求的(需要数字<256):

>>> str(bytearray(numbers))
'9\x02\x05P '

答案 1 :(得分:0)

我认为最佳方法是将此字符串拆分为列表:

sequence = "56 01 04 79 31 37 13 69 16 37 23 59 22 36 71 38 13 62 55 77 41 12 02 66 39 21 33 02 15 48 65 95"
sequence = sequence.split()

结果你会得到字符串列表(你可以检查一下):

print type(sequence[10])
<type 'str'>

然后将此字符串列表转换为int元素列表。

for i in sequence:
    convert i to int

我相信你现在可以在列表上做一些数学运算了。

答案 2 :(得分:0)

你意识到了吗

alphaStr = " ".join(alphaStr[i:i+2] for i in range(0, (len(alphaStr) + 1), 2))

没有" ".join()完全符合您的要求吗?实施例

>>> alphaStr = 'hello world'
>>> x = [alphaStr[i:i+2] for i in range(0, (len(alphaStr) + 1), 2)]
>>> x
[he, ll, o , wo, rl, d]

如果你想要整数,我建议用生成器来做,因为你不需要内存中的整个列表

numbers = (int(alphaStr[i:i+2]) for i in range(0, (len(alphaStr) + 1), 2))
numbers = map(numMath, numbers)
numbers = map(int, numbers)

编辑:

您的替换语句的问题是每个替换都会返回一个替换的新字符串,并且您将覆盖最后一个替换。你应该改为

alphaStr = numStr
alphaStr = alphaStr.replace('00 ', 'a') #Use the updated string to continue replacements
alphaStr = alphaStr.replace('01 ', 'b')

这里要小心,因为你的最后一个号码不会被替换,因为你的字符串将是'01 01 00'(没有最终空格)。所以你应该在最后添加一个空格

alphaStr = numStr + ' '
alphaStr = alphaStr.replace('00 ', 'a') #Use the updated string to continue replacements
alphaStr = alphaStr.replace('01 ', 'b')

但更好的是,如果你的转换正是如此(00 - > a,01 - &gt; b,......),你应该更好地使用:

alphaStr = ''.join(chr(ord('a')+x) for x in numStr)

此处ord('a')返回'a'的ascii代码,然后添加x并返回相应的字符,加入所有内容。例如:

>>> numStr = [0,2,5,9,12]
>>> ''.join(chr(ord('a')+x) for x in numStr)
acfjm

如果你使用这个,当chr(ord('a')+x)高于&#39; z&#39;因为ascii代码不会继续使用大写字母;)