常见的加密方式之python实现

文章目录

  • 前言
    • MD5加密
    • sha1加密
    • SHA256
    • DES加密
    • AES加密
    • AES的ECB 模式实现
    • AES的CBC 模式实现
    • RSA加密


前言

常见的加密方式之python实现
在这里插入图片描述
编码与解码
通常所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。将字符串和Bytes互相转换可以使用encode()和decode()方法。

encode():str对象的方法,用于将字符串转换为二进制数据(即bytes),也称为“编码”。
decode():bytes对象的方法,用于将二进制数据转换为字符串,也称为“解码”。
在设置解码采用的字符编码时,需要与编码时采用的字符编码一致。使用decode()方法时,同样不会修改原字符串。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/6/15 20:02
# @Author  : shisuiyi
# @File    : str_to_Bytes.py
# @Software: win10 Tensorflow1.13.1 python3.9# encode()编码
str0 = 'mike笔记'
byte0 = str0.encode("GBK")
print("编码前:", str0)
print("编码后:", byte0)byte1 = b'\xb2\xbb\xd3\xe8\xa4\xce\xb2\xe2\xca\xd4\xb1\xca\xbc\xc7'
str1 = byte1.decode("GBk")
print("解码后:", str1)

输出:

编码前: mike笔记
编码后: b'\xb2\xbb\xd3\xe8\xa4\xce\xb2\xe2\xca\xd4\xb1\xca\xbc\xc7'
解码后: mike笔记

Base64加密与解密

# -*- coding: utf-8 -*-import base64def bs64_data_encode(st):  # base64加密new_str = str(st)encode_str = base64.b64encode(new_str.encode())return encode_strdef bs64_data_decode(st):   # base64解密res = base64.b64decode(st).decode()return resif __name__ == '__main__':print(bs64_data_encode('mike笔记'))print(bs64_data_decode('5LiN5LqI44Gu5rWL6K+V56yU6K6w'))

输出结果:

b'5LiN5LqI44Gu5rWL6K+V56yU6K6w'
mike笔记

MD5加密

1、简介
MD5加密即message-digest algorithm 5(信息-摘要算法),即信息-摘要算法,可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。

2、用途
加密注册用户的密码。
网站用户上传图片 / 文件后,将MD5值作为文件名。(MD5可以保证唯一性)
key-value数据库中使用MD5值作为key。
比较两个文件是否相同。(在下载资源的时候,发现网站提供了MD5值,就是用来检测文件是否被篡改)

3、使用hashlib模块进行md5操作

# -*- coding: utf-8 -*-import hashlib  # 导入导入模块hashlibdef MD5_demo(str):md = hashlib.md5()  # 创建md5对象md.update(str.encode(encoding='utf-8'))return md.hexdigest()  # 小写if __name__ == "__main__":# 待加密信息str0 = 'mike笔记'md5_str = MD5_demo(str0)print('加密前为 :' + str0)print('加密后为 :' + md5_str)

输出结果:

加密前为 :mike笔记
加密后为 :a6ac80c8865b983a163ea03ed24a2d8b

sha1加密

SHA1的全称是Secure Hash Algorithm(安全哈希算法) 。SHA1基于MD5,加密后的数据长度更长,它对长度小于264的输入,产生长度为160bit的散列值。比MD5多32位,因此,比MD5更加安全,但SHA1的运算速度就比MD5要慢。

# -*- coding: utf-8 -*-
"""
使用sha1加密算法,返回str加密后的字符串
"""
import hashlibdef sha1_secret_str(s: str):sha = hashlib.sha1(s.encode('utf-8'))encrypts = sha.hexdigest()return encryptsif __name__ == '__main__':s = "mike笔记"sha1_str = sha1_secret_str(s)print('加密前为 :' + s)print('加密后为 :' + sha1_str)

输出结果:

加密前为 :mike笔记
加密后为 :796f1c0154647422ffc2ca9eb62041e9376c66af

SHA256

比特币挖矿的御用算法
SHA256是SHA-2下细分出的一种算法

SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准(哈希算法),由美国国家安全局研发,属于SHA算法之一,是SHA-1的后继者。

SHA-2下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度 、循环运行的次数等一些微小差异外,

算法的基本结构是一致的。对于任意长度的消息,SHA256都会产生一个256bit长的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。

# -*- coding: utf-8 -*-
import hashlibdef sha256_single(value):"""sha256加密:param value: 加密字符串:return: 加密结果转换为16进制字符串,并大写"""hsobj = hashlib.sha256()hsobj.update(value.encode("utf-8"))return hsobj.hexdigest().upper()if __name__ == '__main__':s = "mike笔记"sha256_str = sha256_single(s)print('加密前为 :' + s)print('加密后为 :' + sha256_str)

输出结果:

