RSA和AES性能探究
要想知道对称加密和非对称加密的性能,我们得先了解什么是对称加密什么是费对称加密。

一、什么是非对称加密
费对称加密(也叫“非对称加密”)是一种加密方式,它使用一对密钥进行加密和解密:
- 公钥(Public Key):可以公开,任何人都能使用它来加密信息。
- 私钥(Private Key):必须保密,只有拥有者可以使用它来解密信息。
这种方式的核心特点是:用公钥加密的信息,只能用对应的私钥解密,反之亦然。 “非对称加密的核心是 “一对密钥”(公钥和私钥),这对密钥有两个主要用途:
** 公钥加密,私钥解密(用于数据加密)**
- 发送方用接收方的公钥加密数据
- 只有接收方的私钥才能解密
比喻:保险箱
- 你是大明星,粉丝想给你写信,但不想让其他人偷看。
- 你在广场放了一个只能放入东西但无法打开的保险箱(公钥),任何人都能往里面投信(加密)。
- 只有你自己有保险箱的钥匙(私钥),你才能取出信件(解密)。 实际应用:HTTPS / 数据传输安全
当你访问 HTTPS 网站时,浏览器会用服务器的公钥加密数据,服务器再用私钥解密,确保信息不会被窃听。
2. 私钥加密,公钥解密(用于数字签名)
- 发送方用自己的私钥加密数据
- 任何人都可以用发送方的公钥解密并验证数据的真实性
比喻:盖章签名
- 你是公司 CEO,想发布一份重要公告,员工需要确认这真的是你写的。
- 你用**独一无二的私人印章(私钥)**盖章(加密)。
- 任何员工都可以用**公司公开的印章鉴定器(公钥)**来验证盖章的真实性(解密),但无法伪造你的印章。
实际应用:数字签名 / 区块链
- 电子合同、区块链交易、软件安装包验证等场景都依赖这个逻辑。
综合应用示例
以 HTTPS 通信 为例:
- 服务器把自己的公钥发给浏览器。
- 浏览器用这个公钥加密数据并发送给服务器(确保传输安全)。
- 服务器用私钥解密获取数据。
- 服务器用私钥签名响应数据,浏览器再用公钥验证数据的真实性。
这就是 公钥加密、私钥解密 和 私钥加密、公钥解密 的逻辑!”
二、什么是对称加密
对称加密(Symmetric Encryption)是一种加密方式,加密和解密使用的是同一个密钥。
- 特点:
- 加密和解密都使用相同的密钥
- 速度快,适合加密大量数据
- 但密钥必须安全传输,否则容易被窃取
通俗易懂的例子:上锁的日记本
想象你有一个日记本,里面记录了很多秘密。你用一把独特的钥匙锁住它:
- 你(发送者)用同一把钥匙把日记本锁起来(加密)。
- 你把日记本交给你的朋友(接收者),但你们必须用某种方式私下传递这把钥匙。
- 你的朋友收到日记本后,用同样的钥匙打开锁(解密),阅读内容。 核心逻辑:加密和解密用的是同一把钥匙**。
常见的对称加密算法
- AES(高级加密标准) → 目前最流行,安全性高
- DES(数据加密标准) → 早期使用,现在已被淘汰
- ChaCha20 → 适用于移动设备,更省电
对称加密的应用
文件加密(压缩包密码保护)
数据库加密(存储敏感数据)
无线网络安全(WPA2 加密)
但缺点是:密钥需要安全传输,一旦泄露,数据就不安全了!
这就是为什么现代网络安全通常结合非对称加密(比如 HTTPS 先用非对称加密传递密钥,再用对称加密加速数据传输)。
三、对称加密和非对称加密的性能对比
RSA处理如下:
- 生成 2048 位 RSA 密钥对。
- 使用 RSA 公钥 加密数据。
- 使用 RSA 私钥 解密数据,并输出解密结果。
- 计算 RSA 的执行时间。
AES 处理如下:
- 生成 AES-256 密钥 和 IV(初始向量)。
- 使用 AES-256-CBC 模式 加密数据。
- 再次解密,验证是否正确。
- 计算 AES 的执行时间。
具体代码如下
const crypto = require("crypto");
// 生成 2048 位 RSA 密钥对
const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
modulusLength: 2048,
publicKeyEncoding: { type: "spki", format: "pem" },
privateKeyEncoding: { type: "pkcs8", format: "pem" },
});
// 生成 256 位 AES 密钥
const aesKey = crypto.randomBytes(32); // 256-bit key
const aesIv = crypto.randomBytes(16); // 16-byte IV
const data = "这是一段用于测试加密和解密性能的数据,包含多个字符。";
// 计算执行时间的函数
function measureTime(fn, label) {
const start = process.hrtime.bigint();
fn();
const end = process.hrtime.bigint();
console.log(`${label} 耗时: ${(end - start) / BigInt(1e6)} ms`);
}
// **RSA 加密 & 解密**
function rsaEncryptDecrypt() {
// 加密
const encryptedData = crypto.publicEncrypt(
{ key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING },
Buffer.from(data, "utf8"),
);
// 解密
const decryptedData = crypto.privateDecrypt(
{ key: privateKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING },
encryptedData,
);
console.log("RSA 解密结果:", decryptedData.toString("utf8"));
}
// **AES 加密 & 解密**
function aesEncryptDecrypt() {
// AES 加密
const cipher = crypto.createCipheriv("aes-256-cbc", aesKey, aesIv);
let encryptedData = cipher.update(data, "utf8", "hex");
encryptedData += cipher.final("hex");
// AES 解密
const decipher = crypto.createDecipheriv("aes-256-cbc", aesKey, aesIv);
let decryptedData = decipher.update(encryptedData, "hex", "utf8");
decryptedData += decipher.final("utf8");
console.log("AES 解密结果:", decryptedData);
}
// **测试 RSA 和 AES 的性能**
measureTime(rsaEncryptDecrypt, "RSA 加密 & 解密");
measureTime(aesEncryptDecrypt, "AES 加密 & 解密");性能对比
RSA 解密结果: 这是一段用于测试加密和解密性能的数据,包含多个字符。
RSA 加密 & 解密 耗时: 31 ms
AES 解密结果: 这是一段用于测试加密和解密性能的数据,包含多个字符。
AES 加密 & 解密 耗时: 1 ms进一步对比
如果我们使用一个I7的处理器+16GB内存的服务器,能对服务器性能有多大影响呢?
性能数据举例
- RSA 加解密性能
假设我们使用 2048 位的 RSA 密钥(常见的安全配置),并处理不同大小的数据。RSA 的加解密时间通常会随着密钥长度的增加而显著增加。我们可以用以下的一些大致数据来说明:
- RSA 2048 位加密性能:
- 加密 1KB 数据:大约需要 2-3 毫秒。
- 加密 10KB 数据:大约需要 20-30 毫秒。
- 加密 1MB 数据:大约需要 200-300 毫秒。
- AES 加解密性能
AES 加解密的速度明显快得多,尤其是在现代硬件上,许多 CPU 都有内建的硬件加速支持 AES。
- AES 256 位加密性能:
- 加密 1KB 数据:大约需要 0.02 毫秒(非常快)。
- 加密 10KB 数据:大约需要 0.2 毫秒。
- 加密 1MB 数据:大约需要 2 毫秒。
- 比较:RSA vs AES
| 数据大小 | RSA 加密时间 (2048 位) | AES 加密时间 (256 位) |
|---|---|---|
| 1KB | 2-3 毫秒 | 0.02 毫秒 |
| 10KB | 20-30 毫秒 | 0.2 毫秒 |
| 1MB | 200-300 毫秒 | 2 毫秒 |
- 对比的结果
- RSA 的开销远高于 AES:在处理相同大小的数据时,RSA 的加密和解密速度通常比 AES 慢 100 到 1000 倍。尤其是 RSA 用于大数据加密时,性能差异显著。例如,加密 1MB 数据时,RSA 需要 200-300 毫秒,而 AES 只需要 2 毫秒。
- 高并发场景中的影响:假设你的服务器每秒处理 1000 个请求,如果使用 RSA 对每个请求进行加密,RSA 每次需要 2-3 毫秒来加密 1KB 数据,那么仅加密部分就会导致每秒只有 300 个请求能够得到及时响应(如果不加速的话)。而如果使用 AES,每个请求加密时间仅为 0.02 毫秒,可以处理高达 50,000 个请求。
- 服务器负载:如果服务器需要处理大量加密请求(如每秒处理成千上万的请求),RSA 的高开销会导致 CPU 占用率飙升,并且 内存使用增加,严重时可能导致服务器的响应延迟大幅增加,甚至宕机。相比之下,AES 的加密性能非常高,因此不会给服务器带来这么大的压力。
- 示例:并发请求下的服务器压力
假设一个典型 Web 应用使用非对称加密(RSA)进行用户认证,每个用户请求都会加密部分数据,并发送回服务器进行验证。
- 处理 1000 个请求(每个请求 1KB 数据):
- 使用 RSA 2048 位:每个请求加密大约 2-3 毫秒,总共需要大约 2000-3000 毫秒。如果服务器只允许每秒处理 300 个请求,那么 1000 个请求的处理时间就需要 3 秒。
- 使用 AES 256 位:每个请求加密只需 0.02 毫秒,总共需要大约 20 毫秒。服务器能够轻松处理每秒 50,000 个请求。
- 总结
- 服务器压力:RSA 对大数据加密的开销远大于 AES,尤其是在高并发的情况下,使用 RSA 会显著增加服务器负载,降低响应速度,甚至影响整体服务可用性。
- 实际应用场景:由于 RSA 的加解密性能较差,通常 非对称加密仅用于小数据的加密,如签名和密钥交换,而 对称加密(AES)则用于实际的数据传输和存储。这种结合使用的方式大大减轻了服务器的压力。
- 方案优化
为了避免性能问题,可以采用 混合加密 方案:
- 使用 RSA 或 ECC(椭圆曲线加密)来交换 对称密钥。
- 交换密钥后,使用 AES 来加密实际的数据传输。
这种方式结合了非对称加密的安全性和对称加密的高效性,在保证安全的同时,显著提高了系统的吞吐量。
真正的计算
在一个具有 16GB 内存 和 Intel i7 11代处理器 的服务器上,使用 RSA 和 AES 进行加密操作时,服务器的性能会受到多方面因素的影响。我们可以从 内存、CPU 性能和加密算法 这三个维度来分析它对服务器压力的具体影响。
1. 服务器配置概述
- 内存: 16GB,足够大,可以容纳多个并发连接、存储加密数据以及在内存中执行复杂的计算任务。
- 处理器: Intel i7 11代,通常拥有 4-8 核,每个核心支持 超线程,这意味着该处理器在多任务和并发计算时的性能较强。
2. RSA 加解密性能对服务器的影响
RSA 加密算法对 CPU 资源的消耗较大,尤其是对于 2048 位 或更长的密钥。以此为例,RSA 在加解密时的计算复杂度为 O(n^3),其中 n 是密钥的位数,因此随着密钥长度的增加,计算量显著增长。
性能评估:
- RSA 加密/解密时间:
- 2048 位 RSA:加解密 1KB 数据大约需要 2-3 毫秒,而 10KB 数据大约需要 20-30 毫秒,1MB 数据大约需要 200-300 毫秒。
- RSA 性能瓶颈:即使是现代的高性能处理器(如 Intel i7),处理 RSA 加密操作时也会受到 CPU 限制,特别是 密钥交换、签名验证和加密/解密大量数据时。这些操作会占用大量 CPU 时间。
对比 AES:
- AES 256 位:加密操作仅需要 0.02 毫秒 来加密 1KB 数据,差距显著。这种差距意味着 AES 对服务器的压力相对较小。
举例:
- 如果服务器需要处理 每秒 1000 个请求,且每个请求都进行 RSA 加解密操作:
- 使用 RSA(2048 位)加解密 1KB 数据:每个请求大约需要 2-3 毫秒。处理 1000 个请求 需要 2-3 秒。
- 使用 AES 256 位 加解密 1KB 数据:每个请求大约需要 0.02 毫秒,总处理时间为 0.02 秒,可轻松处理更多并发请求。
3. 内存使用
- RSA:每个请求在加密和解密时,需要在内存中存储加密数据和密钥。这可能会增加内存消耗,尤其是每个客户端都会携带自己的密钥或加密数据。如果同时有大量用户请求,内存消耗可能会相对较高。
- 例如,每个加密请求存储加密内容和会话信息,内存消耗可能达到 几十 MB 到数百 MB,但相对于服务器的总内存(16GB)来说并不会直接造成崩溃。
- AES:加密和解密的内存消耗相对较少,因为 AES 加密时并不需要处理长密钥和复杂的加解密过程。因此,相同的数据大小下,AES 相比 RSA 消耗更少的内存。
4. CPU 性能影响
即便服务器配置了 i7 11代处理器,RSA 算法的计算复杂度仍然意味着 单个加密请求 的处理会占用相对较多的 CPU 时间。
- 并发处理:如果服务器需要处理大量并发的 RSA 请求,CPU 核心数和超线程会帮助分担负载,但在请求量非常大的情况下,仍然可能会出现性能瓶颈。特别是 RSA 加密操作无法有效利用多个 CPU 核心进行并行处理。
5. 在高并发下的压力测试
假设服务器在 高并发 下处理加密请求:
- 每秒 1000 个请求,每个请求大小为 1KB,使用 RSA 2048 位加解密:
- 需要大约 2-3 毫秒 来加解密 1KB 数据,总处理时间 2-3 秒 来完成 1000 个请求。
- 假如这些请求是高度并发的,服务器需要在 1 秒内处理所有请求,理论上,它可能只能处理 300 到 400 个请求,而每秒 1000 个请求的负载就会导致延迟增加。
6. 优化建议
- 混合加密:为了减少 RSA 的性能瓶颈,通常会使用 混合加密:
- RSA 用于 密钥交换(传输对称密钥)。
- AES 用于加密 实际数据,这减少了 RSA 对性能的依赖。
- 硬件加速:现代 CPU(包括 i7 11代)支持 AES 的硬件加速,因此可以显著提高对称加密的性能。
- 限流和负载均衡:为了处理高并发请求,结合 负载均衡 和 限流 策略,保证在请求激增时,服务器可以稳定运行。
7. 总结
- RSA 的性能开销大,特别是在需要高并发处理时,可能会导致 CPU 占用率飙升,进而导致延迟增加,影响用户体验。
- 相较之下, AES 的加密解密速度更快,特别适合用于大数据传输和频繁加解密的场景。
- 为了提高服务器的处理能力,推荐使用 RSA 用于密钥交换,然后使用 AES 进行实际的数据加密,同时确保硬件加速和高效的负载均衡策略。