目录

一、MD5

二、URLEncode 和 Base64

1、URLEncode

2、Base64

三、对称加密

1、AES 加密

2、DES加密

四、非对称加密

1.RSA


一、MD5

from hashlib import md5
# MD5是一个大的hash算法. 不是加密. 不存在解密逻辑# hash 算法是不可逆的salt = b"suibianjiashenmesalt"# 加密器
obj = md5(salt)# 准备好明文
massage = 'DK_COOl'
obj.update(massage.encode('utf-8'))    # 需要将字符串编码成字节# 获取密文
ct_x = obj.hexdigest()
print(ct_x)         # 02350223f1dfe2ed625329c51c9cd26f, salt -> 8878d4fd97a85c434cc8ffeb70b658b9

注意:创建加密器时,加入 salt,可以使密文不那么容易被撞库。

MD5可以完成文件的校验。

扩展:sha256

不论是sha1,sha256,md5都属于摘要算法,都是在计算 hash 值. 只是散列的程度不同而已。这种算法有一个特性,他们是散列,不是加密。而且,由于 hash 算法是不可逆的,所以不存在解密的逻辑。


二、URLEncode 和 Base64

1、URLEncode

我们在访问一个url的时候总能看到这样一种URL:

https://sp1.baidu.com/5bU_dTmfKgQFm2e88IuM_a/union.gif?
q=execjs%2E%5Fexceptions%2EProcessExitedWithNonZeroStatus%3A+%281%2C+%27%27%2C+%27%5Bstdin%5D%3A1%5Cn%28function%28program%2C+execJS%29+%7B+execJS%28program%29+%7D%29%28function%28%29+%7B+function%28t%29+%7B%5Cn&rsv_ct=2&rsv_cst=1

此时会发现,在浏览器上明明是能看到中文的.但是一旦复制出来.或者在抓包工具里看到的.都是这种%.那么这个%是什么鬼?也是加密么?
非也,其实我们在访问一个ur的时候.浏览器会自动的进行urlencode操作.会对我们请求的ur进行编码.这种编码规则被称为百分号编码,是专门为url(统一资源定位符)准备的一套编码规则.
其实里面的规则非常简单.就是把ur中的参数部分转化成字节。每字节的再转化成1个16进制的数字.前面补%。

看着很复杂在python里直接一步到位

from urllib.parse import urlencode, unquote# url 的 编码
base_url = 'https://www.baidu.com/s?'param_dic = {"wd": "我饿了"
}# wd=%E6%88%91%E9%A5%BF%E4%BA%86
result = urlencode(param_dic)
print(result)
url = base_url + result
print(url)# 解码
url_1 = 'https://www.baidu.com/s?wd=%E6%88%91%E9%A5%BF%E4%BA%86'
print(unquote(url_1))   # 查看url 中的特殊符号以及中文信息

2、Base64

Base64其实很容易理解。通常被加密后的内容是字节,而我们的密文是用来传输的(不传输谁加密啊)。但是,在http协议里想要传输字节是很麻烦的一个事儿.相对应的,如果传递的是字符串就好控制的多.此时base64就应运而生了.26个大写字母+26个小写字母+10个数字+2个特殊符号(+和/)小组成了一组类似64进制的计算逻辑.这就是base64了.

import base64bs = "我要吃饭,我饿fadksljfkljaskl呵啊哒。吃了么呵啊哒了".encode('utf-8')# 编码
# base64主要是处理字节的
print(bs)
# 把字节 按照 base64的规则.进行编码。编码成base64的字符串形式
#           b64的字节      #b64的字符串
s = base64.b64encode(bs).decode("utf-8")
print(s)# 解码
s = '5oiR6KaB5ZCD6aWt77yM5oiR6aW/ZmFka3NsamZrbGphc2ts5ZG15ZWK5ZOS44CC5ZCD5LqG5LmI5ZG15ZWK5ZOS5LqG'
bs = base64.b64decode(s)source_s = bs.decode('utf-8')
print(source_s) # 我要吃饭,我饿fadksljfkljaskl呵啊哒。吃了么呵啊哒了

三、对称加密

所谓对称加密就是加密和解密用的是同一个秘钥.就好比我要给你邮寄一个箱子.上面怼上锁.提前我把钥匙给了你一把,我一把。那么我在邮寄之前就可以把箱子锁上然后快递到你那里.你用相同的钥匙就可以打开这个箱子。

条件: 加密和解密用的是同一个秘钥.那么两边就必须同时拥有钥匙才可以。

常见的对称加密:AES,DES,3DES.我们这里讨论AES和DES

1、AES 加密

