2011-02-07 2 views
2

Я прошел один из рецептов python в активном состоянии и нашел следующий код. Я задал следующие 4 вопроса. Будем очень благодарны за любые указания и объяснения.Python Script для шифрования и дешифрования файлов

Q :: Im не может точно понять, почему «ключевое случайное семя» взято у пользователя на первом месте в строке «k = long (sys.argv [2])»? тем более, что это значение «k», похоже, не используется в более поздней части кода?

Во-вторых, в части кода для шифрования и дешифрования, какова точная импликация оператора «bytearray [i] -random.randint (0,255)% 256"? означает ли это, что значения юникода каждого символа сдвигаются или смещаются во время шифрования и после дешифровки снова возвращаются к исходному значению?

В-третьих, «bytearray = map (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).

Последнее: см. Выше.

И только вещий намек на две петли ... если перебрать массив, вы можете использовать

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)) 

Ваш вопрос: , когда я открыть расшифрованный файл, используя пико, почему это им видеть странные символы? разве это не просто случайные алфавиты и цифры?

No. Look here. Есть 2 * 26 = 52 буквы, 10 цифр, еще несколько печатных символов и некоторые непечатаемые символы (новая строка, вкладка, ...). Вы кодируете/декодируете значение «decimal» (0-255), а ваш pico показывает вам символы в столбце «char».

+1

+1 для скорости! Единственное, что я добавил бы, это то, что unicode не имеет к этому никакого отношения: файл открывается в двоичном режиме и обрабатывается как таковой. – DSM

+0

Спасибо, eumiro! что решает большинство моих сомнений. Я все еще не понял, что делает «bytearr = map (ord, f1.read())» на самом деле? – Nura

+0

Спасибо @ DSM! Еще одна маленькая вещь .. Когда я открываю дешифрованный файл с помощью pico, почему это я вижу странные символы? разве это не просто случайные алфавиты и цифры? – Nura

Смежные вопросы