Python内置方法实现字符串的秘钥加解密(推荐)


Posted in Python onDecember 09, 2019

在实际编程开发中,我们会使用到各类的加密算法来对数据和信息进行加密。比如密码中比较常见的MD5加密,以及AES加密等等。

对于密码认证来说,MD5加密是比较适合的,因为其不需要接触到明文的数据,只需要比对MD5加密后的哈希值就能判断数据是否一致;而对于一些在加密后进行解密的数据而言,AES则更加的常用。

在Python中实现AES算法需要借助的第三方库Crypto,其在各个操作系统上的安装方法有些许复杂,所以对于简单的使用有点杀鸡用牛刀的意思。在Mrdoc的开发过程中,我们就遇到了这样的问题。一方面不想为了一个小小的功能增加一个安装容易出错的第三方库,一方面又有对用户输入的第三方密码进行加密和解密的需求。最终,我们采用的Python内置的方法实现了。

一、设置一个秘钥

在这个秘钥加解密方案中,我们需要设置一个秘钥,用来对数据进行加密和解密。在Mrdoc中,我们借助Django项目中的SECRET_KEY变量来作为秘钥。原则就是,尽量复杂且长:

key = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd'

接下来对数据的加密和解密,我们都需要使用到这个秘钥。

二、对数据进行加密

我们的加密逻辑其实很简单,核心是一个Python内置方法ord(),这个方法用于返回一个单字节的ASCII码字符的Unicode码位。加密逻辑步骤如下:

1、创建一个空字符串变量,作为加密字符的初始值;
2、使用zip()方法同时遍历数据字符串和秘钥;
3、使用ord()方法分别获取遍历的数据字符和秘钥字符的Unicode码位,并将其相加,得到此数据字符的加密字符;
4、将得到的加密字符追加到空字符串变量中;
5、返回最终的空字符串变量;

其代码如下所示:

# 加密
def enctry(s):
 k = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd'
 encry_str = ""
 for i,j in zip(s,k):
  # i为字符,j为秘钥字符
  temp = str(ord(i)+ord(j))+'_' # 加密字符 = 字符的Unicode码 + 秘钥的Unicode码
  encry_str = encry_str + temp
 return encry_str

如果我们将字符串”zmister”使用这个加密方法进行加密,最终会得到如下所示的加密字符串:

'222_215_218_152_169_200_231_'

三、对数据进行解密

与加密的逻辑相反,我们需要把Unicode码位还原为单字节的ASCII码字符,这需要利用到Python的内置方法chr()。所以数据解密的步骤如下所示:

1、定义一个空的字符串变量,作为解密数据的初始值;
2、使用zip()方法同时遍历加密后的数据和秘钥;
3、将加密数据字符减去秘钥字符的Unicode码位,得到原始数据的Unicode码位,然后使用chr()方法将其还原为ASCII单字节字符;
4、将得到的解密字符追加到空字符串变量中;
5、返回解密字符

其代码如下所示:

# 解密
def dectry(p):
 k = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd'
 dec_str = ""
 for i,j in zip(p.split("_")[:-1],k):
  # i 为加密字符,j为秘钥字符
  temp = chr(int(i) - ord(j)) # 解密字符 = (加密Unicode码字符 - 秘钥字符的Unicode码)的单字节字符
  dec_str = dec_str+temp
 return dec_str

这样,我们就能把加密的数据解密出来。我们用一个完整的代码来测试一下:

# coding:utf-8
# @文件: utils.py
# @创建者:州的先生
# #日期:2019/12/8
# 博客地址:zmister.com

# 加密
def enctry(s):
 k = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd'
 encry_str = ""
 for i,j in zip(s,k):
  # i为字符,j为秘钥字符
  temp = str(ord(i)+ord(j))+'_' # 加密字符 = 字符的Unicode码 + 秘钥的Unicode码
  encry_str = encry_str + temp
 return encry_str

# 解密
def dectry(p):
 k = 'djq%5cu#-jeq15abg$z9_i#_w=$o88m!*alpbedlbat8cr74sd'
 dec_str = ""
 for i,j in zip(p.split("_")[:-1],k):
  # i 为加密字符,j为秘钥字符
  temp = chr(int(i) - ord(j)) # 解密字符 = (加密Unicode码字符 - 秘钥字符的Unicode码)的单字节字符
  dec_str = dec_str+temp
 return dec_str

data = "zmister.com"
print("原始数据为:",data)
enc_str = enctry(data)
print("加密数据为:",enc_str)
dec_str = dectry(enc_str)
print("解密数据为:",dec_str)

运行上述代码,我们会得到如下图所示的结果:

Python内置方法实现字符串的秘钥加解密(推荐) 

四、最后

可以发现,这个方法对于一般性的数据加解密而言,还是比较简单和便捷的,唯一需要考量的是秘钥的复杂性和安全性,如果有更好地实现方法,欢迎留言讨论:)

ps:Python利用字符串自带函数实现加密和解密

字符串自带的简单加密 

encode = str.maketrans('eilouvy','1234567')#加密方式 
words = 'iloveyou' 
encode_words = words.translate(encode)#按encode加密方式加密 
print(encode_words) #输出23461745 
dedoed = str.maketrans('1234567','eilouvy')#解密方式 
dedoed_words = encode_words.translate(dedoed)#按decode解密方式解密 
print(dedoed_words)#输出iloveyou

这种方式十分的简单,其中makestrans里面的两个参数的内容是一一对应的,解密只需要将映射方向转变一下就行。

总结

以上所述是小编给大家介绍的Python内置方法实现字符串的秘钥加解密,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python 调用DLL操作抄表机
Jan 12 Python
python计算牛顿迭代多项式实例分析
May 07 Python
Python基于pygame实现的弹力球效果(附源码)
Nov 11 Python
Python网络爬虫实例讲解
Apr 28 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
Pytorch 实现权重初始化
Dec 31 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
Jan 04 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
opencv-python 读取图像并转换颜色空间实例
Dec 09 #Python
opencv-python 提取sift特征并匹配的实例
Dec 09 #Python
python 多维高斯分布数据生成方式
Dec 09 #Python
使用python模拟高斯分布例子
Dec 09 #Python
使用python+whoosh实现全文检索
Dec 09 #Python
Python 实现顺序高斯消元法示例
Dec 09 #Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 #Python
You might like
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
doctype后如何获得body.clientHeight的方法
2007/07/11 Javascript
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
html数组字符串拼接的最快方法
2009/09/16 Javascript
js三种排序算法分享
2012/08/16 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
浅析vue-router原理
2018/10/19 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
用python实现百度翻译的示例代码
2018/03/09 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
解决echarts中饼图标签重叠的问题
2020/05/16 Python
python属于跨平台语言码
2020/06/09 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
函授大专自我鉴定
2013/11/01 职场文书
大学生活学习的自我评价
2013/12/03 职场文书
书法比赛获奖感言
2014/02/10 职场文书
工商管理专业自荐信
2014/06/03 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2014年信访工作总结
2014/11/17 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
孕妇病假条怎么写
2015/08/17 职场文书