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

前言

据记载,公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话

保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,

密码学在战争中起着非常重要的作用。

随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,

于是在1997年,美国国家标准局公布实施了“美国数据加密标准(DES)”,

民间力量开始全面介入密码学的研究和应用中,采用的加密算法有DES、RSA、SHA等。

随着对加密强度需求的不断提高,近期又出现了AES、ECC等。

使用密码学可以达到以下目的:

保密性:防止用户的标识或数据被读取。

数据完整性:防止数据被更改。

身份验证:确保数据发自特定的一方。

加密算法分类

对称加密算法:

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥

发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。

相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。

常见的对称加密算法:DES,AES,3DES等等

非对称加密算法:

文件加密需要公开密钥(publickey)和私有密钥(privatekey)。

接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。

在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。

非对称加密算法的加解密速度低于对称加密算法,但是安全性更高。

非对称加密算法:RSA、DSA、ECC等算法

消息摘要算法:

消息摘要算法可以验证信息是否被篡改。

在数据发送前,首先使用消息摘要算法生成该数据的签名,然后签名和数据一同发送给接收者。

接收者收到数据后,对收到的数据采用消息摘要算法获得签名,最后比较签名是否一致,以此来判断数据在传输过程中是否发生修改。

Python加密库

PyCryptodome是PyCrypto的一个分支。基于PyCrypto2.6.1

pip install PyCryptodome

DES加密

全称为Data EncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法

入口参数有三个:Key、Data、Mode

Key为7个字节共56位,是DES算法的工作密钥;

Data为8个字节64位,是要被加密或被解密的数据;

Mode为DES的工作方式,有两种:加密或解密

3DES(即Triple DES)是DES向AES过渡的加密算法,

使用两个密钥,执行三次DES算法,

加密的过程是加密-解密-加密

解密的过程是解密-加密-解密

import uuid
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpaddef get_key(len=8):"""获取指定位数的动态密钥"""key = str(uuid.uuid4()).replace('-', '')[4:4+len].upper()return key.encode('utf-8')class My_DES_ECB():def __init__(self, key):# 密钥必须为8位self.key = keyself.mode = DES.MODE_ECBself.cryptor = DES.new(self.key, self.mode)def encrypt(self, plain_text):encrypted_text = self.cryptor.encrypt(pad(plain_text.encode('utf-8'), DES.block_size))return encrypted_textdef decrypt(self, encrypted_text):plain_text = self.cryptor.decrypt(encrypted_text)plain_text = unpad(plain_text, DES.block_size).decode()return plain_textif __name__ == '__main__':key = get_key()pc = My_DES_ECB(key)  # 初始化密钥e = pc.encrypt("0123456789ABCDEF")d = pc.decrypt(e)print(e, d)

输出

b’\xddW\xf6A\xf4Pa\xe1\xba\xbdih\x16\xbf{7N\x16\x1e\xc3}\xab\xc6\xb9’ 0123456789ABCDEF中国

MODE_ECB = 1
MODE_CBC = 2
MODE_CFB = 3
MODE_OFB = 5
MODE_CTR = 6
MODE_OPENPGP = 7
MODE_EAX = 9# Size of a data block (in bytes)
block_size = 8
# Size of a key (in bytes)
key_size = 8

AES加密

高级加密标准(英语:Advanced EncryptionStandard,缩写:AES),这个标准用来替代原先的DES

AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特(16、24和32字节)

大致步骤如下:

1、密钥扩展(KeyExpansion),

2、初始轮(Initial Round),

3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,

4、最终轮(Final Round),最终轮没有MixColumns。

import uuid
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpaddef get_key(len=16):"""获取指定位数的动态密钥"""key = str(uuid.uuid4()).replace('-', '')[0:len].upper()return key.encode()class My_AES_ECB():def __init__(self, key):# 密钥必须为8位self.key = keyself.mode = AES.MODE_ECBself.cryptor = AES.new(self.key, self.mode)def encrypt(self, plain_text):encrypted_text = self.cryptor.encrypt(pad(plain_text.encode('utf-8'), AES.block_size))return encrypted_textdef decrypt(self, encrypted_text):plain_text = self.cryptor.decrypt(encrypted_text)plain_text = unpad(plain_text, AES.block_size).decode()return plain_textif __name__ == '__main__':key = get_key()pc = My_AES_ECB(key)  # 初始化密钥e = pc.encrypt("0123456789ABCDEF中国")d = pc.decrypt(e)print(e, d)

