爬虫学习笔记(十五)——加密解密

2023-11-19

一、概念和作用

1.1、概念

加密解密:一个信息干扰的过程,保证固定的人才可以看到你的信息

把重要的数据变为乱码(加密)传送,
到达目的地后再用相同或不同的手段还原(解密)


1.2、作用

网络信息传输安全涉及到很多个方面,其中主要有三个要解决的问题:

  • 保密性(Confidentiality):信息在传输时不被泄露
  • 完整性(Integrity):信息在传输时不被篡改
  • 有效性(Availability):信息的使用者是合法的

1.3、常用加密方式

数据加密方式 描述 主要解决的问题 常用算法
对称加密 指数据加密和解密使用相同的密钥 数据的机密性 DES, AES
非对称加密 也叫公钥加密,指数据加密和解密使用不同的密钥–密钥对儿 身份验证 DSA,RSA
单向加密 指只能加密数据,而不能解密数据 数据的完整性 MD5,SHA系列算法

二、字符编码

2.1、进制间转换方法(python)

十进制与二进制

>>> bin(255)  #十进制转二进制
'0b11111111'

>>> int("0b11111111",2)  #二进制转十进制
255

十进制与十六进制

>>> hex(255)  #十进制转十六进制
'0xff'

>>> int('0xff',16)  #十六进制转十进制
255

2.2、unicode

字符和unicode编号是一一对应的关系,世界上的每个字符都对应着一个unicode编号,根据编号可以进行多种编码。utf-8、utf-16、utf-32、…、gbk编码等。

>>>ord('学')   
23398
>>>chr(23398)
'学'

>>>'学'.encode('utf-8')   #汉字中utf-8编码
b'\xe5\xad\xa6'
>>>'学'.encode('gbk')   #汉字中gbk编码
b'\xd1\xa7'

注意:转什么编码,解码时就要用什么编码,例如:

>>>'学'.encode('gbk')
b'\xd1\xa7'
>>>b'\xd1\xa7'.decode('gbk')
'学'
>>>b'\xd1\xa7'.decode('utf-8')
'ѧ'

三、Base64编码原理

3.1、概念

Base64就是一种基于64个可打印字符来表示二进制数据的方法。


3.2、作用

  1. 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况。

  2. 网络上传输的字符并不全是可打印的字符,比如二进制文件、图片等。Base64的出现就是为了解决此问题,它是基于64个可打印的字符来表示二进制的数据的一种方法。

实例:

  • 电子邮件刚问世的时候,只能传输英文,但后来随着用户的增加,中文、日文等文字的用户也有需求,但这些字符并不能被服务器或网关有效处理,因此Base64就登场了。随之,Base64在URL、Cookie、网页传输少量二进制文件中也有相应的使用。
  • 对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。
  • 电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。

3.3、Base64编码表

字符 字符 字符
A 0 Q 16 g 32
B 1 R 17 h 33
C 2 S 18 i 34
D 3 T 19 j 35
E 4 U 20 k 36
F 5 V 21 l 37
G 6 W 22 m 38
H 7 X 23 n 39
I 8 Y 24 o 40
J 9 Z 25 p 41
K 10 a 26 q 42
L 11 b 27 r 43
M 12 c 28 s 44
N 13 d 29 t 45
O 14 e 30 u 46
P 15 f 31 v 47

3.4、文本到base64格式的转换

文本转ASCII:ord()
ASCII转文本:chr()
ASCII转二进制:bin()

#ASCII码
>>> ord("M")
77
>>> ord("a")
97
>>> ord("n")
110

#ASCII转二进制
>>> bin(77)
'0b1001101'
>>> bin(97)
'0b1100001'
>>> bin(110)
'0b1101110'

#六个二进制位一组
>>> int("010011",2)
19              19---对应base64表T
>>> int("010110",2)
22              22---对应base64表W
>>> int("000101",2)
5               5---对应base64表F
>>> int("101110",2)
46              46---对应base64表u

3.5、BASE64编码补码

>>> import base64
>>> base64.b64encode(b"A")
b'QQ=='
>>> base64.b64encode(b"BC")
b'QkM='

>>> base64.b64decode(b'QQ==')
b'A'
>>> base64.b64decode(b'QkM=')
b'BC'

