python实现可逆简单的加密算法


Posted in Python onMarch 22, 2019

最近想把word密码文件的服务器密码信息归档到mysql数据库,心想着如果直接在里面写明文密码会不会不安全,如果用sha这些不可逆的算法又没法还原回来,所以自己就想着用Python写一个小代码,先把明文密码加密之后再存mysql表中。下面贴出我的Python代码:

首先是加密encript.py

# coding:utf-8
def encrpt(s):
 length = len(s)
 j = ""
 for i in s:
  if ord(i) <= 49:
   i = chr(ord(i) + length)
   j = j + i
  elif ord(i) > 81 and ord(i) <= 126:
   i = chr(ord(i) - length)
   j = j + i
  else:
   j = j + chr(32) + i
 return j
 
 
s = raw_input("请输入6到16位的密码:")
enscript_s = ""
if len(s) < 6 or len(s)>16:
 print ("密码长度不符合")
if len(s) == 0:
 print ("密码不能为空")
for i in s:
 if ord(i) < 33 and ord(i) > 126:
  print ("非法字符")
 
if len(s) >= 6 and len(s) <= 16:
 enscript_s = encrpt(s)
 print enscript_s

注意,我这里限定了加密6到16位密码,下面说说我的思路:

首先,输入6到16位密码,然后判断这些密码符不符合规定的字符,当然我认为这里我的判定还不够完善,ord函数获取每一个字符对应的十进制ASCII码。大家可以翻看ASCII码表,ASCII码十进制33到126,包含了大小写字母,数字和特殊标点等内容,我认为密码字符就是应该在这些范围内的,然后我执行了encrpt(s)函数,这里的详细说下这个函数,加密的原理就是密码中的字符这里假定ASCII码小于等于49的将该字符和字符长度相加作为新的字符密码的ASCII码,然后调用chr函数将这个新的ASCII码转换成字符格式,大家可以对照着ASCII码表设。而下面的ASCII码大于81,少于126的范围是跟上面的49相关的,因为最大是16位长度,如果49+16那么这个值就是65,而33(上面说明了输入的密码应该包含大小写字母,数字和特殊标点等内容,这个范围是从ASCII为33,也就是感叹号的开始)+6=39,也就是小于等于49的字符转换的范围是39~65;另一方面,对于ASCII码范围在81~126的,我们将其减去密码长度作为新的字符密码,那么同理81-16=65,126-6=120,也就是新的字符密码的ASCII码范围刚好在66~120之间,这个就保证和加密后的字符一定不会和上面条件为49的加密的字符的ASCII码重复;另外,这里对于49~80这里的字符段我所做的处理是直接按照原来的字符,并且在字符的左手边插入了一个空格字符,就是 j = j + chr(32) + i这句话实现的,这个空格字符作为我们没有处理的字符的标记,后面解密会用到。

下面是解密代码,decript.py

# coding:utf-8
def decrpt(s):
 length1 = len(s)
 length2 = len(s.replace(" ", ""))
 j = ""
 for i in range(length1):
  if s[i] is None:
   continue
  if ord(s[i-1]) == 32: 
   j = j + s[i]
   continue
  elif ord(s[i]) >= 33 and ord(s[i]) <= 65:
   j = j + chr(ord(s[i]) - length2)
   continue
  elif ord(s[i]) > 65 and ord(s[i]) <= 126:
   j = j + chr(ord(s[i]) + length2)
   continue
 return j
 
s = raw_input("请输入6到16位的密码:") 
descript_s = ""
if len(s) < 6 or len(s)>32:
 print ("密码长度不符合")
if len(s) == 0:
 print ("密码不能为空")
for i in s:
 if ord(i) < 1 and ord(i) > 127:
  print ("非法字符")
if len(s) >= 6 and len(s) <= 32:
 descript_s = decrpt(s)
 print descript_s

可以看到len(s) >= 6 and len(s) <= 32,我这里限定了字符的长度可以到32位,是因为刚才加密可能会产生空格标记字符,这样长度就会超过限定的16位密码字符了,然后我们关注decrpt这个函数,里面我获取了两个长度length1和length2,length1是密文(包括加密时插入的空格字符标记),length2是原来明文的实际长度(只要将加密时的空格字符标记去掉就可以算出来),然后下面的解密条件也是和加密的条件一一对应的,重点说下

if ord(s[i-1]) == 32: 
            j =  j + s[i]
            continue

这个,这里我们刚才加密插入的空格字符标记就有用了,刚才加密的时候如果是没有处理的明文密码是会在字符左边插入空格字符的(ASCII码32),然后在读到这个没有处理的字符时,我们检查前一个字符是否是空格字符,如果是证明这个字符没有经过加密,所以也不用解密了。这里为什么要插入这个空格字符呢,这里假定我们有一个明文字符对应的ASCII码是70(字符F),那么根据刚才加密的条件,ASCII码在49到80之间是不会加密的,还是按照原来的字符,但是我们解密的时候,条件规定了ASCIII码在33与74之间是要减去密码长度的,这样就没法得出正确的字符了,这里可能有疑问,为什么加密的时候设定条件中ASCII码49-80之间是断开的,解密的时候怎么33~74和74~126连续起来了,这里是因为加密时候ASCII码是49~80这一段的确没有处理,但是一旦加上字符的长度,解密范围就会变大,例如加一个最大长度的字符49+16=65,解密的时候就要在65的范围内,所以范围就增大了。

最后附上测试图:

加密

python实现可逆简单的加密算法

解密

python实现可逆简单的加密算法

测试后我们就可以把" Gpan8lY7;-"这个加密后的字符串粘贴到mysql表中,注意,粘贴的时候别漏了G字母左边是有个空格标记的,表示G这个字符没有被加密。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中运行并行任务技巧
Feb 26 Python
深入理解Python单元测试unittest的使用示例
Nov 18 Python
python通过伪装头部数据抵抗反爬虫的实例
May 07 Python
Python中判断输入是否为数字的实现代码
May 26 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
python3去掉string中的标点符号方法
Jan 22 Python
python爬取微信公众号文章的方法
Feb 26 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
Python SMTP发送电子邮件的示例
Sep 23 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
Python自动操作神器PyAutoGUI的使用教程
Jun 16 Python
python实现字符串加密 生成唯一固定长度字符串
Mar 22 #Python
详解Python循环作用域与闭包
Mar 21 #Python
浅谈python之高阶函数和匿名函数
Mar 21 #Python
浅谈Python反射 &amp; 单例模式
Mar 21 #Python
详解Python中is和==的区别
Mar 21 #Python
浅谈Python的条件判断语句if/else语句
Mar 21 #Python
python使用thrift教程的方法示例
Mar 21 #Python
You might like
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python中partial()基础用法说明
2018/12/30 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
python 通过文件夹导入包的操作
2020/06/01 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
促销活动策划方案
2014/01/12 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
学校教师安全责任书
2014/07/23 职场文书
环境保护建议书
2014/08/26 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android