【网络安全】【密码学】常见数据加(解)密算法及Python实现(一)

一、Base64编码

1、算法简介

Base64是一种常见的编(解)码方法,用于传输少量二进制数据。该编码方式较为简短,并不具有可读性,对敏感数据可以起到较好的保护作用。

2、Python实现(调库)

(1)Base64编码

import base64
s = "this is a string"
b64s = base64.b64encode(s.encode("utf-8"))
print(b64s)

(2)Base64解码

import base64
s2 = "dGhpcyBpcyBhIHN0cmluZw=="
b64s2 = str(base64.b64decode(s2), "utf-8")
print(b64s2)

(3)说明

语句b64s = base64.b64encode(s.encode("utf-8"))b64s2 = str(base64.b64decode(s2), "utf-8")分别进行Base64 编码和解码 操作。注意先使用 utf-8格式进行编码。上述的编、解码过程可以用下图简要表示:

在这里插入图片描述

二、数据加密标准(DES)

1、算法简介

数据加密标准(Data Encryption Standard, DES)是美国早期(2001年以前)使用最为广泛的数据加、解密算法,属于分组加密算法。DES采用64位的分组长度和56位的密钥(有意思的是,算法需要提供64位的密钥,但仅采用前56位),输出对应64位的密文。DES算法的具体实现过程较为复杂,在此不做过多叙述。

2、Python实现(调库)

(1)密钥长度设置

密钥长度必须为8byte,不能多也不能少。下图为密钥长度设置错误时的报错:

理论上的7比特(56位)密钥:

在这里插入图片描述

9比特(72位)密钥:

在这里插入图片描述

(2)DES加密

Python代码:

from Crypto.Cipher import DES  
import binascii
key = b'abcdefgh'
des = DES.new(key, DES.MODE_ECB)
text = 'this is a string'
print(len(text))
text = text + (8 - (len(text) % 8)) * '='
print(len(text))
encrypt_text = des.encrypt(text.encode())
encryptResult = binascii.b2a_hex(encrypt_text)
print(text)
print(encryptResult)

运行结果:

在这里插入图片描述

(3)DES解密

Python代码:

import binascii
key = b'abcdefgh'
des = DES.new(key, DES.MODE_ECB)
encryptResult = b'730540c787dff6be88ec1b4f05a333c2cfdc71016f18c092'
encrypto_text = binascii.a2b_hex(encryptResult)
decryptResult = des.decrypt(encrypto_text)
print(decryptResult)
print(len(encryptResult))

运行结果:

在这里插入图片描述

(4)说明

语句text = text + (8 - (len(text) % 8)) * '='的作用是使用 “=” 将明文填充为64bit(即8byte)的整数倍。上述的加、解密过程可以用下图简要表示:

在这里插入图片描述

三、高级加密标准(AES)

1、算法简介

高级加密标准(Advanced Encryption Standard, AES)是一种对称分组密码(明、密文分组长度为128位16字节)算法,于2001年被提出,取代了数据加密标准(上文中的DES)成为最广泛的数据加(解)密算法之一。AES算法的具体过程较为复杂,在此不做赘述。

2、Python实现(调库)

(1)密钥长度设置

AES的密钥长度可以为 128192256 (bits),即 162432 (bytes). 本文中,使用简短的16 bytes 密钥。

(2)AES加密

Python代码:

from Crypto.Cipher import AES
import binascii
key = b'abcdefghabcdefgh'
print(len(key))
text = "this is a string"
print(len(text))
text = text + (16 - (len(text) % 16)) * '='
print(len(text))
aes = AES.new(key, AES.MODE_ECB)
encrypto_text = aes.encrypt(text.encode())
encryptResult = binascii.b2a_hex(encrypto_text)
print(text)
print(encryptResult)
print(len(encryptResult))

运行结果:

在这里插入图片描述

(3)AES解密

Python代码:

from Crypto.Cipher import AES
import binascii
key = b'abcdefghabcdefgh'
encryptResult = b'56eebd2bcb700df0e89aadc2a1a2f3392c8d860b9688361b9e9ceff6272f581c'
aes = AES.new(key, AES.MODE_ECB)
encrypto_text = binascii.a2b_hex(encryptResult)
decryptResult = aes.decrypt(encrypto_text)
print(decryptResult)

