RSA:什么是RSA、算法及加密应用

作者: IT Sectr 发布日期: 2026-04-02 阅读时间: 9 分钟

RSA — 一种基于大数分解计算复杂性的公钥密码系统,提供加密和数字签名功能。根据NIST Special Publication 800-56B Rev. 2(2023),2048位密钥长度的RSA仍然是政府和商业系统的安全标准。该算法广泛应用于TLS协议、数字签名和移动应用程序中的数据加密。

要点

  • RSA — 非对称加密算法,使用一对密钥:公钥和私钥。
  • 安全性 基于将大数分解为质因数的数学难度。
  • 密钥大小 2048位自2023年起根据NIST标准被认为是最低可靠水平。
  • RSA 用于TLS证书、数字签名和身份验证协议。
  • 移动开发 通过内置加密库Android Keystore和iOS Security Framework使用RSA。

什么是RSA?

RSA — 一种公钥加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman于1977年开发。名称取自作者姓氏的首字母。该算法是第一个实际应用的非对称密码系统,其中加密和解密密钥不同。

发展历史

RSA算法于1977年在《科学美国人》杂志上发表,基于Whitfield Diffie和Martin Hellman先前在公钥密码学领域的工作。麻省理工学院于1983年获得了RSA的专利,有效期至2000年。根据RSA Laboratories(2023)的报告,该算法仍然是世界上最广泛的加密标准之一 — 每天在数十亿台设备中使用。

非对称原理

与使用相同密钥进行加密和解密的对称密码不同,RSA使用数学上相关的密钥对。公钥可以公开发布而不会危及系统安全。私钥仅所有者知道,从不通过网络传输。根据IBM Security X-Force Threat Intelligence Index(2024)的研究,非对称加密用于96%的现代安全数据传输协议。

数学基础

RSA的安全性基于因式分解问题 — 将两个大素数的乘积分解为因数。如果选择每个长度为1024位的素数p和q,那么它们的乘积n将为2048位。仅知道n而用现代方法计算p和q实际上是不可能的:根据CNRS(2024)的专家评估,破解RSA-2048需要在经典计算机上进行超过3000亿年的计算。

RSA算法如何工作

让我们考察RSA从密钥生成到消息加密和解密的完整工作周期。理解这些阶段对于在移动应用程序中正确实现该算法至关重要。

密钥生成

过程从选择两个大素数pq开始。计算模数n = p x q,它决定了密钥长度。然后计算欧拉函数phi(n) = (p-1)(q-1)。选择与phi(n)互质的公钥指数e。私钥指数d计算为e模phi(n)的乘法逆元。根据NIST SP 800-56B Rev. 2,n的最小长度应为2048位以确保充分保护。

java
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.SecureRandom;

public class RSAKeyGenerator {
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
        generator.initialize(2048, new SecureRandom());
        return generator.generateKeyPair();
    }
}

加密和解密

要加密消息m,发送方将其转换为小于n的整数并计算密文c = m^e mod n。接收方使用私钥d恢复原始消息:m = c^d mod n。需要注意的是,RSA由于性能较低不适用于加密大量数据 — 最大消息大小等于密钥长度减去服务字节(对于带OAEP的RSA-2048,约为190字节)。

java
import javax.crypto.Cipher;
import java.security.PublicKey;
import java.util.Base64;

public class RSAEncryptor {
    public static String encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encrypted = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encrypted);
    }
}

RSA数字签名

RSA还用于创建数字签名 — 一种验证数据真实性和完整性的机制。所有者用其私钥签署消息的哈希值,任何人可以用公钥验证签名。根据Sectigo Certificate Transparency(2025)的报告,互联网上超过85%的TLS证书使用RSA进行数字签名,这使得该算法成为网络通信信任的基础。

kotlin
import java.security.Signature

fun signData(data: ByteArray, privateKey: java.security.PrivateKey): ByteArray {
    val signature = Signature.getInstance("SHA256withRSA")
    signature.initSign(privateKey)
    signature.update(data)
    return signature.sign()
}

fun verifySignature(
    data: ByteArray, signedData: ByteArray, publicKey: java.security.PublicKey
): Boolean {
    val signature = Signature.getInstance("SHA256withRSA")
    signature.initVerify(publicKey)
    signature.update(data)
    return signature.verify(signedData)
}

密钥大小与安全级别

密钥长度直接影响RSA的密码强度。随着计算能力的增长,国际标准化组织定期审查最小允许的密钥大小。让我们来看看NIST和其他监管机构的当前建议。

密钥长度对称等效状态
1024位80位自2023年起禁止
2048位112位最低标准
3072位128位推荐用于新系统
4096位256位用于机密数据

对性能的影响

增加RSA密钥长度会显著影响操作执行时间。生成4096位密钥的时间约为2048位的10倍。长密钥的加密和解密操作需要更多计算资源,这对于能耗有限的移动设备至关重要。

量子威胁

