AES:是什么,对称加密算法及其用途

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

AES(Advanced Encryption Standard)是一种对称分组加密算法,于2001年被美国国家标准与技术研究院(NIST)采纳为官方标准。AES取代了过时的DES,此后成为世界上最广泛使用的加密算法,应用于从银行系统到移动应用的各个领域。根据NIST(2023)的数据,AES对于256位密钥提供相当于2^256次操作的强度,使其免受现代暴力破解攻击的影响。 NIST FIPS 197, 2023

要点

  • AES是一种对称分组密码,固定块大小为128位,密钥长度为128、192或256位。
  • GCM模式是移动应用推荐的AES工作模式,提供认证加密。
  • AES-256是最高强度版本,推荐用于保护高敏感性数据。
  • 硬件加速——处理器的AES-NI指令可在现代设备上实现高达10 GB/s的加密速度。
  • Android和iOS提供AES的内置API:Android Keystore和iOS CryptoKit,支持硬件加速。

什么是AES?

AES(Advanced Encryption Standard)是一种对称分组密码,由比利时密码学家Joan Daemen和Vincent Rijmen以Rijndael之名开发。2001年,NIST在经过五年的公开测试和分析后,选定Rijndael作为美国新加密标准竞赛的胜出者。AES以固定大小的数据块(128位)工作,支持三种密钥长度:128、192和256位。变换轮数取决于密钥长度:128位密钥10轮,192位12轮,256位14轮。每轮包括四种操作:SubBytes(通过S-box进行非线性字节替换)、ShiftRows(行循环移位)、MixColumns(列混合)和AddRoundKey(轮密钥加)。

AES标准的历史

AES的开发始于1997年,当时NIST宣布了取代DES的竞赛,DES的56位密钥于1998年在专用设备Deep Crack上22小时内被破解。来自不同国家的15种算法参与了竞赛,包括Serpent(英国)、Twofish(美国)和RC6(美国)。到1999年决赛,剩下5个候选。Rijndael凭借在所有平台(从8位微控制器到64位服务器)上的高速、抗密码分析能力和紧凑的硬件实现的组合而胜出。自2006年以来,AES被用于美国政府系统中SECRET和TOP SECRET级别数据的加密。如今,AES已嵌入所有主要协议:TLS 1.2/1.3、IPsec、SSH、Wi-Fi WPA2/WPA3和蓝牙BR/EDR。

AES加密如何工作

AES以128位(16字节)块处理数据,组织成4x4字节矩阵,称为state。每轮加密执行一系列确定性变换,共同产生“雪崩效应”:输入数据一个比特的变化会改变输出数据约50%的比特。这种效应使AES能够抵抗差分和线性密码分析——破解分组密码的主要方法。

过程从AddRoundKey开始——通过XOR操作将初始密钥应用于state。然后执行各轮:SubBytes用S-box(替换表)中的值替换state的每个字节。ShiftRows循环移动第二行1位、第三行2位、第四行3位——这确保了列之间的混合。MixColumns将state的每一列乘以伽罗瓦域GF(2^8)中的固定矩阵,创建每个输出字节对列中所有四个输入字节的依赖性。AddRoundKey应用通过密钥扩展过程从初始密钥获得的下一个轮密钥。最后一轮的区别在于没有MixColumns操作。解密使用逆操作InvSubBytes、InvShiftRows、InvMixColumns和AddRoundKey的逆序。对于移动开发者而言,不需要理解AES的内部结构——只需知道如何用正确参数调用平台的内置API即可。

雪崩效应与AES的密码强度

AES确保其密码强度的关键特性是雪崩效应(avalanche effect)。明文或密钥中一个比特的变化会导致密文约50%比特的变化,使AES对差分和线性密码分析极为抵抗。SubBytes(通过S-box的非线性)和MixColumns(通过伽罗瓦域乘法的扩散)操作的结合创造了数学复杂性,即使知道部分密文也无法比完全搜索更快地恢复密钥。根据NIST(2018)的分析,针对AES-128的最佳已知攻击——biclique攻击——仅将有效密钥长度减少2位(至126.2位),这并未给攻击者带来实际优势。对于AES-256,没有任何实际可行的攻击能超过完全搜索。

AES密钥大小与安全级别

AES支持三种密钥大小,每种对应特定的密码强度级别。密钥大小的选择影响安全性、性能以及对设备资源的要求。

密钥大小轮数安全级别应用
AES-12810128位商业应用,TLS
AES-19212192位政府系统(SECRET)
AES-25614256位TOP SECRET,金融行业

实用规则:在移动应用中默认使用AES-256。在支持AES-NI的现代设备上,AES-128和AES-256之间的性能差异不超过10–15%,但安全级别翻倍。根据量子分析(Grassl等,2016),通过Grover算法破解AES-128需要2^77次量子操作,而AES-256需要2^149次,这使AES-256能够在未来20–30年内抵抗量子攻击。即使是AES-128也为绝大多数商业场景提供足够的保护:根据Bruce Schneier的估计,完全搜索128位密钥所需的能量比宇宙中存在的还要多。然而,安全标准(GDPR、HIPAA、PCI DSS)通常明确要求AES-256,因此在生产项目中建议使用最大密钥长度。

AES工作模式

