Python开发杀毒软件:RSA密钥生成过慢,求更快非对称加密方案
我出于兴趣正在用Python开发一款杀毒软件,希望通过RSA这类公钥-私钥(非对称)加密系统加密恶意文件,使其无法传播且无法访问。
当前我用Flask写的代码如下:
@app.route('/getstatus', methods=['GET']) def getstatus(): values = request.get_json() id = values['id'] size = values['size'] if id in IDS: status = IDS[id]['status'] else: pubkey, privkey = rsa.newkeys(size) IDS[id] = {'id': id, 'status': 'INFECTED', 'pubkey': pubkey.save_pkcs1("PEM").decode('utf-8'), 'privkey': privkey.save_pkcs1("PEM").decode('utf-8')} status = 'INFECTED' with open("ids.json", "w") as f: json.dump({'ids': IDS}, f) return jsonify({'status': status})
我会根据最大文件大小(乘以8以预留填充空间)确定密钥尺寸,但即使是图片、文本这类小文件,密钥生成速度也极慢。我需要确保客户端无法设置内容以避免病毒禁用杀毒软件,请问是否有更快的公钥-私钥加密系统?
首先要明确:非对称加密本身不适合直接加密大文件,哪怕是RSA或其他算法,因为非对称加密的性能远低于对称加密,且密钥长度对应加密内容的上限(比如RSA 2048位最多加密245字节左右)。你的当前思路里用文件大小来定密钥尺寸是错误的,这也是密钥生成慢的核心原因——你可能生成了远大于实际需要的密钥。
正确的做法是混合加密:用对称加密算法(如AES-256-GCM)加密文件本身,然后用非对称加密算法加密对称密钥。这样既保证了加密速度,又能利用非对称加密的密钥管理优势。
针对你的需求,推荐几个比RSA密钥生成更快的非对称加密方案:
ECC(椭圆曲线加密):
椭圆曲线加密在相同安全强度下,密钥尺寸远小于RSA(比如ECC 256位等价于RSA 3072位的安全强度),因此密钥生成速度快很多,加密解密的性能也更优。Python里可以用cryptography库的cryptography.hazmat.primitives.asymmetric.ec模块实现。Ed25519/Ed448:
这是基于椭圆曲线的签名算法,结合X25519/X448密钥交换可用于加密场景。这类算法的密钥生成速度极快,且性能出色,适合资源有限的场景。同样可以通过cryptography库实现。
另外,关于客户端不可篡改的问题:
- 不要让客户端决定密钥尺寸或加密参数,所有加密策略(密钥类型、长度、对称加密算法)都在服务端统一配置,客户端只负责上传文件元数据(如文件ID、大小),服务端生成密钥后返回公钥(或加密后的对称密钥)给客户端执行加密操作。
- 可以给客户端的操作结果添加数字签名,服务端验证签名确保操作未被篡改。
代码优化方向:
- 放弃用文件大小生成对应长度的RSA密钥,改用固定长度的ECC密钥(如secp256r1)。
- 采用混合加密流程:
- 服务端生成ECC密钥对。
- 客户端生成随机AES密钥,用AES加密恶意文件。
- 客户端用服务端的公钥加密AES密钥,将加密后的AES密钥和加密文件一起处理(本地存储或上传)。
- 不要每次请求都重新生成密钥,对于同一个文件ID,只生成一次密钥并持久化存储。
内容的提问来源于stack exchange,提问作者ShadowProgrammer

