Python Script для шифрования и дешифрования файлов - PullRequest
2 голосов
/ 07 февраля 2011

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

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

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

В-третьих, "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()

1 Ответ

6 голосов
/ 07 февраля 2011

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

Ваш вопрос: Когда я открываю расшифрованный файл с помощью пико, почему я вижу странные символы? Разве они не должны быть просто случайными алфавитами и числами?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...