加密前为 :mike笔记
加密后为 :F218FC60E61A5F910442686A6882B608AC5A81F9D021A4FCF271E2BE8252DE45

DES加密

安装和导入:

安装:pip install pyDes
导入:from pyDes import des, CBC, PAD_PKCS5

示例:

# -*- coding: utf-8 -*-
"""
@FileName:  des.py
@Author:    shisuiyi
@time:      2022/06/16
"""from pyDes import des, CBC, PAD_PKCS5
import binascii"""DES加密、解密
"""class DesHandle:def __init__(self, text):self.text = textself.KEY = '12345678'  # 这个key是固定问开发,def des_encrypt(self):"""DES 加密:param s: 原始字符串:return: 加密后字符串,16进制"""secret_key = self.KEY  # 密码iv = secret_key  # 偏移# secret_key:加密密钥,CBC:加密模式,iv:偏移, padmode:填充des_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)# 返回为字节secret_bytes = des_obj.encrypt(self.text.encode("utf-8"), padmode=PAD_PKCS5)# 返回为16进制return binascii.b2a_hex(secret_bytes)def des_descrypt(self):"""DES 解密:param s: 加密后的字符串,16进制:return:  解密后的字符串"""secret_key = self.KEYiv = secret_keydes_obj = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)decrypt_str = des_obj.decrypt(binascii.a2b_hex(self.text), padmode=PAD_PKCS5)return bytes.decode(decrypt_str)  # bytes.decode() 将bit转为strif __name__ == '__main__':handle1 = DesHandle("mike笔记")print(handle1.des_encrypt())handle2 = DesHandle("d902f013c0d73869401b7b7e7fa694a84de91ae7c5fbeffd")print(handle2.des_descrypt())

输出结果:

b'd902f013c0d73869401b7b7e7fa694a84de91ae7c5fbeffd'
mike笔记

AES加密

AES算法详解:高级加密标准,它是一种对称加密算法,AES只有一个密钥,这个密钥既用来加密,也用于解密。

AES加密方式有五种:ECB, CBC, CTR, CFB, OFB。
从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现。
CBC 和ECB模式的区别就是:

CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
ECB加密不需要iv,只需要key(密钥)

安装
在 Windows下使用AES时要安装的是pycryptodome 模块
pip install pycryptodome
在 Linux下使用AES时要安装的是pycrypto模块
pip install pycrypto

AES的ECB 模式实现

# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AESAES_KEY = 'aw123zsc212s9ju0'  # It must be 16, 24 or 32 bytes long (respectively for *AES-128*, *AES-192* or *AES-256*).def add_to_16(text: str) -> bytes:"""不足16位的地方补全位数:param text: 源字符串:return: 补足字符串"""b_text = text.encode('utf-8')# 计算需要补的为位数if len(text) % 16:add = 16 - (len(b_text) % 16)else:add = 0return b_text + (b'\0' * add)def encrypt_by_aes(text: str, key: str) -> str:"""加密函数:param text: 源字符串:param key: 密钥:return: 加密字符串"""key = key.encode('utf-8')text = add_to_16(text)  # 如果长度不够补足 16 位cryptos = AES.new(key, AES.MODE_ECB)  # 使用ECB模式cipher_text = cryptos.encrypt(text)  # 加密return base64.standard_b64encode(cipher_text).decode('utf-8')  # 将加密结果转为base64编码输出def decrypt_by_aes(text: str, key: str):"""解密函数:param text: 加密字符串:param key: 密钥:return: 解密结果"""key = key.encode('utf-8')text = text.encode('utf-8')text = base64.b64decode(text)  # 先使用base64解码cryptos = AES.new(key, AES.MODE_ECB)cipher_text = cryptos.decrypt(text)  # 解密return cipher_text.decode('utf-8').strip('\0')if __name__ == '__main__':source_str = 'mike笔记'encrypt_str = encrypt_by_aes(source_str, AES_KEY)decrypt_str = decrypt_by_aes(encrypt_str, AES_KEY)print(encrypt_str)print(decrypt_str)

输出结果:

v1Y+LCYilaKuVd9jXGW4OG6wQrmakZhhT7CDN48lliM=
mike笔记

AES的CBC 模式实现

