密碼學小帳本:從 AES 到後量子,搞懂幾類演算法
发布于 2026-06-22 11:53:25(微信公众号导出记录)。
本文来自公众号后台的“导出文章内容”功能。博客正文由导出长图进行本地 OCR 转写,并保留原始排版图用于逐段核对。
原文链接:查看原文
OCR 转写有效文字约 8196 字;代码、流程图和版式以文末原始排版图为准。
正文(本地 OCR 转写)
作為开發者,你是不是也普被AES-CCH、ECDSA、Secp256k1这些密码学名词癌得显大? 硬體品片手册程寡著TF-PSA-CrypLu,上唇匠境随又在减Keccak-256,看起来像一整 片街翻森林。 其實,密碼學演算法没那磨鞋入門。先不用急著数學组前,把它們當成一個個「输入、输出、 用途都很明確的小機器:,就能很快看量:负贡加密,维負贡防鼠改,负责签名,負责生 key. 這份筆記就用這個方式来看密碼学:每個演算法都先常成一台小機器。 你只要先抓住三件事: 输入是什度 输出是什层 帕出享米效什座 TF-PSA-Crypto這频速的价值,不只是提供 AES、SHA、ECDSA 這些演算法本身,而是把它 們包成一套統一的密碼服務介面:先建立或匯入key,設定key能做什度,再指定演算法去 加密、验證、签名、派生密编。 换句脱,它不是一堆零散工具,而是一個可以放进MCU、手機、OTA、硬险提包、安全通訊程 的密碼底座。
一张總覺
国 图時可以这样看:蓝色通常是资料,责色是密鸽或秘密,紫色是演算法或分類,绿色是输出结 果,红色是周隧或拒超状慧。每张图都盘量只表達一件事,细颜放在图下面。 这些束西在產品橙通常會一起出现。例如雨台設備先用ECDH算出共同秘密,再用HKDF派生 AES-GCM key,最後用 AEAD 加密通訊内容。固件包则可能先做 SHA-256 摘要,再用 ECDSA致名,较借端用公端睡额。 遗份文章後面的分類是按「它在系统程负责什鹰来排的:保密、完整性、身份證明、密筛生命 遇期、隨楼数来源、未来抗量子。這様看會比單细背演算法名字清楚很多,因為每烟演算法都有 自己的位置。
1.對加密
對稠加密的核心概念很髓單:同一把密镇负责加密,也负真解密。 常見演算法有: AES ARIA Canellia ChaCha28 AES、ARIA、Camellia 属於區境加密。它們一次處理固定大小的資料现,例如 AES一次處 理16 bytes.ChaCha28 是流加密,比鞍像產生一串密罐流,然後和明文混合成密文。
secrel lkey 同满算法反向虚理
key 密
Input/ output 输入:用文 + secret key + Iv/nonce/counter 输出:密文 解密時: 输入:出文+同一括 secret key+同一组Iv/nonce/counter 幢出:原本的明文 它的作用 對稀加密就是保密。别人拿到密文,如果没有key,就看不懂原文。 它需用在: 本地资料加密 固件包加密 鼓循配置加空 通讯内容加密 榴案加座 各演算法怎看 AES是现代最常用的剩稿加密演算法,很多CPU、MCU、安全晶片都有硬體加速。只要没有特 别合规要求,AES通需是第一逻报。 ARIA和Cancllia可以理解成 AES 的同类型罐手。它在某些圆家模弹、善或合规 场景會出现。平常新设计不一定舍主勤进它们,但虚支提它們代表兼容性更度。 ChaCha20很通合纯软经境,没有AES硬加速時,它常常跑得又快又,手機、嵌入 式、现代安全通訊理都很常見。
2.區塊加密模式
AES這種匠境加密一次只能吃固定大小的資料境,但真實資料通常是一整段。所以需要「模 式;来决定怎磨把很多资料现申起来。 常見模式有: 長資料
模式
CFB / OFB ECB CBC CTR 测试用 需MAC 流式 兼容
密文 ECB 帕入:key+明文 幢出:座文 ECB的同题是,相同明文现成相同密文现,资料理的结聘可能被看出来。它遍合测试底屠 AES是否能跑,不通合保真實資科。 CBC 入:key + 明文 + IV 输出:密文 CBC每個區埋受到前一個區境影暨,比ECB好很多。問题是CBC只负责保密,不负责 防察改。真要用CBC,通常逻要措配HMAC或CMAC。
输入:key +明文+nonce/counter 帕出:出文 CTR把显境加密整成類似流加密。它可以平行虚理,也適合串流資料。重黏是同一把key下 nonce/counter不可以重福,否则管出大事。 CFB / 0FB 输入:key +明文 + IV 幢出:座文 这两個模式也能把區现加密曼成流式使用,现在更多是為了兼容需。新设计通常直接逐 AEAD,
3.AEAD韶證加密
AEAD是现代新藤最推的形感。它一次做雨件事: 加密:别人看不星 韶證:旗别人改不了 常見AEAD 有: AES -GCM ChaCha28 -Poly1365
Input/output 加密時: 输入:明文+key + nonce +AAD 赣出:密义+tag 解密時: 输人:蜜文 + tag + key + nonce + AAD 输出:明文,或考直接失败 防震性實作神有很重要的细篇:如果tag验證失败,所有暂時解出的明文都必须立刻去案, 不能博给上层掌程,特别是多段AEAD 解密時,最好先把输出暂存在内部 buffer,等fin1 sh/verify成功後再交出去,避免oracle 問题或明文波竭。 AAD是 Additional Authenticated Data。它不會被加密,但會被超罐。例如 OTA 包 的版本號、設備ID、header 可以放在AAD 理。别人看得到它,但只要它被改,tag 就验 不過, 它的作用 AEAD適合保错一整包资料: 图Y10 借配置 手橡和设循的通payload APDU 指令调料 本地教系棉案 密编封装
三個常見選项
AE5-GCN在伺服器、PC、手機、有 AES 加速的晶片上很常見。它速度快,但nonce 重褪 會非常危险。 AES-CCM在嵌入式、蓝牙、低功耗設借程很常見。很多MCU和安全库都支援它。 ChaCha2B-Poly1365通合筑敢错瑶境。淀有AES 硬错加速時,遗個组合非常舒服。
4.哈希
哈希不是加密。哈希没有key,也不能解密回原文。 它更像是在资料做指放。 完整性
签名前 任意資料 isa8p SHA系列 指放 指纹
索引 ELViajefo Input 触入:任意长度资料 输出:固定长度 digest 例如: 1s61p s1q 2 <- (011a4.195z-5 原文只要改1bit,d1gest通常就富完全不一樣。 常見哈希 SHA-256是目前最常用的安全哈希之一,输出 32 bytes.固件摘要、名前 digest、資 料指数都常用。 5HA-384输出 48bytes,常見於更高安全强度的TLS/證書增景。 SHA-512输出 64 bytes,在64-bit CPU上通常表现不锥。 SHA-3是另一套现代哈希家族,内部设計和SHA-2不同。 SHAKE128/SHAKE256是可延体输出函数。一般哈希输出最度固定,SHAKE则可以指定限要 翰出多少bytes。後量子演算法、KDF、特殊狸常見。 RIPEHD16B在比特地址證系常見,通用新設計不太會侵先選。 5HA-1和MD5主要是兼容善或非安全校验。新安全设計如果需要抗碰撞或签名保端, 通常會改用 SHA-256、SHA-384、SHA-512或 SHA-3. 例子:固件摘要
- /i
5.MAC訊息證碼
MAC可以理解成带key 的哈希。普道哈希任何人都能算,MAC 只有持有key 的人能算 出正碟tag. 常見MAC: CHAC Poly1385 份运方 HRAC / CAAC shared key
重算MAC
Input/Output 输入:证息 ▪ key 糖出: tag 验證時: 输人:赶息-key +牧到的 tag 输出:真/假 它的作用 MAC不负贡睡内客。它负声硅能内容没有被改,而且到方真的有同一把key。 常用在: API 求答名 故循通計速 APDU 指令防冠改 握手流程校融 固件 manifest 氢强 密撤派生流程理的 PRF 哈希和MAC差在哪
資料->digest 哈希
MAC 資料+key->tag key
常见MAC怎看 HHAC基铃哈希,最常見是HHAC-SHA256.它定、通用、好塞計。 CHAC基於盛境加密,常見是AES-CMAC。如果設備上AES 有號锥加速,CMAC 會很自然 Poly1305通常不单强弧用,而是和 ChaCha29组成ChaCha2e-Poly1305。
6.密派生KDF
KDF 的工作是一恼秘密,生成一個或多国新key。 它解决的是「同一低秘密,拆成不同用途的key1。 常見KDF: HKDF PBKDF2 TLS PRF
加密key 主秘密 MAC key KDF salt HKDF / PBKDF2 會話key info/参数 設儒key
Input/output 输人:主稀空+salt+info/Label/参数 输出:折密编 HKDF HKDF 常用在現代協理。尤其是 ECDH算出 shared secret之後,通常不會直接拿 shared secret 當 AES key, 而是先船 HKDF。
ECDH AES-GCM kery shared secret 封方公销 slt +in
PBKDF2 PBKDF2主要滤理人频密碼 输人:password+salt+选代次数 输出:出编 例如用使用者密碼保本地包樓案,就會先用PBKDF2把密碼成key,再用這個key 加 密资料。 TLS PRF TLSPRF是TLS1.2性的派生流程。它比鞍偏兼容,不是平常自己段計新藤時第一 會拿来用的KDF。
7.公端名舆驗
签名不是加密。签名的目的不是随落内容,而是證明: 遗份資料確實由某国私蕴持有者殖想過 常見额名演算法: RSA ECDSA ML -DSA
Input/output 签名: 输入:私编-訊息/摘雯 帕出:signature 验签: 入:公蕴+凯息/摘要+signature 输出:真/假 RSA RSA是老牌公输演算法,可以签名,也可以加密小段資料。不退现代產品理,它更多出现在證 害、TLS兼容、固件签名验签运些地方。 RSA 的特點是key大、通算量。MCU上不是不能用,但要评估速度、RAM,ROM ECDSA ECDSA是椭曲综签名。它比RSA更小、更滤合嵌入式,也很常見龄設借身份、固件签名、 境续包 ECDSA 备名糖入:私德+d1gest+随镜nonce ECDSA 名输出:r,s 這霍的nonce 很重要。如果ECDSAnonce 重或波漏,私可能被推回来。 包場景 比特常和以太坊常见的是: secp256k1 + ECDSA
Mcp256k1 交易名 ECOSA
这有個工程细解:標弹ECDSA 通常只给你r,5。以太坊還需要v/recovery id,遗有 低S规航化、Keccak-256、交易编等细前。這些不是單ECDSA演算法本身窄全部 虚理好的。
8.公端密端交换
ECDH、X25519、FFDH不是拿来直接加密资料的。它們是接雨遗在频路上互相交换公後,各 自算出同一個 shared secret。
設借A 設備B 私籍a 私籍b A_pub qnd-g ECDH(a, B_pub) ECDH(b, A_pub) 得到shared secret 得到同一個shared secret HKDF -> session key HKDF -> ession key
設借A 設備B
Input/ output 入:白己的私输+数方公铺 输出: shared secret 蔓方算出来的sharedsecret相同,但任何旁者只看到需個公端,算不出遗秘密。 它的作用 密交换通常是安全通讯的第一步。 ECDH/X25519 -> shared secret shared secret -> HKDF -> AEAD key AEADkey>加密真正的通讯資料 如果每次括都使用瞪時的 ECDH/X25519金锥,在會结结束後丢掉session key,還能 得到前向安全性,白话说,就是以後設催的長期私德就算浊漏,攻醒者也不能拿以前錄下来的通 机密文回源解用。 個名字 ECDH是播置由缓Diffie-HelLman.P-256、P-384、P-521 这些曲線都可以搭 ECDH X25519是现代通訊程非常常用的密交换方案,快、简漏、實作鼠险低。 X449是更高强度版本。 FFDH是傅统有限域DH很多TLS/協藤泄雷見到,新設計一般更常逻ECDH 或 X25519.
9.精圆曲線
桶图曲線本身不是完整稿演算法,它更像是ECDSA、ECDH这些演算法使用的数学平台。 不同曲级封应不同堤景。
25519 / X 投候/ TL5 型提交换
P-256 / secp256r1 这是嵌入式設储、TLS、银善、設借身份露理非常常見的曲線。很多安全晶片、MCU硬耀加速 器都侵先支援它。 常見搭配: P=256+ECDSA->经签名 P-256+ECDH->含語密编交摘 P-384 / P-521 安全强度更高,但運算更慢、資料更大。需要更高安全等级的超善或长期身份時富看到。 secp256k1 这是比特常、以太坊须疑包最關心的曲缘。 常見搭配: secp256k1+ECDSA->区魂疑交易筹名 Brainpool Brainpool是另一组標曲線,常見于某些洲標或特定合规。 X25519 / X448 X25519和X448主要用於密給交揽,它們不是享来做ECDSA名的。现代安全通訊程, X25519 很常見。
10.髓機数DRBG
密碼系统理的随根数不是普通rand)。它要能抗预测,因為密、nonce、签名nonce 都 靠它。 常見DRBG: CTR_DRBG
AES key 真寶焙源 私输 DRBG 随规位元组 CTR / HMAC 低性化資料 nonce / salt 俯沟不可靠 ECDSA nonce 整套都危障 Input/Output 输入:真真烦源+可遇personalization 幢出:密码级随榜位元组 CTR_DRBG CTR_DRBG基龄AES-CTR.它先吃真實倾源,再携展出很多随位元组。 HMAC_DRBG HMAC_DRBG基龄HMAC,也是一稚的密础级随機数生成器。 為什它重要 如果陪機数品質差: 生成的私体可能可预测 nonce可能重 ECDSA 答名可能温漏私端 加密通計,可能失去安全性 在 MCu上尤其要殖朗底唇entropy来源是真的TRNG或可辱系统随楼,而不是普通随 楼。
11.後量子ML-DSA/PQCP
後量子演算法是為了未来量子電腦也鞋以破解 这程最值得注意的是: ML -DSA PQCP / mldsa-native ML-DSA是後量子签名方向,也就是Dilithiun棵化後的路综之一 .8 ML-DSA ML-DSA ML-05A B情 董名 ML-DSA 公量 预般团 需津估真源 Input/output 签名: 输人:HL-DSA私+ 息 输出:後量子繁名 验釜: 入:HL-DSA公+讯息+签名 输出:真/假 它適合什 末来抗量子固件链名 长期身份想望 後量子證善耀系研究 安全座品提物估 但它不是現在直接塞進MCU童品就能收工的功能。後量子签名通常key 大、签名大、 RAM/ROM驱力也更明。實察上車前要测稿、速度、记愤禮、谱兼容。
12.產品锂通常怎組合
真實座品裡很少只用一個演算法。通常是一串演算法接起来,每個負责自己的部分。
ECIH / X25519
签名精 TEAG DEEG 84/ 文8 国件/交是 生乓 806/ 30 EAD key snte / sdl
ECISA FSA gaure
OTA固件保證
一個常见OTA設计可能長运楼:
固件内容-> SHA-256-> digest digest -> ECDSA 私编策名 -> signature 固件内容->AES-GCM/AES-CCM->密文+tag 超借->驰tag->解密->算digest->备 这程每個演算法都有位置: SHA-256:蕊内容指纹 ECDSA:确国件言由發行者签署 AE5 - GCM/AES-CCH:保据固件内容和防察改 DRBG:生成 nonce / key 對愿到PSAAPI時,流程长得像,重贴是初始化、军借key、指定用途,再呼叫演 算法」: psa_crypto_init() ; psa_set_key_usage_flags (&attrs, PSA_KEY_uSAGE_DECRYPT): psa_set_key_algorithn(&attrs, alg) ;: psa_inport_key(6attrs, key_bytes, key_lcn, 6key); psa_aead_decrypt(key, alg, nonce, nonce_len, aad, aad_len, ciphertext_with_tag, ciphertext_with_tag_len, plalntext, plaintext_size, &plaintext_len); 設備安全通訊 般備和手機建立安全通鼠時,可以遗檬: 方交换公编 ECDH/X25519 算出 shared secret HKDF 派生 AEAD key AES-GCM/AES-CCH/ChaCha2B-Paly1305 加密通讯 运理ECDH不直接加密讯息,它只负声旗整方享到共同秘密。真正加密資料的是AEAD. 如果某段資料只需要防察改、不需要保密,PSA理也可以直接用MAC: psa_crypto_init() ; psa_mac_compute(key . PSA_ALG_HMAC (PSA_ALG_SHA_256), essage, message_len, tag, tag_size, 6tag_len); 硬體鐵包名 硬體包更用心: 交易资料->编碍->hash hash+ secp256k1 私罐-> ECD5A 無名 r,5 層recovery 1d / v 输出完整交易链名 遗理TF-PSA-Crypto可以做一部分:secp256k1+ECD5A的签名引肇。但以太坊需要的 Keccak-256、交易编、EIP-155/EIP-1559、recovery id、低 S 规鲸化,些丽龄 包唇,不是光有ECDSA就全部完成。 快速對照表 代表演算法 输入 输出 期别 主要作用 文+key + n AES、ARIA, Camell 保密 對橘加密 密文 1a, ChaCha20 once/IV 長资料+Key+ CBC、 CTR、 CFB、OF 區境加密虚理 區境模式 密文 B、 ECB IV/nonce 長資料 AES-GCM, AES-CC 明文+key+ n 密文+tag AEAD M、 ChaCha20-Poly1 保密+防窗改 once + AAD 305 SHA-256, SHA-3、 S 资料指纹 哈希 任意资料 digest RIPEMD160 HAKE、 CMAC, Poly1 带key 的防院 蔬惠+ key MAC tag 305 改 主秘密+salt/ HKDF、PBKDF2、TLS 派生不同用途的 新key KDF info PRF 密端 私德+訊息/摘 RSA, ECDSA, ML-DS 温明私持有者 签名 signature 链超過 A 要 ECDSA, ML-DS 訊恩/辆 RSA、 公端+ 真/假 查签名 要 + s1gnature A ECDH、X25519、FFD 自己私键+到方 shared se 密输交换 商共同秘密 公编 H cret P-256.P-384、sec 到愿安全强 演算法曲粮 決定 ECDSA/EC 杨面曲缘 p256k1. X25519 座/用途 DH的数學平台 生成 key、non CTR_DRBG, HMAC_DR 随機位元组 随機数 烽源 BG ce,salt 私编/公编+ 签名/真 ML-DSA / PQCP 抗量子签名方向 後量子 息 最後的总结 AES/ChaCha2e:把内容凝起采。 GCH/CCM/Poly1385:把内容氟起来,顺便防鼠改。 SHA-256/SHA-3:始内容健指较。 HHAC/CMAC:用共享key 能内容做防鸽棵。 HKDF/PBKDF2:提一四秘密整出能月的 key。 ECDSA/RSA/ML-DSA:用私辅明是我答的 ECDH/X25519:暨方保商同一国秘密。 DRBG:壹生密碍级随鳞数。 如果要放到我們自已的設備、0TA、包專案裡,最常用的組合大概是: OTA加密:AES-CCM或AES-GCM 通訊加密:AES-GCM或ChaCha20-Poly1305 完整性:HMAC-SHA256 密派生:HKDF-SHA256 設備身份:P-256ECDSA 包名:Secp256k1ECDSA 會話密:X25519或P-256ECDH 随機数:CTRDRBG/HMACDRBG+真實橘源 這樣看,這些演算法就不再是一串名字,而是一套分工很清楚的工具:有的負责藏資料,有的負 黄防改,有的負黄證明身份,有的負责生key,有的負雨安全地谈出同一把key。
原始排版图
原始导出图超过单张 WebP 的尺寸上限,以下图片按从上到下的顺序连续保存。
![]()

