Skip to content

RSA和AES性能探究

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

alt text

一、什么是非对称加密

费对称加密(也叫“非对称加密”)是一种加密方式,它使用一对密钥进行加密和解密:

  1. 公钥(Public Key):可以公开,任何人都能使用它来加密信息。
  2. 私钥(Private Key):必须保密,只有拥有者可以使用它来解密信息。

这种方式的核心特点是:用公钥加密的信息,只能用对应的私钥解密,反之亦然。 “非对称加密的核心是 “一对密钥”(公钥和私钥),这对密钥有两个主要用途:

** 公钥加密,私钥解密(用于数据加密)**

  • 发送方用接收方的公钥加密数据
  • 只有接收方的私钥才能解密

比喻:保险箱

  • 你是大明星,粉丝想给你写信,但不想让其他人偷看。
  • 你在广场放了一个只能放入东西但无法打开的保险箱(公钥),任何人都能往里面投信(加密)。
  • 只有你自己有保险箱的钥匙(私钥),你才能取出信件(解密)。 实际应用:HTTPS / 数据传输安全
    当你访问 HTTPS 网站时,浏览器会用服务器的公钥加密数据,服务器再用私钥解密,确保信息不会被窃听。

2. 私钥加密,公钥解密(用于数字签名)

  • 发送方用自己的私钥加密数据
  • 任何人都可以用发送方的公钥解密并验证数据的真实性

比喻:盖章签名

  • 你是公司 CEO,想发布一份重要公告,员工需要确认这真的是你写的。
  • 你用**独一无二的私人印章(私钥)**盖章(加密)。
  • 任何员工都可以用**公司公开的印章鉴定器(公钥)**来验证盖章的真实性(解密),但无法伪造你的印章。

实际应用:数字签名 / 区块链

  • 电子合同、区块链交易、软件安装包验证等场景都依赖这个逻辑。

综合应用示例

HTTPS 通信 为例:

  1. 服务器把自己的公钥发给浏览器。
  2. 浏览器用这个公钥加密数据并发送给服务器(确保传输安全)。
  3. 服务器用私钥解密获取数据。
  4. 服务器用私钥签名响应数据,浏览器再用公钥验证数据的真实性。

这就是 公钥加密、私钥解密私钥加密、公钥解密 的逻辑!”

二、什么是对称加密

对称加密(Symmetric Encryption)是一种加密方式,加密和解密使用的是同一个密钥

  • 特点:
  • 加密和解密都使用相同的密钥
  • 速度快,适合加密大量数据
  • 但密钥必须安全传输,否则容易被窃取

通俗易懂的例子:上锁的日记本

想象你有一个日记本,里面记录了很多秘密。你用一把独特的钥匙锁住它:

  1. 你(发送者)用同一把钥匙把日记本锁起来(加密)。
  2. 你把日记本交给你的朋友(接收者),但你们必须用某种方式私下传递这把钥匙
  3. 你的朋友收到日记本后,用同样的钥匙打开锁(解密),阅读内容。 核心逻辑:加密和解密用的是同一把钥匙**。

常见的对称加密算法

  • AES(高级加密标准) → 目前最流行,安全性高
  • DES(数据加密标准) → 早期使用,现在已被淘汰
  • ChaCha20 → 适用于移动设备,更省电

对称加密的应用

文件加密(压缩包密码保护)
数据库加密(存储敏感数据)
无线网络安全(WPA2 加密)

但缺点是:密钥需要安全传输,一旦泄露,数据就不安全了!
这就是为什么现代网络安全通常结合非对称加密(比如 HTTPS 先用非对称加密传递密钥,再用对称加密加速数据传输)。

三、对称加密和非对称加密的性能对比

RSA处理如下:

  • 生成 2048 位 RSA 密钥对
  • 使用 RSA 公钥 加密数据。
  • 使用 RSA 私钥 解密数据,并输出解密结果。
  • 计算 RSA 的执行时间。

AES 处理如下:

  • 生成 AES-256 密钥IV(初始向量)
  • 使用 AES-256-CBC 模式 加密数据。
  • 再次解密,验证是否正确。
  • 计算 AES 的执行时间。

具体代码如下

js
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 加密 & 解密");

性能对比

bash
  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 位)
1KB2-3 毫秒0.02 毫秒
10KB20-30 毫秒0.2 毫秒
1MB200-300 毫秒2 毫秒
  • 对比的结果
  1. RSA 的开销远高于 AES:在处理相同大小的数据时,RSA 的加密和解密速度通常比 AES 慢 100 到 1000 倍。尤其是 RSA 用于大数据加密时,性能差异显著。例如,加密 1MB 数据时,RSA 需要 200-300 毫秒,而 AES 只需要 2 毫秒。
  2. 高并发场景中的影响:假设你的服务器每秒处理 1000 个请求,如果使用 RSA 对每个请求进行加密,RSA 每次需要 2-3 毫秒来加密 1KB 数据,那么仅加密部分就会导致每秒只有 300 个请求能够得到及时响应(如果不加速的话)。而如果使用 AES,每个请求加密时间仅为 0.02 毫秒,可以处理高达 50,000 个请求。
  3. 服务器负载:如果服务器需要处理大量加密请求(如每秒处理成千上万的请求),RSA 的高开销会导致 CPU 占用率飙升,并且 内存使用增加,严重时可能导致服务器的响应延迟大幅增加,甚至宕机。相比之下,AES 的加密性能非常高,因此不会给服务器带来这么大的压力。
  • 示例:并发请求下的服务器压力

假设一个典型 Web 应用使用非对称加密(RSA)进行用户认证,每个用户请求都会加密部分数据,并发送回服务器进行验证。

  • 处理 1000 个请求(每个请求 1KB 数据)
  • 使用 RSA 2048 位:每个请求加密大约 2-3 毫秒,总共需要大约 2000-3000 毫秒。如果服务器只允许每秒处理 300 个请求,那么 1000 个请求的处理时间就需要 3 秒
  • 使用 AES 256 位:每个请求加密只需 0.02 毫秒,总共需要大约 20 毫秒。服务器能够轻松处理每秒 50,000 个请求。
  • 总结
  1. 服务器压力:RSA 对大数据加密的开销远大于 AES,尤其是在高并发的情况下,使用 RSA 会显著增加服务器负载,降低响应速度,甚至影响整体服务可用性。
  2. 实际应用场景:由于 RSA 的加解密性能较差,通常 非对称加密仅用于小数据的加密,如签名和密钥交换,而 对称加密(AES)则用于实际的数据传输和存储。这种结合使用的方式大大减轻了服务器的压力。
  • 方案优化

为了避免性能问题,可以采用 混合加密 方案:

  • 使用 RSAECC(椭圆曲线加密)来交换 对称密钥
  • 交换密钥后,使用 AES 来加密实际的数据传输。

这种方式结合了非对称加密的安全性和对称加密的高效性,在保证安全的同时,显著提高了系统的吞吐量。

真正的计算

在一个具有 16GB 内存Intel i7 11代处理器 的服务器上,使用 RSAAES 进行加密操作时,服务器的性能会受到多方面因素的影响。我们可以从 内存、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 进行实际的数据加密,同时确保硬件加速和高效的负载均衡策略。

四、参考文章

什么是非对称加密
什么是对称加密

五、demo地址

SE & AE

上次更新于: