网络编程
位置:首页>> 网络编程>> Python编程>> 用Python制作一个文件加密器

用Python制作一个文件加密器

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

标签:python,文件,加密

前言

因为一些懂得都懂的原因,我的父母对于我电脑上的文件内容特别感兴趣。为了防止信息泄露,我连夜用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

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com