对于AES和RSA的个人理解
最近学习爬虫 遇到一些加密的坑 然后了解到了AES和RSA 记录一下
AES
1.什么是AES
AES是一种对称的加密算法,运行要求低,不需要计算机有非常高的处理能力和大的内存, 加密速度很快;
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。
2.AES特点
1.最常用的对称加密算法
2.密钥建立时间短、灵敏性好、内存需求低
3.AES加密方式有五种:ECB, CBC, CTR, CFB, OFB;实际使用中,使用工作模式为CTR(最好用CBC去实现),此工作模式需要引入IV参数(16位的字节数组)
4.密钥长度有三种 分别是128 192 256,最长只有256bit ,其中192与256需要配置无政策限制权限文件(JDK6)
5.填充模式最常用的两种PKCS5Padding和PKCS7Padding,其中后者只有CBC独有。
6.加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。
加密流程图:
明文p : 没有经过加密的数据
密钥K:用来加密明文的密码,在对称加密算法中,加密的密钥和解密的密钥是相同的。密钥绝对不能泄露,否则会被获取还原密文,窃取数据
AES加密函数: 假设AES加密函数为A, 则C = A(K,P), 其中P为明文, K为密钥, C为密文,也就是说把明文和密钥作为加密函数的参数输入,就会加密为密文。
AES解密函数:假设AES解密函数为B, 则 P = B(K, C), 其中P为明文, K为密钥, C为密文,也就是说把密文和密钥作为解密函数的参数输入,就会解密还原回明文。
AES CBC加密解密样式代码:
Windows需要下载pycryptodome包 可以直接用pip install pycryptodome下载
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from binascii import b2a_hex, a2b_hex from Crypto.Cipher import AES # 如果text不足16位的倍数就用空格补足为16位 def add_to_16(text): if len(text.encode('utf-8')) % 16: add = 16 - (len(text.encode('utf-8')) % 16) else: add = 0 text = text + ('\0' * add) return text.encode('utf-8') def encrypt(text): # 加密函数 key = '9999999999999999'.encode('utf-8') mode = AES.MODE_CBC iv = b'qqqqqqqqqqqqqqqq' text = add_to_16(text) cryptos = AES.new(key, mode, iv) cipher_text = cryptos.encrypt(text) # 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串 return b2a_hex(cipher_text) # 解密后,去掉补足的空格用strip() 去掉 def decrypt(text): # 解密函数 key = '9999999999999999'.encode('utf-8') iv = b'qqqqqqqqqqqqqqqq' mode = AES.MODE_CBC cryptos = AES.new(key, mode, iv) plain_text = cryptos.decrypt(a2b_hex(text)) return bytes.decode(plain_text).rstrip('\0') a = encrypt('1234567') # 返回加密后的数据 b = decrypt(a) # 解密后的数据 print(a) print(b)
RSA
1.什么是RSA
RSA 加密原理
步骤 | 说明 | 描述 | 备注 |
---|---|---|---|
1 | 找出质数 | P 、Q | - |
2 | 计算公共模数 | N = P * Q | - |
3 | 欧拉函数 | φ(N) = (P-1)(Q-1) | - |
4 | 计算公钥E | 1 < E < φ(N) | E的取值必须是整数 E 和 φ(N) 必须是互质数 |
5 | 计算私钥D | E * D % φ(N) = 1 | - |
6 | 加密 | C = M E mod N | C:密文 M:明文 |
7 | 解密 | M =C D mod N | C:密文 M:明文 |
公钥=(E , N)
私钥=(D, N)
对外,只暴露公钥。
![](https://img2020.cnblogs.com/blog/1830020/202007/1830020-20200720212614585-2144351913.png)
私钥加密-公钥解密流程图:
![](https://img2020.cnblogs.com/blog/1830020/202007/1830020-20200720212724736-214020214.png)
RSA加解密样式代码:
需要下载rsa, pip install ras 下载
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import rsa # rsa加密 def rsaEncrypt(str): # 生成公钥、私钥 (pubkey, privkey) = rsa.newkeys(512) # print("公钥:\n%s\n私钥:\n:%s" % (pubkey, privkey)) # 明文编码格式 content = str.encode("utf-8") # 公钥加密 crypto = rsa.encrypt(content, pubkey) return (crypto, privkey) # rsa解密 def rsaDecrypt(str, pk): # 私钥解密 content = rsa.decrypt(str, pk) con = content.decode("utf-8") return con if __name__ == "__main__": str, pk = rsaEncrypt("hello") print("加密后密文:\n%s" % str) content = rsaDecrypt(str, pk) print("解密后明文:\n%s" % content)
AES和RSA的效率问题:
RSA:解密速度随加密文件大小呈线性增长,远远低于加密速度
AES:加密后的文件大小两倍于源文件,解密速度两倍于加密速度,当文件过大时可能会对内存造成影响,需要另行处理
____________________________________________________________________________________________________________