# -*- coding: utf-8 -*-
import base64
from Crypto.Cipher import AESclass EncryptDate:def __init__(self, key, iv):self.key = key.encode("utf-8")                          # 初始化密钥self.iv = iv.encode("utf-8")                            # 初始化偏移量self.length = 16                                        # 初始化数据块大小self.aes = AES.new(self.key, AES.MODE_CBC, self.iv)     # 初始化AES,ECB模式的实例# 截断函数,去除填充的字符self.unpad = lambda s: s[0:-s[-1]]def pad(self, text):"""填充函数,使被加密数据的字节码长度是block_size的整数倍"""count = len(text.encode('utf-8'))add = self.length - (count % self.length)entext = text + (chr(add) * add)return entextdef encrypt(self, encrData):  # 加密函数a = self.pad(encrData)res = self.aes.encrypt(a.encode("utf-8"))msg = str(base64.b64encode(res), encoding="utf8")return msgdef decrypt(self, decrData):  # 解密函数res = base64.decodebytes(decrData.encode("utf-8"))msg_text = self.aes.decrypt(res)decrypt_text = self.unpad(msg_text).decode('utf8')return decrypt_textif __name__ == '__main__':aes_key = "0CoJUm6Qyw8W8jud"aes_iv = "9999999999999999"text_data = 'mike笔记'encrypt_data = EncryptDate(aes_key, aes_iv).encrypt(text_data)decrypt_data = EncryptDate(aes_key, aes_iv).decrypt(encrypt_data)print("原始数据:", text_data)print("加密后数据:", encrypt_data)print("数据解密:", decrypt_data)```
输出结果:```c
原始数据: mike笔记加密后数据: DSiSraEccFNBbo5L7O60C4sZw9z+owwxfTi8fMFYYVM=
数据解密: mike笔记

RSA加密

RSA加密算法是一种非对称加密算法, 使用openssl ,keytools等工具生成一对公私钥对,使用被公钥加密的数据可以使用私钥来解密。

# -*- coding: utf-8 -*-
import rsa
import base64# rsa加密
def rsaEncrypt(str):# 生成公钥、私钥(pubkey, privkey) = rsa.newkeys(1024)print("公钥: ", pubkey)print("私钥: ", privkey)# 明文编码格式content = str.encode('utf-8')# 公钥加密crypto = rsa.encrypt(content, pubkey)# # 一般加密的密文会以base64编码的方式输出b_res = base64.b64encode(crypto).decode()return(b_res, privkey)# rsa解密
def rsaDecrypt(str, pk):# 私钥解密str = base64.b64decode(str.encode())content = rsa.decrypt(str, pk)con = content.decode('utf-8')return con(a, b) = rsaEncrypt("mike笔记")
print('加密后密文:', a)
content = rsaDecrypt(a, b)
print('解密后明文:', content)
公钥:  PublicKey(113470524225910557322884041079730885629500891762564656647656493210767749547668213373094028584810486476685694392950833477491276179265755337717974938997270915920724776540032039593464817490125523868061678130911761061942123329506543626197368650416434554584363549666830839661425323410205940989023322707335471888693, 65537)
私钥:  PrivateKey(113470524225910557322884041079730885629500891762564656647656493210767749547668213373094028584810486476685694392950833477491276179265755337717974938997270915920724776540032039593464817490125523868061678130911761061942123329506543626197368650416434554584363549666830839661425323410205940989023322707335471888693, 65537, 49057384888184532877406601155882858742790763495437798212531838177424865582550790510905995177106372336701595509862656449810608042225245460410166786907298318676412949734430422952998615505434350499917821657126361553083727322987072459664877185816829930588001976168732927196445249652057892467131716493395488174913, 42634469690852041372779335865769377507324089843269658005185029937283890025207576461770779563428903937547975990563042099326958533052937770882166072164786597159641161, 2661473803912649805246869624668668574550205591791588900635990794504918156173482653597243444437455173742897237144953732507167046192020136204937613)
加密后密文: hI2rGwCXvG/8Y1yDg/G4rQLVKl22UnD/bun08CITOMHyeY2J7MI5c+Ex2sUTb2KJO+6QHkDJpAv+Q70KLmeprxQVMdnwapRNFg6imds+QdffkT926pt0kmF95h71GWdH7PRuoB23JoSYkm5aiZUuwfp3lW+g0bJEbvtmkI0bD2s=
解密后明文: mike笔记

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

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

相关文章

5种方法,加密你的Python代码 !

Python越来越热门了,2019年3月TIOBE编程语言排行榜上,Python更是罕见的击败了“霸榜三巨头”之一的C,挤进前三。 Python优点很多,比如简单易学,代码量少,能做的事很多等等,和其他语言一样&#…

Python加密与解密(一文搞定)

前言 据记载,公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话 保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机, 密码学在战争中起着非常重要的作用。 随着信息化和数字化社会的发展&…

Python 常见加密方式和实现

一、前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes。 所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错。 将字符串和Bytes互相转换可以…

Python读取excel表格中的网址并批量打开网页

import webbrowser import xlrdwb xlrd.open_workbook("demo.xlsx") sht wb.sheet_by_name("Sheet1") for x in range(sht.nrows):webbrowser.open(sht.cell(x, 1).value)# 用系统默认浏览器打开指定网页

如何批量打开一组网页?

有时要批量打开一组网页,研究出三种方法 1.使用在线的网页工具打开,如:http://www.a-site.cn/tool/kai/ 2.使用标签,新建一个标签文件夹,把要打开的网页放到这个文件夹下,在文件夹下右击选择“打开所有标签…

html 批量依次打开网页,傲游浏览器批量一键打开网页的几种方法

在傲游浏览器中,我们可以批量一键打开网页,你相信吗?这是真的。只要在傲游浏览器中创建一个空白文件夹,然后将需要打开的网页放入该文件夹中。一键登录的技巧下面来演示下。 软件名称:Maxthon傲游浏览器 v6.0.0.1700 Alpha 中文官…

简易小工具实现批量打开多个网页

最近有个需求,希望一次性可以打开多个网页,网址自由指定,这个需求的实现非常简单,使用基本的c代码调用system函数即可,都不需要MFC相关的东西。 但是我实测一些工具后发现一个问题,当打开超过大约3个网址的…

如何批量保存html,如何批量保存网页信息

如何批量保存网页信息 现在我们利用网络数据库探索者来批量保存这些联系地址,就能大大减少重复劳动的工作量。 下载地址:http://www2.skycn.com/soft/14620.html 一、查找页面规律 在使用网络数据库探索者前我们要摸清页面的规律,一般可以从两…

批处理批量打开网页

我们的Windows系统里有种文件拓展名是bat,或是cmd。 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展名为bat 。目前比较常见 的批处理包含两类:DOS批处理和PS批处理。PS批处理是基…

DOS BAT脚本批量打开Edge网页

Bat脚本配置说明 前言打开效果详细命令测试环境 前言 测试业务时,需要批量打开网页,由于IE停止更新,本文以Edge为例。 关键点:页面打开需增加延迟,不要批量同时打开,否则容易漏掉,5个网址只能…

eyeurl—一款网页批量截图工具

eyeurl使用说明 开发说明 eyeurl由作者:云小书 开发,源于日常渗透测试中,信息收集到的url过多,挨个打开查看比较繁琐,且效率极低,网上有大佬开发的eyewitness,且ui布局各方面都比较完善&#…

批量保存网页

文章目录 背景工具SeleniumgeckodriverPyUserInput工具下载和安装 代码测试总结 背景 之前已经写了 2 篇文章: 备份 CSDN 博客(上) 备份 CSDN 博客(下) 但是效果都不怎么好,其实还有一种简单粗暴的方法…

批量获取/打开链接 - 实践

1.应用场景 批量操作, 打开链接. 2.学习/操作 思路 获取超链接标签, 然后使用批量打开每个超链接, 从而不需要手动一个个打开链接 完善 建议用脚本实现, 然后写一个定时脚本[服务器上],每天定时执行. 环境 Chrome浏览器/其他浏览器也可以 PHP 7.3 nginx 1.15/1.16 方式一 2.1…

批量保存网页为单个网页文件

有时候,总有会遇到一些奇怪的需求,各种搜索都找不到答案,本次记录批量保存网页到单个网页文件。 使用背景: 只想简单的解决问题,不涉及编程 网页带格式,将网页存为PDF格式会变 量太大,一个个的处理太累 涉及…

【数据安全-02】AI打假利器数字水印,及java+opencv实现

AIGC 的火爆引燃了数字水印,说实话数字水印并不是一项新的技术,但是这时候某些公司拿出来宣传一下特别应景,相应股票蹭蹭地涨。数字水印是什么呢,顾名思义,和我们在pdf中打的水印作用差不多,起到明确版权、…

python自动打开网页_python 自动批量打开网页的示例

python 自动批量打开网页的示例 如下所示: import webbrowser import codecs import time with open("test.txt") as fp: for ebayno in fp: url http://ebay.com/itm/ebayno.strip() time.sleep(1) #打开间隔时间 webbrowser.open(url) #打开网…

【bat批处理】手把手教你批量打开软件、文件、网页等

【bat批处理】打开软件、文件等 0- 前言1- start 命令用法1.0 注释1.1 start 命令说明1.2 启动软件1.3 打开文件1.4 打开文件夹1.5 打开网页 2-实战2.0 怎么创建bat批处理文件2.1 打开软件、文件、网页2.2 微信多开2.3 定时关机2.4 取消定时关机2.5 显示桌面图标 3 小结 0- 前言…

认识Vue中组件利器-插槽Slot-案例介绍

一. 插槽的使用 1.1. 认识插槽slot 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示; 但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定…

IDEA汉化后转回英文,只要三步

如果你觉得本文对你有帮助,麻烦动动手指顶一下

IntelliJ IDEA全界面汉化(官方插件)

现在很多人用IntelliJ IDEA写java代码,但小白很苦恼,看不懂,今天来分享一下怎么汉化 因为现在IDEA官方是支持汉化了,所以我们直接使用IDEA的插件 4. 下载Chinese汉化包(第二个) 重启IDEA就可以看到页面都变…