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

2 投票
1 回答
4824 浏览
提问于 2025-04-16 11:23

我在ActiveState上查看了一个Python的示例代码,发现了以下代码。我有四个问题,任何指导和解释都将非常感谢。

问题一:我不太明白为什么在代码的第一行“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

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]

所以,如果你用一个特定的 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打开解密后的文件时,为什么我看到的是奇怪的字符?难道它们不应该是一些随机的字母和数字吗?

不是的。看 这里。有2*26=52个字母,10个数字,还有一些可打印字符和一些不可打印字符(换行、制表符等)。你是在'十进制'值(0-255)上进行编码/解码,而你的pico显示的是'字符'列中的字符。

撰写回答