• 教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)


           因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧。

    一、加密原理

           记得当时我学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()

           大家也来写一个属于自己的加密小程序吧^_^。加密和解密可以优化在一个方法里面,之前一开始想的采用一开始的加法进行加密,减法进行解密,最后还是采用了异或加密所以加密和解密就一样了,大家可以优化一下代码哦。也可以使用其他方式试试哦,欢迎一起交流^_^

  • 相关阅读:
    穷举 百鸡百钱
    for嵌套for ★
    纸张的厚度循环
    MySQL架构由小变大的演变过程
    MySQL数据库主从复制实践
    想要写出高性能sql语句,你得记住这些……
    Mongodb常用的性能监控命令
    Mongodb的mongostat命令
    Windows下MongoDB常用命令
    Windows下Mysql常用操作命令
  • 原文地址:https://www.cnblogs.com/smallfoxdog/p/8609614.html
Copyright © 2020-2023  润新知