zoukankan      html  css  js  c++  java
  • 教你用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()

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

  • 相关阅读:
    HDU 5818 Joint Stacks
    HDU 5816 Hearthstone
    HDU 5812 Distance
    HDU 5807 Keep In Touch
    HDU 5798 Stabilization
    HDU 5543 Pick The Sticks
    Light OJ 1393 Crazy Calendar (尼姆博弈)
    NEFU 2016省赛演练一 I题 (模拟题)
    NEFU 2016省赛演练一 F题 (高精度加法)
    NEFU 2016省赛演练一 B题(递推)
  • 原文地址:https://www.cnblogs.com/smallfoxdog/p/8609614.html
Copyright © 2011-2022 走看看