2016-02-12 15 views
-1

我正在構建一個或多或少簡單的加密。 現在經過一番模糊和擺弄之後,我遇到了一個我似乎無法找到解決方案的問題。基本數學(?)/簡單加密

在加密過程中,我把一個字符串作爲輸入,並將其轉換爲二進制數據與它做一些數學運算。經過「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串目的。我現在的問題是,我似乎無法組成一種方法,實際上一對一地將這些對與他們進行一些數學運算(之後我也想將結果轉換爲ascii或其他)。可能只是睡眠不足,但我似乎無法找到解決辦法,任何幫助,將不勝感激:)


編輯:我現在用的timgeb提供進一步處理我的代碼的功能。 現在我陷入另一個相當愚蠢的,讓我們稱之爲錯誤。

以下是從文件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") 
....... 

回答

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-> STR如果這就是你在做什麼,需要數< 256)(後:

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

是拉姆達neccessary?它有什麼作用? – Cryo

+0

@Cryo no,lambda只是一個愚蠢的匿名函數用於演示目的,以顯示如何應用一個函數對每個數字進行一些計算。 – timgeb

+0

爲了方便起見,我只是在我的代碼中使用此代碼,無論如何,我已經在〜250行代碼中對某些「基本東西」進行了修改 – Cryo

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 

我相信你現在可以在列表上做一些數學運算。

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 - >一,01 - > B,...),你應該更好地使用:

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

這裏ord('a')返回ASCII碼爲'a'然後將其添加x並返回根據人品,加入了一切。例如:

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

如果你使用的時候chr(ord('a')+x)是上面的「Z」爲ASCII碼不以大寫字母繼續這種注意)

+0

這是一個不錯的方法,謝謝你,我會盡力實現這一點,並從幾行代碼中拯救自己。主要的問題仍然是行alphaStr = numStr.replace(「00」,「a」)等沒有做他們應該的 – Cryo

+0

@Cryo編輯我的答案與替換問題的一些建議,看一看 –

+0

太好了,謝謝。我其實只是解決了所有alphaStr和numStr變量的名稱替換字符串的問題,我知道字符串是一個reserverd關鍵字,但它有點修復它,我不會在這個腳本中使用任何其他字符串函數,所以我想這就是我正在尋找的修復。 – Cryo