md5加密解密代码_Python内置方法实现基于秘钥的信息加解密

点击关注州的先生 精彩不容错过

在实际编程开发中,我们会使用到各类的加密算法来对数据和信息进行加密。比如密码中比较常见的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)
运行上述代码,我们会得到如下图所示的结果:

51e460c651bcc89ba5b7f54ce0b8a734.png

最后

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

▼点击“

万水千山总是情,点个“在看”行不行▼ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实参将数据传递给形参的两种形式

java实参将数据传递给形参的两种形式 /*** java实参将数据传递给形参的两种形式* 1,按值传递* 2,按引用传递* * 当参数是基本数据类型时,数据不占用堆内存,按值传递* 当参数是引用类型时,数据占用堆内存,按…

python css和xpath_Selenium系列教程(四)css、xpath定位(基于 Python)

#!/usr/bin/env pythonimporttimefrom selenium importwebdriverdriverwebdriver.Chrome()driver.get("http://localhost:63342/webtest/demo.html")#节点driver.find_element_by_xpath("/html/body/div") #绝对路径,从根节点开始,一…

论java中可变参数

论java中可变参数 /*** ...可变参数* 当... 作为形参时,传入的实参是可变的* 在方法体内部,仍然可将可变参数当成数组使用* 如果传入的实参是多个单独的变量,程序会自动将多个单独的变量放入数组** 可变参数的好处* 1,传入数组ok…

mplab x ide 中文使用手册_中文文档:MPLAB ICD 4在线调试器用户指南

MPLAB ICD 4在线调试器用户指南MPLAB ICD 4在线调试器(DV164045)是Microchip最快且最经济高效的调试和编程工具,适用于Microchip PIC、dsPIC闪存和CEC(基于ARM Cortex-M4)单片机。可与功能强大且拥有易于使用的图形用户界面的MPLAB X集成开发环境(IDE)配合使用&…

java定义一个方法计算三角形,长方形,圆形面积和周长

java定义一个方法计算三角形,长方形,圆形面积和周长 /*** 定义一个方法,返回一个圆的周长 半径* 定义一个方法,返回一个圆的面积 半径* 定义一个方法,返回一个矩形的周长 长 宽* 定义一个方法,返回一个…

python可以处理多大的数据_科多大数据之Python基础教程之Excel处理库openpyxl详解...

原标题:科多大数据之Python基础教程之Excel处理库openpyxl详解科多大数据小课堂来啦~Python基础教程之Excel处理库openpyxl详解openpyxl是一个第三方库,可以处理xlsx格式的Excel文件。pipinstallopenpyxl安装。读取Excel文件需要导入相关函数fromopenpyx…

java练习(数组工具类的封装)[目前写过最长的代码,虽然不难]

java练习&#xff08;数组工具类的封装&#xff09;[目前写过最长的代码&#xff0c;虽然不难] package myUtil.arrayUtil;public class ArraysUtil {/*** 升序排列一个byte数组* param arr 要排列的byte数组*/public static void sortASC(byte[] arr){for (int i 0;i<arr…

python center函数对齐方式_Python如何对齐字符串

问题你想通过某种对齐方式来格式化字符串解决方案对于基本的字符串对齐操作&#xff0c;可以使用字符串的ljust(), rjust()和 center()方法。比如&#xff1a;>>> text Hello World>>> text.ljust(20)Hello World >>> text.rjust(20) Hello World&…

python新奇检测_3种Python检测URL状态

需求&#xff1a;Python检测URL状态&#xff0c;并追加保存200的URL代码一&#xff1a;#! /usr/bin/env python#codingutf-8import sysimport requestsdef getHttpStatusCode(url):try:request requests.get(url)httpStatusCode request.status_codereturn httpStatusCodeexc…

java面向对象第一课,定义类,模拟人的行为:吃饭工作休息

java面向对象第一课&#xff0c;定义类&#xff0c;模拟人的行为&#xff1a;吃饭工作休息 /*** 定义类&#xff0c;模拟人的行为&#xff1a;吃饭工作休息*/ public class Person {//静态特征&#xff1a;成员变量 属性 fieldString name; //姓名int age; //年龄//动态…

java使用计算器完成加法、减法运算

java使用计算器完成加法、减法运算 package demo03;/*** 使用计算器完成加法、减法运算*/ public class Calculator {//成员变量private String brand; //品牌private double size; //尺寸//成员方法//加法public int add(int num1,int num2){int result;result num1nu…

python上传文件到onedrive_基于Python的onedrive文件本地化浏览系统–PyOne

基于Python的onedrive文件本地化浏览系统–PyOnePyOne是一款基于Python-Flask的onedrive文件本地化浏览系统&#xff0c;使用MongoDB储存文件列表&#xff0c;使用redis缓存数据&#xff0c;支持绑定多个网盘&#xff0c;极大的提高使用效率。特性简单易用。只需简单设置&#…

warshall算法求传递闭包c++_【建模小课堂】图论算法

图论算法图论算法在计算机科学中扮演着很重要的角色&#xff0c;它提供了对很多问题都有效的一种简单而系统的建模方式。很多问题都可以转化为图论问题&#xff0c;然后用图论的基本算法加以解决。这类问题算法主要包括Dijkstra&#xff0c;Floyd&#xff0c;Prim&#xff0c;最…

java日常笔记

java日常笔记 构造方法 对于一个类来说&#xff0c;一般有三种常见的成员&#xff1a;属性field、方法method、构造器constructor构造方法也叫构造器&#xff0c;用于对象的初始化。构造器是一个创建对象时被自动调用的特 殊方法&#xff0c;目的是对对象的初始化。构造器的名…

java定义计算机类并模拟其操作

java定义计算机类并模拟其操作 /*** 定义计算机类并模拟其操作*/ public class Computer {//成员变量private String cpu "Intel"; // cpuprivate String memory; //内存private String mainBoard; //主板private String keyBoard; //键盘//构造方法public…

python 字典组成的列表_python - 合并多列表组成一个字典

问 题我把原始问题简化一下&#xff0c;希望各位大大帮忙有2个等长list&#xff1a;idlist [id1,id2,id3,id4,id5]userlist [name1,name2,name3,name4,name5]希望合并成以下形式的字典&#xff1a;dict_user {{id:id1, name:name1},{id:id2, name:name2},{id:id3, name:name…

java日常笔记、对象的创建完全是由构造方法实现的吗?this的本质

java日常笔记、对象的创建完全是由构造方法实现的吗 不完全是构造方法是创建java对象重要途径&#xff0c;通过new关键字调用构造器时&#xff0c;构造器也确实返 回了该对象&#xff0c;但这个对象并不是完全由构造器负责创建的&#xff0c;创建一个对象分 如下四步&#xff…

遗传算法python实现_Python遗传算法代码实例讲解

目录实例&#xff1a;求解函数的最大值yxsin(10x)xsin(2x),自变量取值&#xff1a;0--5&#xff0c;用Python画出的图像如下(注&#xff1a;此代码好像有一些感觉不对的地方&#xff0c;首先:没有保留那些适应度低的个体pop select(pop, fitness) 这一行代码&#xff0c;压根就…

java对象数组

java对象数组 /*** 对象数组*/ public class TestArray {public static void main(String[] args) {//定义一个数组&#xff0c;存储4个分数&#xff0c;并遍历int[] arr;arr new int[4];arr[0] 90;arr[1] 80;arr[2] 100;arr[3] 54;for (int score:arr){System.out.print…

python删除列表元素的所有方法_python 列表删除所有指定元素的方法

python 列表删除所有指定元素的方法如下所示&#xff1a;a [1,1,1,2,3,45,1,2,1]a.remove(1)result: [1,1,2,3,45,1,2,1]while 1 in a:a.remove(1)result: [2,3,45,2]以上这篇python 列表删除所有指定元素的方法就是小编分享给大家的全部内容了&#xff0c;希望能给大家一个参…