文件加密和解密的Python脚本

2024-06-17 08:48:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在查看一个处于活动状态的python食谱时发现了以下代码。我提出了以下4个问题。非常感谢您的指导和解释。在

Q::我无法确切地理解为什么在“k=long”行的第一个位置从用户那里获取“key random seed”(系统argv[2] )”?尤其是因为,这个值'k'似乎没有在代码的后面部分使用?在

第二,在加密和解密代码部分,“bytearray[i]语句的确切含义是什么-随机.randint(0255)%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()

Tags: key代码lenifsysrandomlongf2
1条回答
网友
1楼 · 发布于 2024-06-17 08:48:22

random.seed(k)将随机数生成器设置为某种状态,即它将为相同的k传递相同的随机数列表。在

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

每次运行脚本时返回不同的数字。在

^{pr2}$

每次运行脚本时都返回[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))

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

不,看here。有2*26=52个字母,10位数字,一些可打印字符和一些不可打印字符(换行符、制表符等)。您对“十进制”值(0-255)进行编码/解码,pico将在“char”列中显示字符。在

相关问题 更多 >