2011-02-07 86 views
2

我正想通過Python食譜一個處於活動狀態,發現下面的代碼的解密。我提出了以下4個問題。將非常感謝任何指導和解釋。的Python腳本加密和文件

Q ::林無法準確弄清楚,爲什麼是一個「鍵隨機種子」在線從所述用戶在所述第一位置採取「K =長(sys.argv中[2])」?特別是因爲,這個值'k'似乎沒有用在代碼的後面部分?其次,在加密和解密代碼的部分,聲明「bytearray [i] -random.randint(0,255)%256」的確切含義是什麼?這是否意味着每個字符的unicode值在加密期間會移位或移位,並在解密時重新移回原始值?

第三,莫非 「的bytearray =地圖(ORD,f1.read())」 計算文件中的每個字符的Unicode點值?

最後,由於隨機數的加密和解密使用的,什麼因素保證了加密文件的解密將是準確的?種子價值「k」與此有什麼關係?

下面是我學習的代碼。

將非常感謝您的指導,在此先感謝

# encdec.py 

import sys 
import random 

if len(sys.argv) != 5: 
    print "Usage: encdec.py e/d longintkey [path]filename1 [path]filename2" 
    sys.exit() 

k = long(sys.argv[2]) # key 
random.seed(k) 

f1 = open(sys.argv[3], "rb") 
bytearr = map (ord, f1.read()) 
f2 = open(sys.argv[4], "wb") 

if sys.argv[1] == "e": # encryption 

    for i in range(len(bytearr)): 
     byt = (bytearr[i] + random.randint(0, 255)) % 256 
     f2.write(chr(byt)) 


if sys.argv[1] == "d": # decryption 

    for i in range(len(bytearr)): 
     byt = ((bytearr[i] - random.randint(0, 255)) + 256) % 256 
     f2.write(chr(byt)) 

f1.close() 
f2.close() 

回答

6

random.seed(k)將隨機數生成器設置爲某個狀態,這將提供隨機數的同一個列表相同k

import random 
print [random.randint(0,255) for i in xrange(5)] 

每次運行腳本時都會返回不同的數字。

import random 
random.seed(2) 
print [random.randint(0,255) for i in xrange(5)] 

返回[244, 242, 14, 21, 213]每次運行腳本。

這就是爲什麼如果你seed的隨機數發生器的具體值爲k,它會給你一個非常具體的隨機數列表,它可以用來編碼給定的文件,然後解碼它。

第二個問題 - 是的。它一次處理一個字節,因此有256個不同的值。

第三個問題 - 是的,它計算出一個字符的字符串每次整數序號。它和bytearr = [ ord(c) for c in f1.read() ]一樣 - 一次讀取一個字符並創建一個值(0-255)。

最後 - 見上。

和公正的兩個迴路一個Python的提示......如果你遍歷數組,你可以使用

for c in bytearr: 

然後用c代替

for i in range(len(bytearr)): 

,並使用bytearr[i]

因此,舉例來說:

for c in bytearr: 
    byt = (c + random.randint(0, 255)) % 256 
    f2.write(chr(byt)) 

你的問題:當我使用微微打開解密文件,這是爲什麼IM看到奇怪的字符?他們不應該只是一些隨機的字母和數字嗎?

號看here。有2 * 26 = 52個字母,10個數字,一些打印的字符和一些不可打印的字符(換行符,標籤,...)。您在「小數」值(0-255)編碼/解碼和你微微顯示您在「字符」一欄中的字符。

+1

+1速度!我唯一要補充的是,unicode與它無關:文件以二進制模式打開並進行處理。 – DSM 2011-02-07 15:23:28