基于RSA和AES混合加密实现的加解密小工具
闲来无事,用python的tkinter开发了一个基于RSA和AES混合加密的小小工具。总结一下使用到的知识点。
首先是核心的加解密部分。
采用混合加密的原因,提到这个,就得先聊下RSA和AES各自的优缺点。
RSA
-
优点
安全,基于大数因式分解。而目前已破解的最高位数为1024 bit,采用2048将会很安全。且仅涉及到一次密钥传输,及将公钥随加密工具传输给使用者,私钥保留于本地,公钥即使被别人获取也没有影响。 -
缺点
- 加解密速度慢。由于都是大数计算,RSA最快的情况也比AES慢100倍。(快速幂取模运算,中国剩余定理CRT之后再写总结)
- 一次性只能加解密小于公共模数N的数据。例如我们采用utf8编码的汉字,一个字按3 bytes也就是24 bit算,一个2048 bit的RSA key最多只能加密2048/24差不多80字。如果要加密更长的数据,就要分组加密,无疑又放大了加解密速度慢这个缺点。
AES
-
优点
- 加解密速度快。
- 分组长度和密钥长度设计灵活。
- 数据长度不限。
-
缺点
由于是对称加密算法,加密解密使用同一把密钥,所以密钥传输过程中存在密钥被人获取的安全隐患。
所以一般采用RSA和对称加密算法结合的方式来弥补两种算法的缺点,即在保证密钥传输过程安全性的前提下,实现既快又多地加密数据。具体实现过程是:
加密时:
- 随机生成一个会话密钥,或者叫过程密钥
- 用此会话密钥加密数据
- 用RSA公钥加密会话密钥
- 将加密的会话密钥与数据的密文拼装起来发送出去,也可以选择生成校验码一起拼装发送,以防止数据传输过程中被人篡改。
解密时:
- 用RSA私钥解密会话密钥
- 使用会话密钥解密数据,如果有带校验码,此过程需要进行校验。
上代码
mycipher.py
from Cryptodome.Cipher import AES, PKCS1_OAEP
from Cryptodome.Random import get_random_bytes
from Cryptodome.PublicKey import RSA
AES_KEY_SIZE = 16
BLOCK_SIZE = 16
def generateRSAkey():
'''
生成长度为2048 bit的RSA公私钥,分别存放于两个文件中
'''
key = RSA.generate(2048)
private_key = key.export_key()
file_out = open("private.pem", "wb")
file_out.write(private_key)
file_out.close()
public_key = key.publickey().export_key()
file_out = open("public.pem", "wb")
file_out.write(public_key)
file_out.close()
class mycipher():
def __init__(self, rsakey):