import base64from Crypto.Cipher import AESs = '这是我要加密的明文'
"""
key -> 16, 24, 32
It must be 16, 24 or 32 bytes long (respectively for *AES-128*,*AES-192* or *AES-256*).
"""
key = b'dkdkcooldkdkcool'aes = AES.new(key, mode=AES.MODE_CBC, IV=b'0102030405060708')# ValueError: Data must be padded to 16 byte boundary in CBC mode
# 需要做填充
# 填充最好的方案(通用):缺少字节的个数 * chr(缺少字节的个数)
bs = s.encode('utf-8')que = 16 - len(bs) % 16     # 缺少字节的个数
bs += (que * chr(que)).encode('utf-8')# 加密
result = aes.encrypt(bs)    # 要求加密的内容必须是字节
# 可以选择编码成 base64
# jL5CgtiUFlRJ1Oi/IGXutF9WLfAeRynlUOexzETGRT8=
b64 = base64.b64encode(result).decode()
print(b64)# 如果aes对象 经过了加密。 就不能再解密了,必须重新写
miwen = "jL5CgtiUFlRJ1Oi/IGXutF9WLfAeRynlUOexzETGRT8="
aes1 = AES.new(key, mode=AES.MODE_CBC, IV=b'0102030405060708')# 处理base64
miwen = base64.b64decode(miwen)
result = aes1.decrypt(miwen)
print(result.decode('utf-8').replace('', ""))

2、DES加密

跟 AES加密的实现方式 很像!

from Crypto.Cipher import DESs = "我爱热巴"
key = b'dkdkcool'des = DES.new(key, mode=DES.MODE_CBC, IV=b'01020304')# 加密
bs = s.encode("utf-8")
que = 8 - len(bs) % 8  # 缺少字节的个数
bs += (que * chr(que)).encode('utf-8')
result = des.encrypt(bs)
print(result)# 解密
miwen = b'\xc2[\xa5/u,\t \x95\xe0{Z\x8e\xc4?\xb7'
des1 = DES.new(key, mode=DES.MODE_CBC, IV=b'01020304')
result = des1.decrypt(miwen)
print(result.decode('utf-8').replace("", ""))

四、非对称加密

非对称加密:加密和解密的秘钥不是同一个秘钥。这里需要两把钥匙:一个公钥,一个私钥。公钥发送给客户端.发送端用公钥对数据进行加密.再发送给接收端,接收端使用私钥来对数据解密.由于私钥只存放在接受端这边。所以即使数据被截获了.也是无法进行解密的.
常见的非对称加密算法: RSA,DSA等等,我们就介绍一个.RSA加密,也是最常见的一种加密方案。

1.RSA

# ***************************************************************
# 1.生成私钥和公钥
import base64from Crypto.PublicKey import RSA  # 管理秘钥的rsa_key = RSA.generate(2048)private_key = rsa_key.exportKey()
public_key = rsa_key.publickey().exportKey()print(public_key)
with open("rsa_public_pem.txt", mode="wb") as f:f.write(public_key)
with open("rsa_private_pem.txt", mode="wb") as f:f.write(private_key)# ***************************************************************
# 2. 加密from Crypto.Cipher import PKCS1_v1_5  # 加密
from Crypto.PublicKey import RSA
import base64# 2.1 准备明文
massage = '今天晚上没吃饭'# 2.2 读取公钥
f = open('rsa_public_pem.txt', mode='r', encoding='utf-8')
# 2.3 把公钥字符串转化成 rsa_key (object)
rsa_key = RSA.import_key(f.read())
# 2.4 创建加密对象
rsa = PKCS1_v1_5.new(rsa_key)
# 2.5 加密
miwen = rsa.encrypt(massage.encode('utf-8'))
# 2.6 b64处理
miwen = base64.b64encode(miwen).decode('utf-8')
print(miwen)# ***************************************************************
# 3. 解密
from Crypto.Cipher import PKCS1_v1_5
import base64
from Crypto.PublicKey import RSA# 3.1 准备密文
ctx = 'UqkvnZf8Gd5F1dGxi/9+Nq7lBe1OKk1Kpbn0so0UIZivY3zFqH/UOEjau0/to4gOhtOZ0SNJ0CiKD3kIHqlNE07bY/eT15oqNj8qwMLZfGuUYcqnSDCqUi4qad1sZUlg9qrXHT2Ypr2VhZM2RT+6Fb4mUWb1M7RlTLfJUGkId1ixP7xZFeY7qf10eElrckW5dxX5EV6BZ2xRFxKizJV0DrgsPH44Ixn1cipokqFJGVBR2PnwY0Dwoy+Fcr/SjQe0tIxmRKVr2cU7eMjrsZFGBAYHEWujqfwNhWBgeoOmC9nJJS+GaIYKuCECXoQV1nRd9o/2JM2DvxzQi0zlVCYbBQ=='# 3.2 读取私钥
f = open('rsa_private_pem.txt', mode='r', encoding='utf-8')
# 3.3 生成密钥对象
rsa_key = RSA.import_key(f.read())
# 3.4 生成解密对象
rsa = PKCS1_v1_5.new(rsa_key)
# 3.5 处理bs64,以及解密
mingwen_bytes = rsa.decrypt(base64.b64decode(ctx), None)
# 3.6 utf-8 处理
mingwen = mingwen_bytes.decode('utf-8')
print(mingwen)