运行结果:

在这里插入图片描述
(4)说明

语句text = text + (16 - (len(text) % 16)) * '='的作用是使用 “=” 将明文填充为128bit(即16byte)的整数倍。上述的加、解密过程可以用下图简要表示:

在这里插入图片描述

四、讯息摘要算法(MD-5)

1、算法简介

严格意义上讲,MD系列算法属于消息摘要(哈希,Hashing)算法,只有“加密”过程而没有“解密”逆过程。MD-5算法将任意的字符串(消息)转化为固定长度(64位,8字节)的哈希段,用于检验消息(在传输过程中)的完整性(Integrity, I性)。

2、Python实现(调库)

Python代码:

from hashlib import md5


def encrypt_md5(s):
    new_md5 = md5()
    new_md5.update(s.encode(encoding='utf-8'))
    print(len(new_md5.hexdigest()))
    return new_md5.hexdigest()


if __name__ == '__main__':
    print(encrypt_md5('this is a string'))

运行结果:

在这里插入图片描述

图示:

在这里插入图片描述

五、参考文献

1、《密码编码学与网络安全——原理与实践(第七版)》(Cryptography and Network Security, Principles and Practice, Seventh Edition),【美】威廉 斯托林斯 William Stallings 著,王后珍等 译,北京,电子工业出版社,2017年12月。

2、《Python安全攻防——渗透测试实战指南》(Attack and Defense with Python, A Practical Guide to Penetration Testing),MS08067安全实验室 编著,北京,机械工业出版社,2021年10月。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一道算法题day-one(备战蓝桥杯)

从今天开始博主会每天做一道算法题备战蓝桥杯,并分享博主做题的思路,有兴趣就加入我把! 算法题目: 有一个长度为 N 的字符串 S ,其中的每个字符要么是 B,要么是 E。 我们规定 S 的价值等于其中包含的子…

C++模板(泛型)

1. 模板 1.1 知识点 模板:template 泛型编程: 是指数据的类型是广泛,任意的数据类型 模板:可以将一个函数或类描述成一个模板,例如:画画,给一个人物模型上色彩,根据用户上的色彩是什…

Bean如何诞生与消亡:生命周期探秘【beans 二】

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Bean如何诞生与消亡:生命周期探秘【beans 二】 前言bean的创建过程bean的初始化阶段1. 实现InitializingBean接口:2. 使用PostConstruct注解: bean的属性注入1. Set…

视频倒放软件,看视频如何演绎“逆袭”之旅

你是否厌倦了日复一日的平淡生活,渴望时光倒流,重温那些逝去的精彩瞬间?在数字技术的世界里,这样的愿望或许不再遥不可及。视频倒放仿佛让时光倒流,给我们的视觉带来了全新的冲击,今天,让我们一…

新手第一次在linux上用git上传代码到仓库全过程

目录 背景: 过程: -1.去github.com自己的账号先建个仓库repository 0.命令行输入 git version 看下有无安装git 1.git init 初始化了一个Git仓库,你可以 ls -a 看见这个隐藏的目录 3.git add . 添加要上传的文件到Git的暂存区&#xff0…

windows对微信及小程序抓包:Burp+Fiddler+Proxifier

本文由掌控安全学院 - zbs 投稿 话不多说,直接先上个效果图: 新新的版本哈; 好好的抓包哈; 然后直接说我如何配置的: 准备好三个工具:bp、fiddler、proxifier【也可以用其他的进行代理】 bp、proxifie…

ELement UI时间控件el-date-picker误差8小时解决办法

一、问题描述&#xff1a; 在项目中引用了elementui中的date-picker组件&#xff0c;选中的时间跟实际相差八小时&#xff0c;且格式不是自己想要的格式 <el-date-pickertype"date"placeholder"选择日期"format"yyyy/M/d"v-model"form…

R304S 指纹识别模块的硬件接口说明

