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

news2024/11/29 2:48:39

一、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月。

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

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

相关文章

LRU的设计与实现(算法村第五关黄金挑战)

146. LRU 缓存 - 力扣(LeetCode) 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

SSL/TLS 握手过程详解

SSL握手过程详解 1、SSL/TLS 历史发展2、SSL/TLS握手过程概览2.1、协商交换密码套件和参数2.2、验证一方或双方的身份2.3、创建/交换对称会话密钥 3、TLS 1.2 握手过程详解4、TLS 1.3 握手过程详解5、The TLS 1.2 handshake – Diffie-Hellman Edition 1、SSL/TLS 历史发展 可…

显示所有中国城市需要多少个汉字?

显示所有中国城市需要多少个汉字呢? 需要3678个汉字,看看我怎么知道的。 第一步:先找到中国的所有城市的名称 去哪里找到中国的所有城市的名称呢? 进入中国天气网:http://www.weather.com.cn/ 使用 F12 打开浏览器的调…

[Mac软件]Boxy SVG 4.20.0 矢量图形编辑器

Boxy SVG 是一款入门级矢量图形编辑器,具有全套基本功能、易于学习的选项卡式界面和可自定义的键盘快捷键。有了它,您可以轻松创建横幅、图标、按钮、图形、界面草图,甚至有趣的表情包。 编辑器支持使用多种工具创建和编辑矢量对象&#xff…

深入探讨关于Redis的底层

1.1为什么Redis存储比关系型数据库快: 数据存储在内存中(比如企业项目中用户表中有一个亿的用户,如果再来注册一个用户,或者登录,必须先判断是否有这个数据,这个时候如果直接查询数据库的话,对服…

Java+springboot+vue智慧校园源码,数据云平台Web端+小程序教师端+小程序家长端

技术架构: Javaspringbootvue element-ui小程序电子班牌:Java Android演示自主版权。 智慧校园电子班牌人脸识别系统全套源码,包含:数据云平台Web端小程序教师端小程序家长端电子班牌 学生端。 电子班牌系统又称之为智慧班牌&am…

分布式之任务调度学习一

1 任务调度 1.1 什么时候需要任务调度? 1.1.1 任务调度的背景 在业务系统中有很多这样的场景: 1、账单日或者还款日上午 10 点,给每个信用卡客户发送账单通知,还款通知。如何判断客户的账单日、还款日,完成通知的发…

类加载机制之双亲委派模型、作用、源码、SPI打破双亲委派模型

双亲委派模型 双亲委派工作机制双亲委派的作用双亲委派的实现源码SPI打破双亲委派 应用程序是由三种类加载器相互配合,从而实现类加载,除此之外还可以加入自己定义的类的加载器。 类加载器之间的层次关系,称为双亲委派模型(Parent…

飞腾Ubantu22.04.3安装OpenNebula测试

目前只有one服务能够启动成功,sunstone-server nodejs 构建存在问题。 1.概述 因OpenneBula官方镜像源只有AMD架构的镜像包不存在ARM的镜像包,借此用源码编译进行测试。 2.官网github地址 下载解压存放在服务器上: https://github.com/O…

轻量检测模型PP-PicoDet解析

Paper:PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices official implementation:https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.7/configs/picodet Backbone 作者通过实验发现,ShuffleNetV2在移动…

2024第一篇: 架构师成神之路总结,你值得拥有

大家好,我是冰河~~ 很多小伙伴问我进大厂到底需要怎样的技术能力,经过几天的思考和总结,终于梳理出一份相对比较完整的技能清单,小伙伴们可以对照清单提前准备相关的技能,在平时的工作中注意积累和总结。 只要在平时…

Apache Commons BCEL与Java字节码操作

第1章:Apache Commons BCEL简介 大家好,我是小黑,咱们今天来聊聊Apache Commons BCEL(Byte Code Engineering Library)。你可能会问,BCEL是什么鬼?别急,小黑这就给你娓娓道来。BCEL…

Hadoop入门学习笔记——八、数据分析综合案例

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 八、数据分析综合案例8.1. 需求分析8.1.1. 背景介绍8.1.2…

基于Python实现二手房整体情况可视化分析+房价预测【500010099】

项目描述 通过房天下兰州二手房信息,对数据进行进一步清洗处理,分析各维度的数据,筛选对房价有显著影响的特征变量,探索兰州二手房整体情况、价格情况和价格的影响因素,建立房价预测模型。 提出问题 探究单价、数量…

SVN服务端的下载、安装

地址 : Apache Subversion Binary Packages 下载 点击 VisualSVN 安装 都是点击 next 点击next ,即可安装成功

代码随想录算法训练营第五十七天|647. 回文子串、516.最长回文子序列、动态规划总结篇

代码随想录 (programmercarl.com) 647. 回文子串 1.dp数组及下标含义 我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话&…

矩阵式键盘按键音

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit soundP3^7; //将sound位定义为P3.7 /************************************************************** 函数功能&#xff1a;蜂鸣器发声延时约120ms *************************************************…

Linux 内核调试

文章目录 一、方法论 一、方法论 qemu 虚拟机 Linux内核学习 Linux 内核调试 一&#xff1a;概述 Linux 内核调试 二&#xff1a;ubuntu20.04安装qemu Linux 内核调试 三&#xff1a;《QEMU ARM guest support》翻译 Linux 内核调试 四&#xff1a;qemu-system-arm功能选项整…

大数据毕业设计:租房推荐系统 python 租房大数据 爬虫+可视化大屏 计算机毕业设计(附源码+文档)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

年度征文|回顾2023我的CSDN

一年转眼而逝&#xff0c;回顾这一年在csdn的创作&#xff0c;学习&#xff0c;记录历程。回顾过去&#xff0c;才能展望未来&#xff0c;首先看图说话。 今年在csdn的访问量已由年初的2万到年末的50w。粉丝有年初的300个左右&#xff0c;增加到4000个左右。我年初的目标是粉丝…