“直接用AES-256”,这是安全领域被重复最多、也最没用的一句话。
![]()
密码算法本身几乎从不被攻破。真正出问题的是它周围的一切:一个能被猜到的密码、一个被重复使用的随机数(nonce)、一段没人验证过完整性的密文、一个用错函数派生出来的密钥。
换句话说,攻击者不会去硬碰一把256位的钥匙,他会去找那把钥匙是怎么造出来的。这个思路决定了现代加密设计的大部分选择:加密的强度,只等于攻击者能猜到的最便宜的那件东西。
下面按“三件事、三种工具”的顺序,把整套栈过一遍:AES、ChaCha20、Argon2id、HKDF、HMAC、X25519、Ed25519 和 Shamir 秘密分享。每一个都讲清楚它怎么工作、为什么存在、什么时候选它。
先分清加密其实是三个问题
加密这个词底下压着好几件不同的事。做之前先想威胁模型:假设攻击者手里有你的加密文件副本、有无限时间、还有一排GPU。
暴力破解256位密钥在物理上不可能,所以聪明的攻击者会绕过去,直接打那个生成密钥的密码。这就是为什么现代设计里,把密码变成密钥的那一步,比密钥长度更值得花心思。
AES:全世界的默认分组密码
AES(Rijndael,FIPS 197)用128、192或256位密钥加密128位分组,跑10、12或14轮,每轮四个操作作用在一个4×4字节网格上:SubBytes 让每个字节过一遍非线性查表,ShiftRows 把行旋转让字节跨列扩散,MixColumns 在 GF(2^8) 上做矩阵乘法使每个输出字节依赖四个输入,AddRoundKey 与轮密钥异或。
完整AES目前没有实用攻击。现代CPU还带 AES-NI 指令,把轮运算放进硬件执行,又快又是常数时间。
但分组密码一次只处理16字节,怎么把块串起来(模式)才是安全胜负手。GCM(NIST SP 800-38D)用CTR模式加密,再用 GHASH 在 GF(2^128) 上算一个128位标签。解密时先验标签,密文、nonce 或附加数据(AAD)改动一个比特,就直接报错、不吐明文。
三条必须刻在脑子里的规则:
- 绝不重复使用同一对(密钥, nonce)。这会泄露两段明文的异或,还能让攻击者恢复 GHASH 密钥,之后就能伪造合法标签。
- 随机96位 nonce 有上限。受生日界约束,NIST 建议每个密钥下随机 nonce 的消息数控制在约 2^32 条以内。
- 单条消息在每个(密钥, nonce)下上限约 64 GiB,大文件必须分块。
GCM 还有一个特性:它不保证密钥承诺(key-committing)。精心构造的密文可以在两个不同密钥下都解密成功,这给基于密码的系统打开了“分区预言机”攻击的口子(Len、Grubbs 和 Ristenpart,2021)。解法是显式的密钥承诺。
ChaCha20-Poly1305:对软件更友好的挑战者
Daniel J. Bernstein 的 ChaCha20 是流密码,只用加、旋转、异或三种操作(ARX)。没有查表,天生常数时间,在没有AES硬件指令的CPU上也很快。
它的状态是一个4×4的32位字网格:四个常量、256位密钥、一个块计数器和一个96位 nonce(RFC 8439),经过20轮四分之一轮函数打散。Poly1305 负责认证,两者合起来就是 AEAD。
选型上,AES-256-GCM 和 ChaCha20-Poly1305 都是优秀方案。决定因素通常是硬件条件,以及你能多安全地管理 nonce。两者的API在主流库里几乎一致,换一个类名,同样的代码就能跑。
密码要变成密钥,靠 Argon2id
把密码转成密钥,绝不能用普通哈希。Argon2id 是当前推荐的选择,它同时消耗时间和内存,让猜测变贵。参数上,随机16字节盐、至少64 MiB内存、时间成本不低于3、并行度4,是常见的起点。
派生出的主密钥不要直接拿去加密。用 HKDF-SHA256 按用途打不同标签,一个用途一把子密钥。这样即使某一处的密钥泄露,也不会牵连其他部分。
公钥与恢复:X25519、Ed25519、Shamir
X25519 是 Curve25519 上的椭圆曲线 Diffie-Hellman:双方交换公钥,各自算出同一个共享秘密,全程不传输它。把这个结果过一遍 HKDF,就得到对称密钥。Ed25519 是配套的签名方案,快、紧凑、确定性,不存在每次签名都要靠随机数、一旦出错就崩的那种脆弱点。
实际用法是混合加密:一个随机文件密钥用AES或ChaCha加密数据,X25519 只负责把这个小密钥包给每个接收方。
Shamir 秘密分享回答的是“密钥丢了怎么办”,而且不引入单点故障。秘密变成随机多项式里的常数项,每份分享是多项式上的一个点。任意 k 份能重建秘密,k-1 份则什么也透露不了——这是信息论意义上的安全,不只是计算意义上的。
一个真实实现:ATLOCK v5 怎么把这些拼起来
ATLOCK v5 是 Akhouri Systems 面向 Windows 的总安全套件,纯 Python 写成,打包成 zip 里的单个 .exe。它不发明密码学,站在 cryptography 和 argon2-cffi 两个成熟库上,把力气花在通常最容易出错的环节:组合。
锁一个文件时,密码走过的路径是这样的:
- 密码(可选加密钥文件或硬件密钥)经 Argon2id 处理,随机16字节盐,内存不低于64 MiB,t不低于3,p=4,得到主密钥。
- 主密钥经 HKDF-SHA256 按用途打标签,分出加密密钥;再用 HMAC-SHA256 生成承诺值,在任何解密之前先校验。
- 每次封装派生子密钥:HMAC(加密密钥, 标签 || 随机 nonce_base)。
- 每8 MiB一块用 AES-256-GCM 加密,nonce = nonce_base(8字节)|| 块序号(4字节),AAD 与头部绑定。
围绕这个核心,一个程序里还装了这些:
- 文件与文件夹加锁,密码之外可选密钥文件或硬件密钥,攻击者得两样都有
- 密码保险库,支持 TOTP 验证码、FIDO2 安全密钥和 Windows Hello
- TPM 硬件密钥经 HKDF 混入本地状态密钥
- Shamir M-of-N 恢复与一次性恢复码
- 公钥模式:X25519 加密加 Ed25519 签名
- 逐级升级的锁定,带时钟与状态回滚检测
- 安全粉碎、密码强度评估、签名发布校验
- 内置自检,以及往容器解析器里扔随机损坏数据的模糊测试器
加密做不到的事
一个靠谱的安全工具会主动说清自己的边界:
- 以你的身份运行的恶意软件会赢。能在你的会话里执行代码的人,可以读进程内存或改程序。防篡改和内存擦除只是抬高成本,不是杜绝。
- Python 保证不了内存擦除。字符串和字节不可变、可能被复制,擦除只能尽力而为。
- SSD 上的粉碎不保证彻底。磨损均衡和快照会留下旧块。开全盘加密(BitLocker),把粉碎当成额外一层。
- 弱密码还是弱密码。Argon2id 拖慢猜测,救不了 password123。
- 没有代码签名。首次运行 Windows SmartScreen 可能警告,多数独立软件都这样。运行前先核实下载来源。
对威胁模型保持诚实不是弱点,那是工程和营销的分界线。
七个要避开的错误
- 在 GCM 或 Poly1305 下重复使用 nonce
- 只加密不认证(裸 CBC 或 CTR)
- 用快速哈希派生基于密码的密钥
- 省掉盐,或用短盐、固定盐
- 一把密钥干几件事,不用 HKDF 打标签
- 用 == 比较标签,而不是常数时间比较
- 自己造密码算法。组合经过验证的原语,别发明它们
密码算法是简单的那部分。安全活在密钥派生、nonce 纪律、认证,以及有勇气写下“我保护不了什么”的谦逊里。学会这些,你就能评估任何一款加密工具,包括这一款。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.