注意

  • 大多数编码都是由字符串转化成二进制的过程,而Base64的编码则是从二进制转换为字符串。与常规恰恰相反;
  • Base64编码主要用在传输、存储、表示二进制领域,不能算得上加密,只是无法直接看到明文。也可以通过打乱Base64编码来进行加密。
  • 计算机二进制存储数据是以8位为一字节进行存储,然而BASE64编码是以6位表示一字节,这样相邻的数据变化了之后会影响后面整个的编码结果。

四、单向加密

4.1、概念

单向加密是指只能对明文数据进行加密,而不能解密数据。

例:每个人都有不同的指纹,看到这个人,可以得出他的指纹等信息,并且唯一对应,但你只看一个指纹,是不可能看到或读到这个人的长相或身份等信息。


4.2、常见方法

MD5 (message-digest algorithm) SHA (Secure Hash Algorithm)

注意

  1. md5的长度默认为128bit,也就是128个0和1的二进制串。
  2. SHA 的长度默认为256bit,也就是256个0和1的二进制串。
  3. 使用二进制串很不友好。所以将二进制转成了16进制,每4个bit表示一个16进制,所以128/4 = 32 换成16进制表示后,为32位了。同理256/4=64位。
  4. update 的意思是更新hash值,若同一个MD5对象两次调用update,第二次会保留第一次调用调用的信息,所以算一个字符串的hash值,应该重新生成md5对象。

4.2.1、md5加密

from  hashlib import md5

md5_obj=md5()   #创建md5算法加密对象
md5_obj.update("加密数据".encode())#参数:内容是要加密数据  二进制格式
md5_obj.hexdigest()
#结果: '648bfc23726d2e76af569f6fea26c1f8'

md5_obj.update("加密数据".encode())
md5_obj.hexdigest()
#同一个md5对象两次调用update 第二次保留第一次调用的信息
# 结果: '47c58fbd984d00c4c0c24396be4ed52f'

4.2.2、sha加密

from  hashlib import sha256
sha256_obj=sha256()#创建sha算法加密对象
sha256_obj.update("加密数据".encode())#参数:内容是要加密数据  二进制格式
sha256_obj.hexdigest()
#结果:'fc016213ebd4e12fd50ebeee2a074d09aef8b4dffa247401227976cfdec1ebf9'

sha256_obj.update("加密数据".encode())#参数:内容是要加密数据  二进制格式
sha256_obj.hexdigest()
#同一个sha对象两次调用update 第二次保留第一次调用的信息
#结果: '5cbb02bfa5153ef91d29c8edcd213ffde626a9e6c0ac6d25e1d9ad6ddbca0078'

注意:这种单向加密因为不能被解密,显然是不能作为信息传输的,不能解密的消息是没有意义的。所以实际应用中一般作为文件完整性的验证,加密结果相同就认为文件在传输后也是完整的。


五、对称加密

5.1、概念与简介

概念: 对称加密是指数据加密与解密使用相同密钥

简介: 常用的对称加密 DES3DESAES

   DES: Data Encryption Standard,秘钥长度为56位,8位校验位;
             (2003年左右被破解–秘钥可以暴力破解。 穷举法)
   3DES:DES的改进版本。
   AES: Advanced Encryption Standard,支持的秘钥长度包括 128bits,192bits,258bits,384bits,512bits。

特点:

  • 加密与解密使用的密钥相同。

  • 但是由于算法一般都是公开的,因此机密性几乎完全依赖于密钥。

  • 通常使用的是相对较小的密钥,一般小于256bit。因为密钥越大,加密越强,但加密与解密的过程越慢。

说明: 秘钥长度越长,数据加密与解密的时间就越久


5.2、DES

5.2.1、概念

数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。


5.2.2、DES加密原理

DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。


5.2.3、python实现DES加密

安装密码库

      windows: pip install pycryptodomex

      linux: pip install pycryptodome

from Cryptodome.Cipher  import  DES

key=b'12345678'
#创建对象
des=DES.new(key,DES.MODE_ECB) #key是秘钥  必须是8个字节

data="王者荣耀"
bwd=data.encode()
en_text=data+(8-len(bwd)%8)*" "