AES作为分组密码加密固定大小(128位)的块。对于任意长度数据的加密,使用工作模式(modes of operation)。模式的选择对安全有至关重要的影响:错误的模式可能完全破坏AES的强度。

  • ECB(电子密码本)——最简单且最不安全的模式。每个块用相同密钥独立加密。相同的明文块产生相同的密文块,使数据结构可被恢复。在所有现代安全标准中被禁止使用。切勿在移动应用中使用ECB。
  • CBC(密码块链接)——每个前一个密文块被用作下一个的初始化向量(IV)。每条消息需要随机IV。在错误实现时容易受到填充预言机攻击。适用于文件加密,但需要MAC(HMAC)确保数据完整性。
  • GCM(伽罗瓦/计数器模式)——移动应用的推荐模式。提供认证加密(AEAD):一步完成加密+完整性检查。使用计数器生成密钥流和伽罗瓦域乘法进行认证。GCM要求每条消息有唯一的nonce(12字节)。由NIST推荐,用于TLS 1.2/1.3和Android Keystore。
  • CCM(带CBC-MAC的计数器)——基于CTR+CBC-MAC的替代AEAD模式。比GCM慢且不支持并行处理。用于ZigBee和802.11(Wi-Fi)协议。对于移动应用,GCM更优。

对于移动项目,使用带12字节nonce的AES-256-GCM。GCM同时解决两个问题:数据加密和真实性验证,可防止填充预言机和选择密文攻击。Android Keystore和iOS CryptoKit开箱即用地支持AES-GCM,无需实现额外的加密原语。使用GCM时,切勿用相同密钥重复使用nonce——这会完全破坏加密安全。每次加密生成新的随机nonce,并与密文一起存储。

AES在移动应用中的实现

让我们看看在Android上使用Jetpack Security安全实现AES-256-GCM的示例。以下代码演示了完整流程:通过MasterKey创建AES-256密钥,加密和解密带附加认证数据(AAD)的字符串。

kotlin
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences

val masterKey = MasterKey.Builder(context)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .build()

val securePrefs = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

fun storeSecureData(key: String, value: String) {
    securePrefs.edit().putString(key, value).apply()
}

fun readSecureData(key: String): String? {
    return securePrefs.getString(key, null)
}

此解决方案的关键特性是在两个层面使用AES-256-GCM:用于加密键值对(PrefValueEncryptionScheme)和保护密钥名称本身(PrefKeyEncryptionScheme使用对nonce重复具有抵抗力的AES-256-SIV)。MasterKey使用AES-256-GCM算法生成,并存储在Android Keystore中,在具有可信执行环境的设备上受硬件保护。在无硬件支持(TEE)的设备上,密钥通过Bouncy Castle加密,这仍然比存储在SharedPreferences中更安全。

对于大量数据(如图像或文件)的直接加密,使用AndroidX Security的EncryptedFile通过AES-256-GCM进行。对于密钥的导出(如备份),使用PBKDF2通过用户密码进行额外加密,迭代次数为100000+。

通过CryptoKit在iOS上使用AES

iOS上,AES的使用通过CryptoKit框架(Swift 5.0+)组织。AES-256密钥通过SymmetricKey(size: .bits256)创建,并存储在Secure Enclave中——一个与主CPU和操作系统隔离的硬件加密处理器。CryptoKit提供两种AES实现:AES.GCM(推荐)和AES.CBC(用于向后兼容旧格式)。加密通过seal()方法进行,该方法接收数据、密钥和nonce(12字节),并返回AES.GCM.SealedBox——一个包含密文和认证标签的结构。解密通过open()进行。Apple强烈不建议直接使用CommonCrypto:CryptoKit自动选择最优参数,防止侧信道攻击,并在Apple Silicon处理器上使用AES-NI硬件加速。在具有Secure Enclave的设备上,密钥永远不会离开硬件模块,即使在应用完全被攻陷的情况下也无法被盗取。密钥序列化使用withUnsafeBytes方法,随后通过SecItemAdd将密钥存储在Keychain中,属性为kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly。

常见问题

用简单的话说AES是什么?

AES是一种算法,它使用秘密密钥将可读数据转换为不可读的字节集合。同样的密钥需要将数据恢复为原始形式。AES非常可靠,被用于加密美国政府的机密文件。

AES-128和AES-256有什么区别?

AES-128使用128位密钥,执行10轮加密。AES-256使用256位密钥和14轮,使其破解难度增加2^128倍。对于移动应用,由于性能差异极小,推荐使用AES-256。

哪种AES模式最安全?

AES-256-GCM是最安全且推荐的模式。GCM提供认证加密(加密+完整性检查)。ECB模式被禁止使用,CBC需要单独的MAC。GCM是移动应用的事实标准。

AES能被破解吗?

理论上,AES可以通过完全搜索被破解,但对于AES-256需要2^256次尝试——比可观测宇宙中的原子还多。针对AES-256的实际攻击不存在。侧信道攻击(Spectre、Meltdown)不破解AES,而是从内存中窃取密钥,因此硬件存储密钥至关重要。

如何在Android移动应用中使用AES?

使用AndroidX Security库:KeyScheme.AES256_GCM的MasterKey.Builder在Android Keystore中创建受保护的密钥,EncryptedSharedPreferences通过AES-256-GCM自动加密所有数据。无需手动加密——API默认安全,无水开发者错误的风险。

总结

  • AES是2001年由NIST标准化的最广泛使用和最成熟的对称加密算法。
  • AES-256提供最高强度的保护,为未来20–30年的量子攻击预留了余量。
  • GCM模式是移动应用的唯一推荐模式:一步完成加密+认证。
  • Android Keystore和iOS Secure Enclave是将AES密钥与应用程序隔离的硬件存储。
  • Jetpack Security(Android)和CryptoKit(iOS)提供无需手动加密的安全AES-256-GCM实现。
  • GCM的Nonce(IV)必须对每次加密唯一——重复会完全破坏安全性。
  • 建议:对所有机密数据,在Android上使用EncryptedSharedPreferences,在iOS上使用CryptoKit,通过AES-256-GCM进行保护。

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

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

讨论项目

另请阅读