用Python制作一个文件加密器

作者:漫路在线 时间:2023-01-16 02:41:05 

前言

因为一些懂得都懂的原因,我的父母对于我电脑上的文件内容特别感兴趣。为了防止信息泄露,我连夜用Python做了一个文件加密器,防止我的重要信息被泄露。

用Python制作一个文件加密器

下载地址

github:https://github.com/13337356453/FileCipher

GitHub上的资源是Python源代码

效果预览

为了方便操作,我用PyQt做了窗口。运行起来是这样的。

用Python制作一个文件加密器

用Python制作一个文件加密器

用Python制作一个文件加密器

加密效果还是很不错了

加密算法

对于我来说,程序中gui的编写算比较简单。困难的是加密算法的编写。

先把密码的代码贴出来,在详细讲解。

class Cipher:
   key = ""

def __init__(self, key):
       self.key = key

def setKey(self, key):
       self.key = key

def getKey(self):
       return self.key

def parseKey(self, key):
       # 处理密钥
       if key != "":
           o = 0
           for k in key:
               n = 0
               i = str(ord(k))
               for t in i:
                   n += int(t)
               o += n
           # 使密钥范围控制在10-100之间
           while True:
               if o < 10:
                   o = int(o * 2)
               elif o > 100:
                   o = int(o / 2)
               else:
                   return o
       return

def getOdd(self, max):
       return [i for i in range(1, max + 1) if i % 2 == 1]

def encrypt(self, data):
       # 加密算法
       if data == "":
           return
       result = ""
       length = len(data)  # 获取数据长度
       a = [ord(x) for x in data]
       # 判断是否为4的倍数
       remainder = length % 4  # 余数
       if remainder != 0:
           b = 4 - remainder
           for c in range(b):
               a.append(0)
       # 第一次分组
       groups = []
       d = len(a) // 2
       e1 = a[:d]
       e2 = a[d:]
       indexs = self.getOdd(d)
       groups.append([e1[i - 1] for i in indexs])
       groups.append([e1[i] for i in indexs])
       groups.append([e2[i - 1] for i in indexs])
       groups.append([e2[i] for i in indexs])
       # 第二次分组
       f1 = groups[0] + groups[3]
       f2 = groups[1] + groups[2]
       # 第一次加密
       keycode1 = self.parseKey(self.getKey())
       g = []
       for h in f1:
           i = h + keycode1
           j = chr(i)
           g.append(i)
           result += j
       # 第二次获取keycode
       k = str(sum(g))
       keycode2 = self.parseKey(k)
       # 第二次加密
       for l in f2:
           m = l + keycode2
           n = chr(m)
           result += n
       # 加密完成
       return result

def decrypt(self, data):
       # 解密算法
       if data == "":
           return
       result = ""
       # 获取keycode1
       keycode1 = self.parseKey(self.getKey())
       # 第一次解密
       a = len(data) // 2
       b1 = data[:a]
       b2 = data[a:]
       c = [ord(d) for d in b1]
       e = [f - keycode1 for f in c]
       # 获取keycode2
       g = str(sum(c))
       keycode2 = self.parseKey(g)
       # 第二次解密
       h = [ord(i) for i in b2]
       j = [k - keycode2 for k in h]
       # f1对应e , f2对应j
       # 第一次分组
       k = len(e) // 2
       group1 = e[:k]
       group4 = e[k:]
       group2 = j[:k]
       group3 = j[k:]
       # 第二次分组
       datalength = len(group1) + len(group2) + len(group3) + len(group4)  # 数据长度
       l = datalength // 4
       m = []
       for n in range(l):
           m.append(group1[n])
           m.append(group2[n])
       o=[]
       for p in range(l):
           o.append(group3[p])
           o.append(group4[p])
       # 数据拼接
       q=m+o
       for r in q:
           result+=chr(r)
       # 返回结果
       return result

大概的处理过程是这样的

用Python制作一个文件加密器

随便画的,大概就是这个流程,有什么错误也懒得管了

先将密钥进行处理,把密钥转化为ASCII,并且把所有数字相加得到和,通过乘除法将密钥的范围控制在10-100之间。
再处理数据,讲数据分为4组,不足位数用00补齐。分组之后再进行交叉分组。得到第二次分组的结果。对结果一利用密钥进行处理,得到数据一。再将结果一之和进行密钥处理,得到密钥二。
再对结果二利用密钥二进行处理,得到数据二。
拼接数据一和二,得到加密数据。

解密就是逆向操作了。

来源:https://blog.csdn.net/realmels/article/details/122964547

标签:python,文件,加密
0
投稿

猜你喜欢

  • Oracle SQL性能优化系列学习二

    2010-07-23 13:23:00
  • IDEA连接不上MySQL端口号占用的解决

    2024-01-24 14:49:21
  • 浅谈python中的多态

    2022-09-13 16:45:40
  • Python 中将值附加到集合的操作方法

    2022-01-06 15:09:54
  • 为MySQL创建高性能索引

    2024-01-19 09:22:32
  • 对Go语言中的context包源码分析

    2024-04-26 17:24:17
  • go mod 安装依赖 unkown revision问题的解决方案

    2024-05-09 14:59:34
  • python中@property和property函数常见使用方法示例

    2021-11-13 03:32:20
  • oracle行转列方法集合汇总(推荐!)

    2024-01-12 19:42:14
  • JavaScript实现网页动态生成表格

    2024-04-16 09:24:00
  • python类参数定义及数据扩展方式unsqueeze/expand

    2023-08-07 21:56:42
  • SpringBoot项目application.yml文件数据库配置密码加密的方法

    2024-01-18 02:12:40
  • 在Golang中使用C语言代码实例

    2024-05-25 15:15:46
  • 微软建议的ASP性能优化28条守则(5)

    2008-02-27 13:54:00
  • SQL Server特殊磁带备份及恢复设计

    2009-01-21 14:39:00
  • python使用Word2Vec进行情感分析解析

    2023-10-29 21:16:47
  • 新手该如何学python怎么学好python?

    2022-06-20 07:33:27
  • Redis中3种特殊的数据类型(BitMap、Geo和HyperLogLog)

    2024-01-24 11:20:47
  • JS 排序输出实现table行号自增前端动态生成的tr

    2024-06-16 05:07:50
  • asp随机产生注册用户密码

    2007-10-17 12:33:00
  • asp之家 网络编程 m.aspxhome.com