随着量子计算的发展,RSA可能通过Shor算法在多项式时间内被破解。该算法由Peter Shor于1994年提出,允许在O((log n)^3)次操作内对大数进行因式分解。根据IBM Quantum Roadmap(2025),RSA-2048的实际破解预计不早于2035年,但NIST已经建议逐步过渡到后量子算法CRYSTALS-Kyber和CRYSTALS-Dilithium。

RSA在移动开发中的应用

RSA在移动应用程序中被积极用于确保安全数据传输、验证服务器真实性和保护数字交易。通过两个主要平台的标准加密API进行集成。

Android Keystore

Android平台提供Android Keystore — 一种受Trusted Execution Environment硬件级别保护的加密密钥系统存储。在KeyStore中生成的RSA密钥即使在应用程序被攻破时也无法从设备中提取。这提供了针对广泛攻击类别(包括具有root权限的恶意软件)的保护。

kotlin
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyPairGenerator

fun generateKeyInAndroidKeystore() {
    val generator = KeyPairGenerator.getInstance(
        KeyProperties.KEY_ALGORITHM_RSA,
        "AndroidKeyStore"
    )
    val spec = KeyGenParameterSpec.Builder(
        "rsa_key_pair",
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
    )
        .setKeySize(2048)
        .setBlockModes(KeyProperties.BLOCK_MODE_ECB)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
        .build()
    generator.initialize(spec)
    val keyPair = generator.generateKeyPair()
}

iOS Security Framework

在iOS中,使用Security Framework配合Secure Enclave(在配备A7芯片及更新版本的设备上)进行RSA操作。Secure Enclave是一个与主处理器隔离的专用协处理器,执行加密操作并在硬件安全区中存储密钥。RSA密钥既可以在Secure Enclave内部生成,也可以在具有不同访问级别的软件Keychain中生成。

实践中的混合加密

在实际的移动应用程序中,RSA很少直接用于加密大量数据。标准做法是混合方案:应用程序生成AES会话密钥,用服务器的RSA公钥加密并发送到服务器。所有后续流量都用AES加密,这比通过RSA直接传输数据快100–1000倍。

RSA的优势与局限性

与任何加密算法一样,RSA有优点和缺点,在设计安全系统时必须加以考虑。客观评估有助于为特定任务选择合适的工具。

主要优势

RSA的主要优势在于解决了密钥分发的基本问题 — 公钥可以自由发布而不会危及整个系统。该算法的通用性体现在用同一密钥对既支持加密又支持数字签名。此外,RSA拥有广泛的支持生态系统:库可用于所有语言和平台。

主要局限性

RSA的主要缺点是与对称算法相比性能较低。RSA-2048在现代移动处理器上解密大约需要5–15毫秒,而AES-256在同一时间内处理千兆字节数据。此外,RSA容易受到Shor算法的量子攻击,这限制了其在需要长期数据保护的系统中的应用。

使用建议

对于移动项目,NIST专家建议:仅将RSA用于密钥加密和数字签名,为新项目选择至少3072位的密钥长度,在混合方案中将RSA与AES结合使用,并关注后量子标准的发展以便在长期内进行计划迁移。

常见问题

RSA和AES有什么区别?

RSA — 带密钥对的非对称算法,用于加密小量数据和数字签名。AES — 带单个共享密钥的对称算法,比RSA快100–1000倍。在现代系统中它们结合使用:RSA保护AES会话密钥的传输,AES加密主要流量

今天什么大小的RSA密钥被认为是安全的?

自2023年起,根据NIST SP 800-131A Rev. 2,最小安全大小为RSA-2048。1024位密钥已被正式禁止用于美国政府系统。对于新项目,建议使用3072位密钥,这提供了安全裕度和与128位对称加密相当的强度。

RSA可以在移动应用程序中使用吗?

可以,RSA在移动应用程序中被广泛使用。Android提供Android KeyStore用于硬件生成和安全存储RSA密钥。iOS提供带有Secure Enclave支持的Security Framework。对于大数据加密,建议使用RSA + AES混合方案,其中RSA只加密会话密钥

RSA-2048可以被破解吗?

在经典计算机上,破解RSA-2048实际上是不可能的 — 根据当前估计,需要超过3000亿年的连续计算。然而,拥有足够数量量子比特的量子计算机可以使用Shor算法在几分钟内破解RSA-2048。根据IBM的估计,这样的计算机不会在2035年之前出现。

RSA有哪些替代方案?

在非对称算法中,ECC(椭圆曲线密码学)很流行,它以更短的密钥长度提供等效安全性 — 256位ECC相当于RSA-3072。对于后量子时代,NIST于2024年选择了CRYSTALS-Kyber用于加密和CRYSTALS-Dilithium用于数字签名

总结

  • RSA — 基于大数因式分解难度的非对称加密算法。
  • 密钥对 — 公钥用于加密,私钥用于解密,解决密钥分发问题。
  • 2048位大小 是自2023年起的最低安全标准。
  • 性能 RSA比对称密码低2–3个数量级,因此用于混合方案。
  • 数字签名 RSA用于互联网85%的TLS证书。
  • 移动平台 Android和iOS提供用于RSA操作的内置API。
  • 后量子迁移 — 到2035年RSA仍将是主要标准,之后将开始向新算法过渡。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读