#加密
en_data=des.encrypt(en_text.encode())
print(en_data)  #b'\xf8\x85\xa3\xfb\xc0\x1d\x83\xdd\xc8w2S\xb0\xe9/\t'
#解密
de_data=des.decrypt(en_data)
print(de_data)  #b'\xe7\x8e\x8b\xe8\x80\x85\xe8\x8d\xa3\xe8\x80\x80    '
print(de_data.decode())  #王者荣耀    

注意

  • 设置的key是秘钥,必须是8个字节

5.3、3DES

5.3.1、概念

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法

由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解。3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。


5.3.2、加密原理

3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样:

  • 3DES加密过程为:C=Ek3(Dk2(Ek1(M)))

  • 3DES解密过程为:M=Dk1(EK2(Dk3( C)))


5.4、AES

5.4.1、概念

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

5.4.2、加密过程

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。

在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。

密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,C = E(K,P)是加密函数,在这个加密函数中会执行10个加密轮函数。

AES 密钥长度(32位比特字) 分组长度(32位比特字) 加密轮数
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

5.4.3、python实现AES加密

from  Cryptodome.Cipher import  AES
key=b"12345678abcdefgh"
#构建对象
aes=AES.new(key,AES.MODE_ECB)
#1.key 秘钥  2.mode  AES.MODE_ECB 加密方式

#加密
text="王者"
bytes_data=(text+(16-len(text.encode())%16)*" ").encode()
#加密
en_data=aes.encrypt(bytes_data)
print(en_data)  
#结果 b'\x93\xf9\xfaxj\xd6xt\x9a\xd6\xdb\xa3\x8c\xf8M\xdf'  
#解密
de_data=aes.decrypt(en_data)
print(de_data.decode())
# 结果  王者

六、非对称加密

6.1、概念与简介

指的是加密和解密使用不同的秘钥。

一把作为公开的公钥,另一把作为私钥。这对密钥中的公钥进行加密,私钥用于解密。反之亦然(被私钥加密的数据也可以被公钥解密)。

在实际使用中私钥一般保存在发布者手中,是私有的不对外公开的,只将公钥对外公布,就能实现只有私钥的持有者才能将数据解密的方法。 这种加密方式安全系数很高,因为它不用将解密的密钥进行传递,从而没有密钥在传递过程中被截获的风险,而破解密文几乎又是不可能的。

但是算法的效率低,所以常用于很重要数据的加密,常和对称配合使用,使用非对称加密的密钥去加密对称加密的密钥。

事实上,公钥加密算法很少用于数据加密,它通常只是用来做身份认证,因为它的密钥太长,加密速度太慢–公钥加密算法的速度甚至比对称加密算法的速度慢上3个数量级(1000倍)。


6.2、非对称加密原理

  1. 小蓝与小红想要进行沟通,不能被小黑或其他人看到;(需求)

  2. 于是小红自己做了个信箱,信箱上有锁,钥匙只有小红自己有;(公钥加密)

  3. 于是小蓝每次与小红沟通的时候,都会把信放在邮箱中,信箱大家都可以看到,都可以知道小红的信箱位置;(公开公钥)

  4. 小红想要看信的内容的时候,需要拿着自己保管的私钥,打开锁,读取信箱里的信。(私钥解密)

  • 过程2带锁的信箱,就是公钥加密的过程。
  • 过程4是私钥解密的过程
  • 公钥(锁) 私钥(钥匙)是生成的一对,且私钥不对外,不传递,增加了安全性.
  • 同样的小红想要给小蓝发送信息时,小蓝需要告诉小红带锁信箱(公开公钥),并通过钥匙打开信箱

6.3、RSA加密算法

三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密

6.3.1、RSA加密原理

(1)选择一对不同的、足够大的素数p,q。
​(2)计算n=pq。
​ (3)计算f(n)=(p-1)
(q-1),同时对p, q严加保密,不让任何人知道。
​ (4)找一个与f(n)互质的数e作为公钥指数,且1<e<f(n)。
​ (5)计算私钥指数d,使得d满足(d*e) mod f(n) = 1
​ (6)公钥KU=(e,n),私钥KR=(d,n)。
​ (7)加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组, 然后再进行交换。 设密文为C,则加密过程为:C=M^e mod n。
​ (8)解密过程为:M=C^d mod n。