IV is not meaningful for the ECB mode

IV length (it must be 16 bytes long) for the CBC mode

decrypt() cannot be called after encrypt() for the CBC mode

import uuid
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpaddef get_key(len=16):"""获取指定位数的动态密钥"""key = str(uuid.uuid4()).replace('-', '')[0:len].upper()return key.encode()class My_AES_CBC():def __init__(self, key, iv):# 密钥必须为8位self.key = keyself.mode = AES.MODE_CBCself.cryptor = AES.new(self.key, self.mode, iv)def encrypt(self, plain_text):encrypted_text = self.cryptor.encrypt(pad(plain_text.encode('utf-8'), AES.block_size))return encrypted_textdef decrypt(self, encrypted_text):plain_text = self.cryptor.decrypt(encrypted_text)plain_text = unpad(plain_text, AES.block_size).decode()return plain_textif __name__ == '__main__':key = get_key()e = My_AES_CBC(key, iv='1234567890123456'.encode('utf-8')).encrypt("0123456789ABCDEF中国")d = My_AES_CBC(key, iv='1234567890123456'.encode('utf-8')).decrypt(e)print(e, d)
MODE_ECB = 1
MODE_CBC = 2
MODE_CFB = 3
MODE_OFB = 5
MODE_CTR = 6
MODE_OPENPGP = 7
MODE_CCM = 8
MODE_EAX = 9
MODE_SIV = 10
MODE_GCM = 11
MODE_OCB = 12# Size of a data block (in bytes)
block_size = 16
# Size of a key (in bytes)
key_size = (16, 24, 32)

PHP加解密

function Gen_aeskeyInfo(){
mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$uuid = substr($charid, 4, 16);
return $uuid;
}function my_encode_string($privateKey, $text, $iv){
if (strlen($text)<16)
{
return "";
}
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $text, MCRYPT_MODE_CBC, $iv);
$encode_body = base64_encode($encrypted);
return $encode_body;
}function my_decode_string($privateKey, $encryptstr, $iv){
$encryptedData = base64_decode($encryptstr);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey,$encryptedData, MCRYPT_MODE_CBC, $iv);
return rtrim($decrypted, "\0");
}// $privateKey = Gen_aeskeyInfo();
$privateKey = '5BD308AC0862393D';
$iv = '1234567890123456';
$text = '{"code":"qimen_store","type":"0","end_time":2147483647}';
$encryptstr = my_encode_string($privateKey, $text, $iv);
echo $encryptstr;
$text = my_decode_string($privateKey, $encryptstr, $iv);
echo "\n";
echo $text;输出:EHJel3udmy47ZpMGgFwYyUyp8JfCf8zoKdU+W5vIrQDZR4fTShyo1N3NtHKWbvH8+BL4TasNklnz9HlMjZnhDA==
{"code":"qimen_store","type":"0","end_time":2147483647}

转化为python

import base64
from Crypto.Cipher import AESclass AES_CBC(object):def __init__(self, key, iv):self.key = keyself.iv = iv.encode('utf-8')self.MODE = AES.MODE_CBCself.cryptor = AES.new(self.add_to_16(self.key), self.MODE, self.iv)def add_to_16(self, value):# 中文gbk时占2个字节,utf-8占3个字节value = value.encode('gbk')while len(value) % 16 != 0:value += '\0'.encode()return valuedef encrypt(self, plaintext):encrypted_text = self.cryptor.encrypt(self.add_to_16(plaintext))encrypted_text = str(base64.encodebytes(encrypted_text), encoding='utf-8').replace('\n', '')return encrypted_textdef decrypt(self, ciphertext):# 优先逆向解密base64成bytesbase64_decrypted = base64.decodebytes(ciphertext.encode())decrypted_text = self.cryptor.decrypt(base64_decrypted).decode('gbk')decrypted_code = decrypted_text.rstrip('\0')return decrypted_code@staticmethoddef Gen_aeskeyInfo():import uuidr_uuid = str(uuid.uuid4()).replace('-', '')[4:20]print(r_uuid)if __name__ == "__main__":# print(len('中'.encode('gbk')))# key = AES_CBC.Gen_aeskeyInfo()key = '5BD308AC0862393D'iv = '1234567890123456'text = '{"code":"qimen_store","type":"0","end_time":2147483647}'enc = AES_CBC(key, iv).encrypt(text)print(enc)text = AES_CBC(key, iv).decrypt(enc)print(text)输出
EHJel3udmy47ZpMGgFwYyUyp8JfCf8zoKdU+W5vIrQDZR4fTShyo1N3NtHKWbvH8+BL4TasNklnz9HlMjZnhDA==
{"code":"qimen_store","type":"0","end_time":2147483647}