爬虫中常用的加密逻辑(python实现)相关推荐

  1. python网络爬虫方向的第三方库_Python网络爬虫中常用第三方库总结

    python对于爬虫的编写已经是相当的友好了,不过除了利用requests库或者scrapy框架之外,有一些库还需要我们知道,以便于我们更熟练.便捷的完成目标数据的爬取,接下来我就总结一下我认为在爬虫 ...

  2. linux中常用的加密总结--base64编码解码与openssl实现

    linux中常用的加密总结–base64编码解码与openssl实现 一.base64 !!!base64是一种数据编码方式,可逆,不是严格意义上的加密算法,不能作为安全加密使用 -d,–decode ...

  3. java中常用的加密工具

    java中常用的加密工具 1. md5加密工具类 public class MD5Utils {private static final String hexDigIts[] = {"0&q ...

  4. Android中常用的加密方式

    Android中常用的加密方式 HmacSHA1 public static String getSignUtil(String key ,String base) {Log.i(TAG, " ...

  5. Java中常用的加密方法(JDK)

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...

  6. python json提取器_【编号0004】爬虫中常用到的数据提取手段

    使用爬虫抓取网上公开的网页数据时,经常需要使用各种技能去解析到手的响应. 本篇文章,重点介绍下,数据提取时,有哪些常见的方法 0. 背景交代 编程语言:Python 提取方式:Python库 1. X ...

  7. java中常用的加密方法_java中常用的数据加密算法

    [项目中第一次深入地了解到加密算法的使用,现第一阶段结束,将使用到的加密算法和大家分享一下:首先还是先给大家普及一下常用加密算法的基础知识基本的单向加密算法BASE6 以下为加密的工具类: impor ...

  8. Java中常用的加密方式

    一.Java常用加密方式 Base64加密算法(编码方式) MD5加密(消息摘要算法,验证信息完整性) 对称加密算法 非对称加密算法 数字签名算法 数字证书 二.分类 按加密算法是否需要key被分为两 ...

  9. python项目归纳总结-【第108期】总结最近项目中常用的几个Python库

    听着音乐 补充知识 各位读者还好吗 ? 好久不见,最近因为公司和一些私事原因没能及时发布新的技术文章,不过今天又崭新满满的回来了,还会继续发一些自己的想法和关于技术的内容文章给大家,也算是对自己做过和 ...

最新文章

  1. CE6.0 下获得 SD 卡序列号的方法
  2. ASP.NET备份与还原SQL Server数据库
  3. SAP UI5 初学者教程之二十六 - OData 服务配合 Mock 服务器的使用步骤详解试读版
  4. Android开发之下载Apk安装的方法兼容Android7.0和8.0及以上
  5. 极道创始人吴江:企业级数据系统,初创一样可以做出好产品
  6. Oracle数据库备份和恢复配置详解
  7. linux 圣经软件,Ubuntu(Linux)下好用的中文圣经
  8. python字体描边_使用 python 将文泉驿字体导出为 fnt 格式的bitmap font
  9. VSCode 摸鱼神器
  10. Java中serialVersionUID作用
  11. 技术人员如何创业(4)---打造超强执行力团队
  12. AB 系统OTA升级
  13. matlab图像自动标注程序,基于MATLAB/GUI的图像语义自动标注系统
  14. TSMC HPC工艺介绍
  15. Win10_11使用VMware等启动虚拟机蓝屏报错等一些列问题解决方案
  16. 移动光猫只有一个lan口?其他是电视用,如何增lan口
  17. Physics.OverlapSphere
  18. 【每日蓝桥】13、一三年省赛Java组真题“黄金连分数”
  19. 软件测试之测试用例设计(三)
  20. W77E58在GPS远程定位的应用(源代码) .

热门文章

  1. Jam 计数法 思路很清
  2. C语言oj罚时计算,罚时计算器(字符处理,结构,指针数组).c
  3. PyCharm安装教程(2022最新版)
  4. 超详细的MySQL8.0.20安装教程及其安装问题处理
  5. r720 linux 双系统,联想R720拯救者i5 7300黑苹果MacOS10.14.2安装和双系统引导
  6. 校园IPTV数字电视教学直播系统在淮安生态文旅区实验小学的应用
  7. Javascript判断是否iphone全面屏手机
  8. Android原生界面添加水印
  9. Pycharm更换清华、阿里、豆瓣软件源提高依赖包下载速度
  10. Surface Go为教育而生,微软将如何改变中国课堂?