大家好,本篇文章主要讲的是用python实现超强的加密软件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
目录
前言
步骤
完整代码:
总结

前言
使用python做一个加密资料的软件,可加密应用程序、文件、压缩包等多种文件格式,不可直接加密文件夹,可以先用压缩包打包在加密。加密后的文件后缀不可乱改,否则解密会失败。程序内没有加入加密和解密成功的提示信息。

加密使用的是双层MD5加密

步骤
首先导入库

  1. import os
  2. import hashlib

读取文件与写入文件

  1. a = open(name_1, "rb") #读取文件
  2. b = open(data, "wb") #写入文件
  3. a.close() #保存退出
  4. b.close() #保存退出

使用ord进行编码,用bytes进行解码,内置索引进行循环读取密码,挨个读取进行编码写入,

  1. #加密及解密
  2. def Encryption_and_decryption():
  3. count = 0 #索引
  4. for now in a:
  5. for nowByte in now:
  6. newByte = nowByte ^ ord(password_data[count % len(password_data)]) #循环遍历出密码的ord值,单个循环
  7. count += 1
  8. b.write(bytes([newByte])) #转换
  9. Encryption_and_decryption()

用ord进行编码可以看到会出现一点问题,就是加密后的文件,如文本文件,如果加密的密码是‘qwer’,编码则会将q w e r分别用bytes编码为 113 119 101 114,然后把编码后的数字在循环内一个一个插入到文本内,进行代替,解密也是同样原理,但是有一个致命缺陷,就是假如你的密码是”qwer“,解码的时候输入一个密码 q 即可全部解码成功,这个是一个缺陷。

所以我使用MD5进行加密,然后再进行编码,MD5大家都知道,不同的MD5值是由不同的字母、数字、字符串组合进行转换而成,MD5也区分大小写,这也让我们的加密软件更安全一步

  1. hl = hashlib.md5()
  2. hl.update(password.encode(encoding='utf-8'))
  3. password_list = hl.hexdigest()

为了我们的资料,我将MD5进行了二次加密,用已经加密后的MD5值再次进行加密,然后将第一个MD5值和第二个MD5值进行组合(非相加),组成高强度的加密

  1. #使用MD5进行加密(双层加密)
  2. hl = hashlib.md5()
  3. hl.update(password.encode(encoding='utf-8'))
  4. password_list = hl.hexdigest()
  5. hl.update(password_list.encode(encoding='utf-8'))
  6. password_list2 = hl.hexdigest()
  7. password_data = password_list+password_list2

解码也是同样原理,将密码进行MD5加密再加密,然后进入文件进行编码转换,如果密码正确则文件不会有乱码,如果密码错误则文件内都是乱码,这个程序是没有解码和加密成功的提示。

由于路径多种多样,程序会因此运行错误,所以我用replace进行路径’\ /‘转换,把所有的’\‘和’\‘转换为’/‘,用于程序方便读取

  1. name_1 = name_1.replace("\\", "/") # 替换
  2. data = data.replace("\\", "/") # 替换

为了方便大家进行使用,提取进行程序的检测,检测是否存在该文件,或路径的错误

  1. if os.path.exists(name_1) == True:
  2. pass
  3. else:
  4. print('请检查是否路径错误或不存在该文件!!!!')
  5. os.system('pause')
  6. exit()

保存的路径不可缺少,如果保存的路径没有输入直接跳过则会默认为读取程序的位置,如果读取程序的路径也没有写入,则会以读取程序的根目录为存储地进行保存

  1. if name_1.split(".")[1][-4:] == 'DATA':
  2. F = name_1.split(".")[1].replace("DATA", "")
  3. if os.path.split(data)[0] == '':
  4. if os.path.split(name_1)[0] == '':
  5. data = os.path.split(name_1)[-1].split(".")[0] + '.' + F
  6. else:
  7. data = os.path.split(name_1)[0] + '/' + os.path.split(name_1)[-1].split(".")[0] + '.' + F
  8. else:
  9. data = data + '/' + os.path.split(name_1)[-1].split(".")[0] + '.' + F
  10. else:
  11. # 保存路径
  12. if os.path.split(data)[0] == '':
  13. if os.path.split(name_1)[0] == '':
  14. data = name_1.split(".")[1] # 后缀
  15. data = os.path.split(name_1)[-1].split(".")[0] + '.' + data + 'DATA'
  16. else:
  17. data = name_1.split(".")[1] # 后缀
  18. data = os.path.split(name_1)[0] + '/' + os.path.split(name_1)[-1].split(".")[0] + '.' + data + 'DATA'
  19. else:
  20. name_3 = name_1.split(".")[1] # 后缀
  21. data = data + '/' + os.path.split(name_1)[-1].split(".")[0] + '.' + name_3 + 'DATA'

