基础知识
什么是加密和解密
- 加密(Encryption): 将明文数据变换为密文的过程
- 解密(Decryption): 加密的逆过程,即由密文恢复出原明文的过程
加密和解密算法的操作通常都是在一组密钥的控制下进行的,分别成为是加密密钥(Encryption Key)和解密密钥(Decryption Key)
而加密算法当中又分为是对称加密和非对称加密以及散列算法,其中
-
对称加密:
即加密与解密时使用的是相同的密钥,例如RC4、AES、DES等加密算法 -
非对称加密:
即加密与解密时使用不相同的密钥,例如RSA加密算法等 -
散列算法:
又称为是哈希函数。对不同长度的输入消息产生固定的输出,该输出值就是散列值
加密算法
1. Base64
Base64严格意义上来说不算做事加密的算法,只是一种编码的方式,它是一种用64个字符,分别是A-Z、a-z、0-9、+、/这64个字符,实现对数据的编码,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
import base64
# Base64编码实现
url = "www.baidu.com"
bytes_url = url.encode("utf-8")
str_url = base64.b64encode(bytes_url) # 被编码的参数必须是二进制数据
print(str_url)
# 输出结果为:b'd3d3LmJhaWR1LmNvbQ=='
#Base64解码实现
url = "d3d3LmJhaWR1LmNvbQ=="
str_url = base64.b64decode(url).decode("utf-8")
print(str_url)
#输出结果为:www.baidu.com
1. MD5
MD5是一种被广泛使用的线性散列算法,且加密之后产生的是一个固定长度(32位或者是16位)的数据,由字母和数字组成,大小写统一。其最后加密生成的数据是不可逆的,也就是说不能够轻易地通过加密后的数据还原到原始的字符串,除非是通过暴力破解的方式。
#md5加密
import hashlib
str = 'this is a md5 demo.'
hl = hashlib.md5()
hl.update(str.encode(encoding='utf-8'))
print('MD5加密前为 :' + str)
print('MD5加密后为 :' + hl.hexdigest())
#输出结果为
#MD5加密前为 :this is a md5 demo.
#MD5加密后为 :b2caf2a298a9254b38a2e33b75cfbe75
针对MD5加密可以通过暴力破解的方式来降低其安全性,因此在实操过程当中,我们会添加盐值(Salt)或者是双重MD5加密等方式来增加其可靠性,代码如下:
# post传入的参数
params = "123456"
# 加密后需拼接的盐值(Salt)
salt = "asdfkjalksdncxvm"
def md5_encrypt():
m = md5()
m.update(params.encode('utf8'))
sign1 = m.hexdigest()
return sign1
def md5_encrypt_with_salt():
m = md5()
m.update((md5_encrypt() + salt).encode('utf8'))
sign2 = m.hexdigest()
return sign2
AES
AES的全称是Advanced Encryption Standard,是DES算法的替代者,也是当今最流行的对称加密算法之一。
其中有三个基本概念:
- 密钥
密钥可以当作是一把钥匙,既可以用其来进行上锁,可以用其来进行解锁。AES支持三种长度的密钥:128位、192位以及256位。
- 填充
要了解填充,我们需要对AES的分组加密的特性进行了解
- 模式
AES的工作模式,体现在了把明文块加密成密文块的处理过程中,主要有五种不同的工作模式,分别是CBC、ECB、CTR、CFB以及OFB模式,同样地,如果在AES加密过程当中使用了某一种工作模式,解密的时候也必须采用同样地工作模式
import base64
#安装python的Crypto包有坑可以搜索解决
from Crypto.Cipher import AES
def AES_encrypt(text, key):
pad = 16 - len(text) % 16
text = text + pad * chr(pad)
text = text.encode("utf-8")
encryptor = AES.new(key.encode('utf-8'), AES.MODE_ECB)
encrypt_text = encryptor.encrypt(text)
encrypt_text = base64.b64encode(encrypt_text)
return encrypt_text.decode('utf-8')
至于其他的加密算法,我们后面继续进行了解,先对以上的base64、MD5、AES这些先掌握,后面我们探讨一下,DES、3DES,RAS、BASE58等等内容