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中logging模块的用法实例
Sep 29 Python
浅谈Python单向链表的实现
Dec 24 Python
基于python的Tkinter实现一个简易计算器
Dec 31 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
Python网络编程之使用TCP方式传输文件操作示例
Nov 01 Python
python数据爬下来保存的位置
Feb 17 Python
python实现简单的tcp 文件下载
Sep 16 Python
pytorch中的 .view()函数的用法介绍
Mar 17 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中文本数据翻页(留言本翻页)
2006/10/09 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
python类定义的讲解
2013/11/01 Python
Python标准库之循环器(itertools)介绍
2014/11/25 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
深入学习Python中的装饰器使用
2016/06/20 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
Python 切分数组实例解析
2019/11/07 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
酒店销售经理岗位职责
2014/01/31 职场文书
差生评语大全
2014/05/04 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript