用于加密和解密文件的Python脚本

Nur*_*ura 2 python encryption cryptography

我正在通过其中一个处于活动状态的python配方,并找到了以下代码.我想出了以下4个问题.非常感谢任何指导和解释.

Q ::我无法弄清楚为什么在"k = long(sys.argv [2])"行的第一个位置从用户那里获取"密钥随机种子"?特别是因为,这个值'k'似乎没有在代码的后半部分使用?

其次,在加密和解密代码的部分,什么是声明"字节组[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()
Run Code Online (Sandbox Code Playgroud)

eum*_*iro 6

random.seed(k)将随机数生成器设置为某个状态,它将为相同的随机数提供相同的列表k.

import random
print [random.randint(0,255) for i in xrange(5)]
Run Code Online (Sandbox Code Playgroud)

每次运行脚本时都会返回不同的数字.

import random
random.seed(2)
print [random.randint(0,255) for i in xrange(5)]
Run Code Online (Sandbox Code Playgroud)

[244, 242, 14, 21, 213]每次运行脚本时返回.

这就是为什么如果您seed使用具有特定值的随机数生成器k,它将为您提供一个非常具体的随机数列表,可用于编码给定文件然后对其进行解码.

第二个问题 - 是的.它一次只能处理一个字节,因此有256个不同的值.

第三个问题 - 是的,它每次计算一个字符串的整数序数.它是一样的bytearr = [ ord(c) for c in f1.read() ]- 一次读取一个字符并创建它们的值列表(0 - 255).

最后 - 见上文.

只是两个循环的pythonic提示......如果迭代一个数组,你可以使用

for c in bytearr:
Run Code Online (Sandbox Code Playgroud)

然后用c而不是

for i in range(len(bytearr)):
Run Code Online (Sandbox Code Playgroud)

和使用bytearr[i].

所以,例如:

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

你的问题:当我用pico打开解密文件时,为什么我会看到奇怪的字符?它们不应该只是一些随机的字母和数字吗?

号看这里.有2*26 = 52个字母,10个数字,一些更多可打印字符和一些不可打印字符(换行符,制表符......).您在'十进制'值(0-255)上编码/解码,您的微微显示'char'列中的字符.