一.外部接口尺寸图 二.串行通讯 R304S 指纹模块通讯接口定义&#xff1a; 引脚号名称定义描述15V电源输入电源正输入端 DC 4.2--6V2GND电源和信号地电源和信号地3TXD数据发送串行数据输出&#xff0c;TTL 逻辑电平4RXD数据接收串行数据输入&#xff0c;TTL 逻辑电平 三.USB通…

EtherCAT的COE报文

本文主要用于记录工作中需要学习的内容&#xff0c;如有冒犯请私信&#xff01; COE协议 下面我们介绍以下CANOpen在EtherCAT中的应用。 COE的对象字典 COE协议是完全遵循CANopen协议的&#xff0c;但针对EtherCAT通信做了一些扩展&#xff0c;索引为0x1c00~0x1c4f&#xff0…

Java中关键词strictfp有什么作用?

在Java中&#xff0c;关键词strictfp用于声明一个方法、类或接口是严格遵守浮点数计算规范的。 具体作用包括&#xff1a; 保证浮点数计算的结果在不同平台上是一致的&#xff0c;避免由于浮点数计算的不精确性导致的结果不确定性。 指定了严格的浮点数计算规则&#xff0c;禁…

LeetCode刷题---矩阵置零

解题思路&#xff1a; 本题要求原地置换元素 对矩阵进行第一轮遍历&#xff0c;使用第一行第一列来充当该行该列是否要置换为0的标记位&#xff0c;如果第一行或第一列本身就含有零元素&#xff0c;我们使用colZero和rowZero变量来对其标记。如果第i行第j列的那个元素为0&#…

产品经理如何选择城市?

年底&#xff0c;全国性的人口大迁徙即将开始。选择城市&#xff0c;堪称年轻人的“二次投胎”&#xff0c;族望留原籍&#xff0c;家贫走他乡。 古人在选择城市时&#xff0c;主要的考量因素是家族势力&#xff0c;这一点放在当代&#xff0c;大致也成立&#xff0c;如果在老…

Cell 文章图复现

多组差异火山图复现 参考文章: A Spatiotemporal Organ-Wide Gene Expression and Cell Atlas of the Developing Human Heart Figure 2. H 图里主要是单细胞数据不同cluster之间的差异火山图, 所以说白了就是散点图和柱状图的结合, 散点图用差异基因绘制, 柱状图利用logFC最…

关于MIPS上手应知应会-如何把C语言改写为MIPS!

文章目录 寄存器指令使用技巧翻译C/Cif/else语句switch语句for循环while 循环do...while循环一维数组定义与使用二维数组定义与使用例 &#xff1a;哈密顿回路 注意立即数被符号位扩展 参考链接 寄存器 NameReg. NumUsage z e r o zero zero0constant value 0(恒为0) a t at a…

TypeScript Array(数组)

目录 1、数组初始化 2、Array 对象 3、数组迭代 4、数组在函数中的使用 4.1、作为参数传递给函数 4.2、作为函数的返回值 5、数组方法 数组对象是使用单独的变量名来存储一系列的值。数组非常常用。假如你有一组数据&#xff08;例如&#xff1a;网站名字&#xff09;…

Java中的IO与NIO篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、信号驱动 IO 模型二、异步 IO 模型三、JAVA NIO四、NIO 的缓冲区前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、…

P1423 小玉在游泳python

s float(input()) sum 0 step 0 meter 2.0 while sum < s:sum metermeter 0.98 * meterstep 1 print(step)

三、C语言中的分支与循环—switch语句(4)分支结构 完

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结构的…

linux创建pyspark虚拟环境

一、创建虚拟环境 conda create -n test python3.6.6 二、注意添加镜像 vi /root/.condarc channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/- http://mirrors.ustc.edu.cn/anaconda/pkgs/ma…

jmeter使用心得(一)

jmeter作为接口测试的常用工具之一&#xff0c;在我们的测试中经常会用到&#xff0c;往期的文章中&#xff0c;我们也分享过jmeter的各种功能和用法&#xff0c;基本覆盖了方方面面&#xff0c;可以满足各种接口测试的需求。但实际测试中我们也会发现&#xff0c;jmeter这么强…