RSA加密

公钥加密算法,一种非对称密码算法

公钥加密,私钥解密

3个参数:

rsa_n, rsa_e,message

rsa_n, rsa_e 用于生成公钥

message: 需要加密的消息

pip install rsa
import rsa
from binascii import b2a_hex, a2b_hexclass rsacrypt():def __init__(self, pubkey, prikey):self.pubkey = pubkeyself.prikey = prikeydef encrypt(self, text):self.ciphertext = rsa.encrypt(text.encode(), self.pubkey)# 因为rsa加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题# 所以这里统一把加密后的字符串转化为16进制字符串return b2a_hex(self.ciphertext)def decrypt(self, text):decrypt_text = rsa.decrypt(a2b_hex(text), prikey)return decrypt_text.decode()if __name__ == '__main__':pubkey, prikey = rsa.newkeys(256)rs_obj = rsacrypt(pubkey,prikey)text='hello中国'ency_text = rs_obj.encrypt(text)print(ency_text)print(rs_obj.decrypt(ency_text))print(pubkey)print(prikey)"""
b'0be7e588fd8d093de48e1ff16f177273d771e0eb6b475458e31b879aebef18f6'
hello中国
PublicKey(73203632342415782735861635389738854293696902283956451011523986747143440837753, 65537)
PrivateKey(73203632342415782735861635389738854293696902283956451011523986747143440837753, 65537, 56404226961792114085368646753370507079134793768842910110408058154189894119761, 55914002491444170148907949791677664855437, 1309218247318589494605835772663699869)"""

base64

import base64plain_text = 'hello中国'
encrypt = str(base64.encodebytes(plain_text.encode()), encoding='utf-8').replace('\n', '')
print(encrypt)
plain_text = str(base64.decodebytes(encrypt.encode(encoding='utf-8')), encoding='utf-8')
print(plain_text)

md5

import hashlibdef md5(str):md = hashlib.md5()md.update(str.encode(encoding='UTF-8'))return md.hexdigest().upper()if __name__ == '__main__':s = 'hello中国's_ = md5(s)print(s_)

读者福利:知道你可能对Python感兴趣,便准备了这套python学习资料

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。带你从零基础系统性的学好Python!

零基础Python学习资源介绍

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)

👉Python必备开发工具👈

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉100道Python练习题👈

检查学习结果。

👉面试刷题👈

在这里插入图片描述

在这里插入图片描述

资料领取

上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取资料” 即可领取

在这里插入图片描述

好文推荐

了解python的前景:https://blog.csdn.net/xiqng17111342931/article/details/127705925

了解python的副业:https://blog.csdn.net/xiqng17111342931/article/details/127872402

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

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

相关文章

Python 常见加密方式和实现

一、前言 我们所说的加密方式&#xff0c;都是对二进制编码的格式进行加密的&#xff0c;对应到Python中&#xff0c;则是我们的Bytes。 所以当我们在Python中进行加密操作的时候&#xff0c;要确保我们操作的是Bytes&#xff0c;否则就会报错。 将字符串和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)# 用系统默认浏览器打开指定网页

如何批量打开一组网页?

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

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

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

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

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

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

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

批处理批量打开网页

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

DOS BAT脚本批量打开Edge网页

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

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

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

批量保存网页

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

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

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

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

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

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

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

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

python 自动批量打开网页的示例 如下所示&#xff1a; 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 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a; 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b; 但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定…

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

如果你觉得本文对你有帮助&#xff0c;麻烦动动手指顶一下

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

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

IDEA汉化及如何改回英文界面版本

相信很多小伙伴们刚接触IDEA时&#xff0c;看到一堆英文界面不知道如何下手&#xff0c;今天教大家一个插件直接将界面中文版本&#xff0c;以及改回英文版本。建议点赞收藏哈&#xff01; 一&#xff1a;汉化 1.打开左侧file,按箭头所示2.搜索Chinese&#xff0c;安装内存大的…

【IntelliJ IDEA】如何安装汉化插件

我使用的是2020.1的版本 汉化方式: 打开idea 点击settings 选择plugins 在marketplace 搜索 Chinese install之后 点击restart ide即可 汉化后的样子: 用不习惯也可以打开plugins 点开 installed将插件移除