这个程序加密后会在程序后缀出现DATA,这个是为了方便清楚的知道什么是已加密程序,而且还可以让软件程序检测是否是已经加密过的程序,方便解密。

完整代码:

  1. import os
  2. import hashlib
  3. print("-------------------------------------软件加密工具-------------------------------------")
  4. print("关注博主不迷路!!!\nhttps://jiangongfang.blog.csdn.net/\nhttps://blog.51cto.com/u_15449377")
  5. print("使用告知:\n【加密后的文件后缀会多出DATA,是为了方便软件检测,请勿乱改加密后的后缀名】")
  6. print("【保存文件默认路径 为加密文件或解密文件的当前目录,不是软件的当前目录】")
  7. print("【要加密或解密的文件命名不可有“./\”字符,否则会出错】")
  8. print("-------------------------------------软件加密工具-------------------------------------\n")
  9. name_1 = input('输入要加密或解密的文件名含后缀:')
  10. #判断是否存在该文件
  11. if os.path.exists(name_1) == True:
  12. pass
  13. else:
  14. print('请检查是否路径错误或不存在该文件!!!!')
  15. os.system('pause')
  16. exit()
  17. password = input('请输入要加密或解密的密码:')
  18. data = input('输入要保存文件的路径位置(可不填):')
  19. name_1 = name_1.replace("\\", "/") # 替换
  20. data = data.replace("\\", "/") # 替换
  21. if name_1.split(".")[1][-4:] == 'DATA':
  22. F = name_1.split(".")[1].replace("DATA", "")
  23. if os.path.split(data)[0] == '':
  24. if os.path.split(name_1)[0] == '':
  25. data = os.path.split(name_1)[-1].split(".")[0] + '.' + F
  26. else:
  27. data = os.path.split(name_1)[0] + '/' + os.path.split(name_1)[-1].split(".")[0] + '.' + F
  28. else:
  29. data = data + '/' + os.path.split(name_1)[-1].split(".")[0] + '.' + F
  30. else:
  31. # 保存路径
  32. if os.path.split(data)[0] == '':
  33. if os.path.split(name_1)[0] == '':
  34. data = name_1.split(".")[1] # 后缀
  35. data = os.path.split(name_1)[-1].split(".")[0] + '.' + data + 'DATA'
  36. else:
  37. data = name_1.split(".")[1] # 后缀
  38. data = os.path.split(name_1)[0] + '/' + os.path.split(name_1)[-1].split(".")[0] + '.' + data + 'DATA'
  39. else:
  40. name_3 = name_1.split(".")[1] # 后缀
  41. data = data + '/' + os.path.split(name_1)[-1].split(".")[0] + '.' + name_3 + 'DATA'
  42. a = open(name_1, "rb") #读取文件
  43. b = open(data, "wb") #写入文件
  44. #使用MD5进行加密(双层加密)
  45. hl = hashlib.md5()
  46. hl.update(password.encode(encoding='utf-8'))
  47. password_list = hl.hexdigest()
  48. hl.update(password_list.encode(encoding='utf-8'))
  49. password_list2 = hl.hexdigest()
  50. password_data = password_list+password_list2
  51. #加密及解密
  52. def Encryption_and_decryption():
  53. count = 0 #索引
  54. for now in a:
  55. for nowByte in now:
  56. newByte = nowByte ^ ord(password_data[count % len(password_data)]) #循环遍历出密码的ord值,单个循环
  57. count += 1
  58. b.write(bytes([newByte])) #转换
  59. Encryption_and_decryption()
  60. a.close()
  61. b.close()
  62. os.system('pause')

可以看到已经加密的程序后缀有DATA,解密后会恢复原来的后缀名

以上就是本文全部内容,希望对你有所帮助

更多相关文章

  1. android 面向对象数据库 db40使用demo
  2. Android使用科大讯飞实现语音播报、语音识别功能
  3. SQL Server误区30日谈 第8天 有关对索引进行在线操作的误区
  4. MSSQL数据加密解密代码
  5. 透明数据加密(TDE)库的备份和还原
  6. sqlserver中将varchar类型转换为int型再进行排序的方法
  7. Android(安卓)LiveData Transformations
  8. 修改 Android(安卓)开机 LOGO
  9. Android的按键处理

随机推荐

  1. 帮助相对路径链接到本地​​文件
  2. html文件上传到vss上面后文件大小改变
  3. 尘缘如水,伴随着似水年华如流云般划过天际
  4. 请问json文件在html head中以script的形
  5. 单选按钮和多选按钮的样式设置
  6. 标签滑块旋转木马不工作在引导4
  7. HTML meta charset应该是小写还是大写?
  8. 加载跨域的HTML页面AJAX
  9. HTML5,简单的注册页面
  10. HTML5中对于网络是否断开的检测.很有意思