用于文件加密和解密的Python脚本
我在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 个回答
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显示的是'字符'列中的字符。