AES(Advanced Encryption Standard)是一种对称分组加密算法,于2001年被美国国家标准与技术研究院(NIST)采纳为官方标准。AES取代了过时的DES,此后成为世界上最广泛使用的加密算法,应用于从银行系统到移动应用的各个领域。根据NIST(2023)的数据,AES对于256位密钥提供相当于2^256次操作的强度,使其免受现代暴力破解攻击的影响。 NIST FIPS 197, 2023
要点
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的开发始于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以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确保其密码强度的关键特性是雪崩效应(avalanche effect)。明文或密钥中一个比特的变化会导致密文约50%比特的变化,使AES对差分和线性密码分析极为抵抗。SubBytes(通过S-box的非线性)和MixColumns(通过伽罗瓦域乘法的扩散)操作的结合创造了数学复杂性,即使知道部分密文也无法比完全搜索更快地恢复密钥。根据NIST(2018)的分析,针对AES-128的最佳已知攻击——biclique攻击——仅将有效密钥长度减少2位(至126.2位),这并未给攻击者带来实际优势。对于AES-256,没有任何实际可行的攻击能超过完全搜索。
AES支持三种密钥大小,每种对应特定的密码强度级别。密钥大小的选择影响安全性、性能以及对设备资源的要求。
| 密钥大小 | 轮数 | 安全级别 | 应用 |
|---|---|---|---|
| AES-128 | 10 | 128位 | 商业应用,TLS |
| AES-192 | 12 | 192位 | 政府系统(SECRET) |
| AES-256 | 14 | 256位 | 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作为分组密码加密固定大小(128位)的块。对于任意长度数据的加密,使用工作模式(modes of operation)。模式的选择对安全有至关重要的影响:错误的模式可能完全破坏AES的强度。
对于移动项目,使用带12字节nonce的AES-256-GCM。GCM同时解决两个问题:数据加密和真实性验证,可防止填充预言机和选择密文攻击。Android Keystore和iOS CryptoKit开箱即用地支持AES-GCM,无需实现额外的加密原语。使用GCM时,切勿用相同密钥重复使用nonce——这会完全破坏加密安全。每次加密生成新的随机nonce,并与密文一起存储。
让我们看看在Android上使用Jetpack Security安全实现AES-256-GCM的示例。以下代码演示了完整流程:通过MasterKey创建AES-256密钥,加密和解密带附加认证数据(AAD)的字符串。
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+。
在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-128使用128位密钥,执行10轮加密。AES-256使用256位密钥和14轮,使其破解难度增加2^128倍。对于移动应用,由于性能差异极小,推荐使用AES-256。
AES-256-GCM是最安全且推荐的模式。GCM提供认证加密(加密+完整性检查)。ECB模式被禁止使用,CBC需要单独的MAC。GCM是移动应用的事实标准。
理论上,AES可以通过完全搜索被破解,但对于AES-256需要2^256次尝试——比可观测宇宙中的原子还多。针对AES-256的实际攻击不存在。侧信道攻击(Spectre、Meltdown)不破解AES,而是从内存中窃取密钥,因此硬件存储密钥至关重要。
使用AndroidX Security库:KeyScheme.AES256_GCM的MasterKey.Builder在Android Keystore中创建受保护的密钥,EncryptedSharedPreferences通过AES-256-GCM自动加密所有数据。无需手动加密——API默认安全,无水开发者错误的风险。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。