RSA加密算法的安全性
当p和q是一个大素数的时候,从它们的积pq去分解因子p和q,这是一个公认的数学难题。

RSA加密算法的缺点
虽然RSA加密算法作为目前最优秀的公钥方案之一,在发表三十多年的时间里,经历了各种攻击的考验,逐渐为人们接受。但是,也不是说RSA没有任何缺点。由于没有从理论上证明破译RSA的难度与大数分解难度的等价性。所以,RSA的重大缺陷是无法从理论上把握它的保密性能如何。

在实践上,RSA也有一些缺点:
产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密;
分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢。


6.3.2、python实现RSA加密

import rsa
#生成公钥和秘钥

PublicKey,PrivateKey=rsa.newkeys(999)
print(PublicKey)
print(PrivateKey)
text="非对称加密"
#公钥加密
en_data=rsa.encrypt(text.encode(),PublicKey)
print(en_data)
#私钥解密
de_data=rsa.decrypt(en_data,PrivateKey)
print(de_data.decode())

#单独构造公钥
pubkey=rsa.PublicKey(5,3)

结果:

PublicKey(3633767976638772494145124918801479992476887706891140141138898916359, 65537)
PrivateKey(3633767976638772494145124918801479992476887706891140141138898916359, 65537, 3591518084239078509975288258775300312809419416102919266938563215673, 139069387608670880268883641030474037, 26129172200454915719136577551307)
公钥加密: b'\x02\xf1\xe0\xfb\xf2\x1b\x8e\xc1.\x8al\xd2\x1a\x00\x8e\x07_,\xe3@\xfd\xe9\xabH\xc3/v\xd4'
私钥解密: 非对称加密
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫学习笔记(十五)——加密解密 的相关文章

