RSA — 一种基于大数分解计算复杂性的公钥密码系统,提供加密和数字签名功能。根据NIST Special Publication 800-56B Rev. 2(2023),2048位密钥长度的RSA仍然是政府和商业系统的安全标准。该算法广泛应用于TLS协议、数字签名和移动应用程序中的数据加密。
要点
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从密钥生成到消息加密和解密的完整工作周期。理解这些阶段对于在移动应用程序中正确实现该算法至关重要。
过程从选择两个大素数p和q开始。计算模数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位以确保充分保护。
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字节)。
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还用于创建数字签名 — 一种验证数据真实性和完整性的机制。所有者用其私钥签署消息的哈希值,任何人可以用公钥验证签名。根据Sectigo Certificate Transparency(2025)的报告,互联网上超过85%的TLS证书使用RSA进行数字签名,这使得该算法成为网络通信信任的基础。
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在移动应用程序中被积极用于确保安全数据传输、验证服务器真实性和保护数字交易。通过两个主要平台的标准加密API进行集成。
Android平台提供Android Keystore — 一种受Trusted Execution Environment硬件级别保护的加密密钥系统存储。在KeyStore中生成的RSA密钥即使在应用程序被攻破时也无法从设备中提取。这提供了针对广泛攻击类别(包括具有root权限的恶意软件)的保护。
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配合Secure Enclave(在配备A7芯片及更新版本的设备上)进行RSA操作。Secure Enclave是一个与主处理器隔离的专用协处理器,执行加密操作并在硬件安全区中存储密钥。RSA密钥既可以在Secure Enclave内部生成,也可以在具有不同访问级别的软件Keychain中生成。
在实际的移动应用程序中,RSA很少直接用于加密大量数据。标准做法是混合方案:应用程序生成AES会话密钥,用服务器的RSA公钥加密并发送到服务器。所有后续流量都用AES加密,这比通过RSA直接传输数据快100–1000倍。
与任何加密算法一样,RSA有优点和缺点,在设计安全系统时必须加以考虑。客观评估有助于为特定任务选择合适的工具。
RSA的主要优势在于解决了密钥分发的基本问题 — 公钥可以自由发布而不会危及整个系统。该算法的通用性体现在用同一密钥对既支持加密又支持数字签名。此外,RSA拥有广泛的支持生态系统:库可用于所有语言和平台。
RSA的主要缺点是与对称算法相比性能较低。RSA-2048在现代移动处理器上解密大约需要5–15毫秒,而AES-256在同一时间内处理千兆字节数据。此外,RSA容易受到Shor算法的量子攻击,这限制了其在需要长期数据保护的系统中的应用。
对于移动项目,NIST专家建议:仅将RSA用于密钥加密和数字签名,为新项目选择至少3072位的密钥长度,在混合方案中将RSA与AES结合使用,并关注后量子标准的发展以便在长期内进行计划迁移。
常见问题
RSA — 带密钥对的非对称算法,用于加密小量数据和数字签名。AES — 带单个共享密钥的对称算法,比RSA快100–1000倍。在现代系统中它们结合使用:RSA保护AES会话密钥的传输,AES加密主要流量。
自2023年起,根据NIST SP 800-131A Rev. 2,最小安全大小为RSA-2048。1024位密钥已被正式禁止用于美国政府系统。对于新项目,建议使用3072位密钥,这提供了安全裕度和与128位对称加密相当的强度。
可以,RSA在移动应用程序中被广泛使用。Android提供Android KeyStore用于硬件生成和安全存储RSA密钥。iOS提供带有Secure Enclave支持的Security Framework。对于大数据加密,建议使用RSA + AES混合方案,其中RSA只加密会话密钥。
在经典计算机上,破解RSA-2048实际上是不可能的 — 根据当前估计,需要超过3000亿年的连续计算。然而,拥有足够数量量子比特的量子计算机可以使用Shor算法在几分钟内破解RSA-2048。根据IBM的估计,这样的计算机不会在2035年之前出现。
在非对称算法中,ECC(椭圆曲线密码学)很流行,它以更短的密钥长度提供等效安全性 — 256位ECC相当于RSA-3072。对于后量子时代,NIST于2024年选择了CRYSTALS-Kyber用于加密和CRYSTALS-Dilithium用于数字签名。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。