因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧。
一、加密原理
记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这次既然学习了Python这个小练习当然不能放过(其实这个加密程序我用c++,java都写过可以说也算比较熟了)。加密原理就是循环读取文件每个字节,然后进行相应的加密运算后就是加密操作了,解密时候进行逆运算就是解密操作了。
比如我们读取文件的第一个字节数据是20(读取出来的每位数据为0~255,因为8位是1字节,所以二进制的00000000~11111111表示的无符号数字范围就是0~255了),加密我们可以选择在这个基础上加1,那么加密后的第1个字节就是21了,如果我们将所有字节加1,那么相当于文件进行了加密(需要注意的是如果是255的话加1会越界,所以边界值需要特殊处理,如256的话我们则直接写入0)。解密时候我们每个字节都减1即可(当然边界值需要自己处理,比如之前加密后的0,我们直接写入255)。当然这样解密是不是很容易就会破解那,所以我们可以定义一个字符串来进行加密,比如“123456”,我们第1个字节与1进行加密,第2个字节与2进行加密,到了第7个我们再与1加密进行,直到所有字节都循环与这个字符串加密完,这样是不是加大了破解的难度那?
当然我用的是异或加密算法,异或一个最神奇的地方莫过于不借助任何变量将2个变量的值交换了。比如
a=10 b=20 a^=b b^=a a^=b print(a) print(b) #输出 #20 #10
是不是很神奇呢,所以加密使用异或也可以很方便的进行加密和还原
二、程序效果演示
1.创建一个txt文件(当然图片,声音,所有格式文件都可以),这里方便演示我选择一个txt文件
2.运行写好的python脚本
加密后的文件是不是什么都看不出来了
3.进行解密(我们输入一次错误的密码,当然密码近似度越高,还原的内容就会越多,当然如果是图片或者声音那么你错一个都是无法播放的)
三、本汪写的加密源码(如有不足请指正)
1 #作者:smallfoxdog 小狐狸狗狗 2 #时间:2018年3月20日13:57:04 3 #功能:文件的加密和解密 4 5 import os 6 7 #主函数 8 def main(): 9 getInput() 10 11 #输入参数 12 def getInput(): 13 14 #获取操作的参数 15 while(True): 16 17 oper = input("请输入操作(e:加密 d:解密):") 18 19 if(oper=="e" or oper=="d"): 20 break 21 else: 22 print("输入有误,请重新输入!") 23 24 #获取文件密码 25 while(True): 26 27 password= input("请输入密码:") 28 29 if(len(password)==0): 30 print("密码不能为空!") 31 else: 32 break 33 34 #获取操作的文件路径 35 while(True): 36 37 path=input("请输入文件路径:") 38 39 try: 40 f_read = open(path,"rb") 41 except: 42 print("文件没有找到,请检查路径是否存在!") 43 else: 44 break 45 46 #进行加密或解密操作 47 if(oper=="e"): 48 encrypt(path,password) 49 elif(oper=="d"): 50 decrypt(path, password) 51 52 #加密 53 def encrypt(path,password): 54 55 #因为刚学可能有库可以直接获取这些信息吧,不过自己写个算法获取这些信息也没什么难度 56 fileFullName = path.split(os.path.sep)#os.path.sep为操作系统的文件分隔符 57 fileName = fileFullName[len(fileFullName)-1].split(".")[0] 58 fileSuffix = fileFullName[len(fileFullName)-1].split(".")[1] 59 60 # print("文件全名称:",fileFullName[len(fileFullName)-1]) 61 # print("文件名称:",fileName) 62 # print("文件后缀:",fileSuffix) 63 64 fileParent = path[0:len(path)-len(fileFullName[len(fileFullName)-1])] 65 newFileName="加密_"+fileFullName[len(fileFullName)-1] 66 newFilePath=fileParent+newFileName 67 68 # print("文件父路径:",fileParent) 69 # print("新的文件名称:",newFileName) 70 # print("新的文件全路径:", newFilePath) 71 72 f_read = open(path,"rb") 73 f_write = open(newFilePath,"wb") 74 75 count=0 #当前密码加密索引 76 77 #我们采用异或循环加密 78 for now in f_read: 79 for nowByte in now: 80 newByte=nowByte^ord(password[count%len(password)]) 81 count+=1 82 f_write.write(bytes([newByte])) 83 84 f_read.close() 85 f_write.close() 86 87 print("汪~文件加密完毕^_^") 88 89 #解密(因为我们采取的异或解密,所以其实和加密算法一样) 90 def decrypt(path, password): 91 # 因为刚学可能有库可以直接获取这些信息吧,不过自己写个算法获取这些信息也没什么难度 92 fileFullName = path.split(os.path.sep) # os.path.sep为操作系统的文件分隔符 93 fileName = fileFullName[len(fileFullName) - 1].split(".")[0] 94 fileSuffix = fileFullName[len(fileFullName) - 1].split(".")[1] 95 96 # print("文件全名称:", fileFullName[len(fileFullName)-1]) 97 # print("文件名称:", fileName) 98 # print("文件后缀:", fileSuffix) 99 100 fileParent = path[0:len(path) - len(fileFullName[len(fileFullName)-1])] 101 newFileName = "解密_" + fileFullName[len(fileFullName) - 1] 102 newFilePath = fileParent + newFileName 103 104 # print("文件父路径:", fileParent) 105 # print("新的文件名称:", newFileName) 106 # print("新的文件全路径:", newFilePath) 107 108 f_read = open(path, "rb") 109 f_write = open(newFilePath, "wb") 110 111 count = 0 # 当前密码加密索引 112 113 # 我们采用异或循环加密 114 for now in f_read: 115 for nowByte in now: 116 newByte = nowByte ^ ord(password[count % len(password)]) 117 count += 1 118 f_write.write(bytes([newByte])) 119 120 f_read.close() 121 f_write.close() 122 123 print("汪~文件解密完毕^_^") 124 125 main()
大家也来写一个属于自己的加密小程序吧^_^。加密和解密可以优化在一个方法里面,之前一开始想的采用一开始的加法进行加密,减法进行解密,最后还是采用了异或加密所以加密和解密就一样了,大家可以优化一下代码哦。也可以使用其他方式试试哦,欢迎一起交流^_^