随机推荐

  • 【编译原理】 CS143 斯坦福大学公开课 第一周:简介

    youtube 1 1 Introduction to Compilers and interpreters 1 1 Introduction to Compilers and interpreters 编译器解释器介绍 两种主要的实现编程
  • three.js中聚光灯及其属性介绍

    一 聚光灯及其属性介绍 Three js中的聚光灯 SpotLight 是一种用于在场景中创建聚焦光照的光源类型 它有以下属性 color 聚光灯的颜色 intensity 聚光灯的强度 distance 聚光灯的有效距离 angle 聚光
  • [毕业设计]2023-2024年最新电子科学与技术专业毕设选题题目推荐汇总

    文章目录 1前言 2 如何选题 3 选题方向 3 1 嵌入式开发方向 3 2 物联网方向 3 3 人工智能方向 3 4 算法研究方向 3 5 学长作品展示 4 最后 1前言 近期不少学弟学妹询问学长关于电子科学与技术专业相关的毕设选题 学长
  • java如何检测连接池连接情况,如何检查是否使用了连接池

    I use HSQLDB EclipseLink Gemini on OSGI framework Felix In spite that I ve set pool in persistence xml I have serious su
  • 全网最全谷粒商城记录_01、简介-项目介绍(2022-07-06更新完成)

    声明 本教程不收取任何费用 欢迎转载 尊重作者劳动成果 不得用于商业用途 侵权必究 目录 分布式基础 全栈开发篇 分布式高级 微服务架构篇 高可用集群 架构师提升篇 希望大家 微服务架构图简单介绍 项目简介 1 项目背景 1 电商模式 1
  • JavaWeb学习笔记-part1

    互联网通信 什么是互联网通信 两台计算机通过网络实现文件共享行为 就是互联网通信 互联网通信中的角色划分 客户端 用于发送请求的计算机 服务端 用于接受请求 并满足请求的计算机 互联网通信模型 C S通信模型 client software
  • Handler机制与原理

    为什么会出现内存泄漏问题呢 分析 Handler使用是用来进行线程间通信的 所以新开启的线程是会持有Handler引用的 如果在Activity等中创建Handler 并且是非静态内部类的形式 就有可能造成内存泄漏 非静态内部类是会隐式持有
  • uniapp 开发微信小程序之新版隐私协议

    自从微信小程序官方更新隐私协议 用户必须同意之后 才能获取个人信息 这就导致在获取用户信息之前 需要有个隐私协议弹窗 大致如下图 微信小程序官方提供的API和 uniapp 开发的稍微有点区别 这里只记录 uniapp 开发的 如果需要微信
  • 高中学历的程序员,以包装的方式进入现在的公司,想跳槽咋办?

    网友自述 我在现在广州这家公司工作了两年 技术上有一定提升 但这两年我过得一直不是很快乐 因为我学历包装 所以我不敢跟同事交往太深 一直孤身一人 非常难受 可能这就是代价吧 现在我想换一个公司 我不想再用假身份了 但不知道用高中学历是否能够
  • Java对点、线、面生成栅格瓦片jpg,并渲染呈现

    Java对点 线 面生成栅格瓦片jpg 并渲染呈现 1 效果图 2 原理 2 1 面瓦片的生成 2 2 线瓦片的生成 2 3 多点瓦片的生成 3 源码 参考 这篇博客将介绍从前端HTML页面到后端预生成栅格瓦片jpg 并提供查询接口供前端h
  • Python文件操作

    1 with open E 信息 docx rb as f 2 read data f read 3 f closed rb 以二进制形式读取指定路径的文件 再以二进制形式写入指定路径 wb 1 with open E 信息 2 docx
  • Go Web编程实战(6)----反射

    目录 反射 反射的3大原则 接口类型变量 转换为 反射类型对象 反射类型对象 转换为 接口类型变量 反射类型对象 修改 值必 可写的 反射 与其他语言一样 Go语言的反射同样是指 计算机程序在运行时 可以访问 检测和修改它本身状态或行为的一
  • MAC 怎么终端怎么退出和进入Anaconda环境

    mac安装完anaconda 后 命令行窗口默认使用conda的 取消默认 用以下一行代码在命令行运行即可 重启终端 conda config set auto activate base false 将false改为true设置默认环境为
  • Codeforces 1475C. Ball in Berland(二元容斥)

    题目传送门 题意 一个班级有a个男生和b个女生 现在这个班级有k对男女愿意一起出席毕业典礼 这里注意k对男女中可能会有某个男生或女生出现在多个pair中 你从这k对中找出两对 使得这两对中的男生不相同 女生不相同 即一个男生或女生不可能在一
  • cuda 矩阵乘法,从最容易理解到算得最快(第二版源码-tile机制+共享内存)

    下面我们仅仅引入tiling方法 在共享内存中进行分块矩阵的乘法运算 先分析一下能够减少多少次对全局存储区的访问 当M N K 4096时 用第一版的代码 忽略cache的缓存时 需要从全局存储区读取2 4096 3 个float变量 为了
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010

    意大利著名好车品牌 法拉利 一直在世界上享受名誉 该游戏作品将带领玩家感悟法拉利的文化底蕴 游戏介绍 法拉利虚拟学院2010 包括了2010款法拉利F1赛车F10 以及三条通过镭射扫描技术绘制的高精度赛道 Fiorano Mugello N
  • spring boot 简介以及作用

    我们都知道spring是一个功能非常强大的框架 但是它也存在非常不好的弱点 也是对于我们普通的程序员的致命的弱点 就是它的配置文件太多了 而 在开发界一直有一句话 就是约定大于配置 这样一句话 就是说系统 类库 框架应该假定合理的默认值 而
  • JsonObject对象和jsonArrsy数组的获取JDK1.8,添加到表中

    1 基础数据结构 一个合同号对应多个批号 一个批号对应多个车辆 arrivalReport contractContent contractNumber 2021 11 17合同号 orderNumber 2021 11 17 0032订单
  • AbstractQueuedSynchronizer之AQS

    文章目录 AbstractQueuedSynchronizer AQS 概述 基本原理 实现细节 等待队列 state属性 独占模式 ReentrantLock AbstractQueuedSynchronizer AQS 概述 Abstr
  • 爬虫学习笔记(十五)——加密解密

    文章目录 一 概念和作用 1 1 概念 1 2 作用 1 3 常用加密方式 二 字符编码 2 1 进制间转换方法 python 2 2 unicode 三 Base64编码原理 3 1 概念 3 2 作用 3 3 Base64编码表 3 4