资讯动态

密码学入门:从凯撒密码到AES,一次看懂加密与哈希

发布时间:2026/10/15 17:15:11 来源:尧图企业网站定制
每次跟人聊密码学我总要先问一句你说的“密码”到底是登录网站时输的那个password还是加密信件时用的那个cipher这俩东西在中文里都叫“密码”但在密码学里完全是两码事。很多人一上来就被这个概念绕晕后面再看他怎么学都别扭。作为一本图解系列的第一篇我觉得最好先把“密码到底是什么、它在干什么、为什么历史上那么多密码都失效了、今天我们又靠什么保护数据”这些地基问题一次性说清楚。这篇文章不堆数学公式尽量用图、例子和故事把核心逻辑拆开适合零基础入门也适合那些想系统捋一遍密码学框架的开发者。不要觉得密码学离你很远你现在读这篇文章用的 HTTPS、手机上的指纹支付、网盘里的文件加密、甚至智能门锁的临时密码底层全跑着同一套思维模型。把这个模型看懂再看什么 AES、RSA、数字签名都是在往这张地图上填地名而已。1. 先厘清一个被用烂的词“密码”到底指什么1.1 日常的“密码”和密码学的“密码”根本不是一回事日常生活中我们说的“密码”其实绝大多数是口令Password——它是用来“证明你是谁”的凭证本质是一段秘密的字符串比如你的银行卡取款密码、Wi-Fi 连接密码、App 登录密码。它的作用不是隐藏信息本身而是做身份验证你知道这个口令我就认为你是账号的主人。而密码学里讨论的“密码Cipher”是用来对信息本身做变换的算法和规则。它的目标是把一段有意义的信息比如“明天下午三点老地方见”变成一堆看起来毫无意义的乱码比如“X7$qLp2#mN”让第三者即使截获了这堆乱码也读不出原来的意思。这个过程叫加密反过来把乱码恢复成原文的过程叫解密。我见过太多初学者在这一点上卡壳他们会问“我把密码设成123456和设成Pssw0rd!安全性差这么多为什么文章里说加密和解密用的是同一把‘密钥’”——因为他们把“口令”和“密钥”又搅在一起了。口令是用于验证身份的“暗号”密钥是用于控制加密算法变换的“参数”两者概念层次完全不同。后面我们讲的凯撒密码、DES、AES用的都是第二种“密码”。1.2 加密的本质算法 密钥两条腿走路所有密码体制都可以抽象成一个最朴素的关系式密文 加密算法明文密钥反过来明文 解密算法密文密钥这里最关键的一点是算法是公开的密钥是保密的。你可能觉得奇怪算法公开了那不就完蛋了吗恰恰相反现代密码学的第一条铁律就是柯克霍夫斯原则——一个密码系统的安全性不应该依赖于算法的保密而只应该依赖于密钥的保密。算法可以摆到桌面上让全世界的数学家随便分析只要密钥够乱够长敌人拿到密文也束手无策。这个原则刚提出来的时候很多人不接受直觉上总觉得“我的加密方式越隐蔽别人越破解不了”。但历史反复证明靠“隐藏算法”来保密的系统一旦算法泄露所有加密数据瞬间裸奔归零成本而靠“保密密钥”的系统即使算法被公开分析多年只要密钥没漏数据依然安全。现代密码学早就选择了后者。1.3 一个直观的模型保险箱 钥匙把加密想象成这样一个场景你有一封重要的信想寄给远方的朋友但你担心邮差偷看。你找了个铁皮保险箱把信放进去用一把钥匙锁上然后寄出去。朋友收到后用同一把钥匙或者另一把配对的钥匙打开箱子取出信件。在这个模型里信件原文就是明文锁上后的箱子就是密文锁箱子的动作就是加密开箱子的动作就是解密铁皮箱子的设计图纸就是算法公开没问题因为别人就算知道箱子长什么样没有钥匙也打不开钥匙就是密钥必须好好藏着把这个模型装进脑子里后面所有密码学概念都有了挂靠点。你后面听到“对称密码”“公钥密码”“混合加密”本质上都是在回答同一个问题这把钥匙到底怎么安全地送到对方手上。2. 加密解密这件事到底在保护什么目标、角色与攻击者的游戏2.1 密码学的三大目标不只是“保密”初学者最容易把密码学等同于“保密”其实密码学要干的事情有四件少了哪件都玩不转机密性只有授权的人能读懂信息内容这是加密最本分的职责。完整性信息在传输中没被偷偷篡改过我收到的就是你发的那份。身份认证跟我通信的确实是声称的那个人不是冒充的。不可否认性你发过这条消息这件事你不能事后抵赖。这一条靠的是数字签名。你可能马上想到那用加密不就全解决了吗还真不是。加密只解决“机密性”它没法告诉你密文有没有被人动过手脚。现实里的攻击者很少是“偷看型”的更多是“篡改型”的——他把你的订单金额从 100 改成 10000你解密之后照样能读但读到的已经是假消息。所以要保住完整性和认证还得专门设计消息认证码MAC和数字签名这是后面章节的事。这篇先把“机密性”这条主线讲透。2.2 故事里的三个角色Alice、Bob 和 Eve密码学教材里最爱用的三个人物是 Alice 和 Bob通信双方以及 Eve窃听者。我不太喜欢用真人名但对初学者来说角色化确实好理解这里我用“发件人”“收件人”“窃听者”来称呼。想象发件人想把“明天下午三点老地方见”这行字发给收件人中间的网络通道是不安全的任何经过的数据都可能被窃听者截获。发件人的流程是拿出加密算法和密钥把明文变成密文。把密文丢到这条不安全的通道上。收件人拿到密文用密钥还原出明文读懂了。窃听者全程都在旁观他能看到密文能截获所有数据包但他没有密钥。他的全部工作就是挖空心思从密文里推明文或者更阴险地直接篡改密文让收件人收到一条被改过的假消息。这个三角关系是所有密码学讨论的起点。你后面学任何密码算法脑子里都要自动浮现这个场景这个算法能不能挡住窃听者挡住的是哪种窃听者是只会看的被动窃听者还是既能看又能改的主动攻击者2.3 密钥长度的意义为什么说 128 位“够用”密钥到底要多长这得从暴力破解说起。暴力破解的朴素思路是我不知道你的密钥是什么但我把可能的密钥一个接一个全试一遍总能试中吧。一个 n 位的密钥可能的取值是 2 的 n 次方个。密钥每增加 1 位破解工作量就翻一倍这不是线性增长是指数增长。拿现代最常用的对称加密标准 AES 来说128 位密钥意味着对手最多要试2^128种组合——这个数字大约是 340 万亿亿亿亿340,282,366,920,938,463,463,374,607,431,768,211,456。就算全世界的超级计算机并联起来算从宇宙诞生算到现在也算不完。所以“密钥长度”本身就是一个加密算法安全性的核心指标之一这也是为什么我们现在谈加密动不动就说“128 位”“256 位”而不是说“这个算法用了多复杂的公式”。3. 从凯撒到恩尼格玛那些年被打穿的古董密码3.1 凯撒密码一次位移的“换脸术”密码学历史的第一站几乎所有教材都会提凯撒密码。它的规则简单到令人发指把字母表往后移动固定位数。比如密钥选 3A变成DB变成EHELLO加密后就变成KHOOR。用我前面说的模型套一下算法是“字母表移位”密钥是“移多少位”这个数字明文是HELLO密文是KHOOR。解密的时候收件人把每个字母往前移 3 位就还原了。这个密码在当时也许能忽悠住文盲率极高的普通人但放到现在破译它不需要任何技术密文一共就只有 25 种可能的移位方式一个一个试撑死试 25 次明文必然水落石出。哪怕不知道密钥是几暴力枚举就能碾过去。凯撒密码的教训是密钥空间太小算法再“巧妙”也没用。3.2 维吉尼亚密码多表替换的“组合拳”依然败给频率分析凯撒密码太脆弱古人肯定也意识到了。于是出现了维吉尼亚密码它的思路是不再对所有字母用同一个移位量而是用一串密钥循环着对不同位置的字母做不同的移位。比如密钥是KEY那明文的第 1 个字母按K移第 2 个按E移第 3 个按Y移第 4 个又按K移……这样同一个字母在不同位置会被换成不同的密文字母字母频率被大幅“抹平”简单的频率分析就失效了。说实话维吉尼亚密码在当时的思路非常先进它把“单表替换”升级成了“多表替换”一度被称为“不可破译的密码”。但它最终还是被打穿了核心破绽在哪里在于密钥是循环重复的。只要密文够长统计学上就能发现周期一旦猜到密钥长度维吉尼亚密码就被降级回一堆独立的凯撒密码逐个击破。密码学家卡西斯基在 19 世纪就提出了利用重复片段分析密钥周期的方法。这个案例特别值得玩味它告诉我们密码的安全性不能建立在“对方猜不到规则”上而必须建立在“敌人就算知道了完整流程没有密钥也白搭”上。算法设计再花哨只要结构里有周期的破绽就会被数学碾碎。3.3 恩尼格玛机机械时代的巅峰与图灵如何捅破它讲到二战时期的恩尼格玛机这个故事就更有戏剧性了。恩尼格玛是一台长得像打字机的机电设备里面有三个后来是四个可以转动的转轮每个转轮上有 26 个字母触点按下键盘上的字母电流经过三个转轮和反射板最终点亮某个字母灯。转轮每按一次键就转一格因此同一字母连续按两次灯亮的字母几乎必不同。这个设计让恩尼格玛的密钥空间大得惊人当时的德国军方认为它不可攻破。实际破译过程极其复杂但核心弱点可以概括成一句机器行为存在规律性的“结构性泄密”——比如同一个字母永远不会加密成它自己、明文里高频词比如天气报告里固定的“天气”一词会被反复猜测再加上操作员的偷懒设置给破译方开了无数后门。最终数学家图灵团队利用已知明文反馈、转轮位置推断和当时刚诞生的计算机构造了专用的破译机把恩尼格玛的加密逻辑整个翻了过来。恩尼格玛的教训比维吉尼亚更深刻工程上“看起来复杂得不可能”不等于“数学上安全”。军事密码系统的失败往往不是因为算法单点漏洞而是整个密钥管理流程密钥分发、操作员习惯、报文格式都在出卖它。这个观点放到今天依然是真理很多系统被攻破不是因为 AES 不行而是因为密钥被硬编码在代码里、或者口令写在便利贴上。4. 现代密码的两大流派对称加密与公钥加密该怎么选4.1 对称加密一把钥匙开一把锁快但分发难聊完历史进入现代。我们今天用的加密算法大体分两派。第一派是对称加密英文叫 Symmetric Cryptography特点就是“加密用的密钥和解密用的密钥是同一个”。你听到的 DES、3DES、AES以及现在已经很少单独使用的 RC4都是对称加密。对称加密的长处是速度极快硬件和软件实现都高度优化特别适合加密大量数据。你可以把它理解为那个铁皮保险箱同一把钥匙锁也能开。代价是这把钥匙怎么安全地送到对方手上如果直接把钥匙和箱子一起寄过去窃听者岂不是连箱子带钥匙一起笑纳了这就是著名的密钥分发问题。在只有俩人的小圈子里你可以当面递钥匙但在互联网上你永远不可能跟每个陌生人都“见面碰钥匙”。4.2 公钥加密两把钥匙的“分工合作”慢但能解决分发第二派是公钥加密也叫非对称加密。它用一对钥匙一把叫公钥可以到处公开一把叫私钥自己死死藏好。用公钥加密的数据只有对应的私钥能解开。这个机制听起来像魔法但这正是整个现代互联网安全的基石——它戏剧性地解决了密钥分发问题。你不需要先把钥匙秘密地送过去你直接把“公钥”贴在大门口全世界都能看到别人把信息用公钥锁进箱子里快递给你你回家掏出私钥打开箱子读信。窃听者就算把公钥摸了无数遍也没法用它来解开别人用公钥锁上的箱子。这就是非对称的核心不变量由公钥推不出私钥至少在可接受的计算成本下推不出。代价也很现实公钥加密的计算开销远高于对称加密慢一到两个数量级是常态。所以工程上几乎不会用公钥加密去加密整段数据而只加密一个长度很短的“会话密钥”再用这个会话密钥配合对称加密去加密真正的数据。这个模式就是混合加密也是 HTTPS 握手的真实流程。4.3 一个表看懂两种流派别再选错场景维度对称加密公钥加密密钥数量一个加密解密同钥两个公钥 私钥运算速度快适合大批量数据慢只适合小数据量密钥分发难以解决天然支持公开分发典型算法AES、DES、3DESRSA、ECC椭圆曲线主要用途加密文件、加密传输正文密钥协商、数字签名、身份认证安全假设密钥必须保密私钥必须保密公钥公开无妨看到这张表你就明白日常我们网银、网盘用的加密方案几乎都是“公钥做握手、对称加密做传数据”的组合拳。没有哪个流派是“绝对好”只有“适合做哪件事”。这个选型思维比死记几个算法名重要得多。5. 别再把密码、编码、散列混成一锅粥概念的界限5.1 编码与压缩不保护秘密只变换形式很多人看到 Base64、MD5、SHA 这些词就统统归到“加密”里这个误会必须拆掉。所谓编码比如 Base64只是把二进制数据用一种可打印字符的形式表达出来方便在邮件、URL 里传输。它是完全可逆的而且没有任何秘密可言——任何人都能把 Base64 字符串解码回原始字节。压缩也类似它只是消除冗余让数据更小跟保密毫无关系。把 Base64 当成加密的人特别多因为一眼看去那串字符确实“像乱码”。但你只要知道编码是“公开可逆的格式转换”就能一眼识破。判断一个东西是不是真的加密标准很简单没有密钥能不能还原如果能那就是编码如果不能才是加密。5.2 散列函数没有钥匙的“指纹机”散列函数哈希是另一类特立独行的存在。它把一个任意长度的数据映射成一个固定长度的摘要比如 SHA-256 的输出永远是 32 字节。它的关键特性是单向性从输入算摘要很容易从摘要反推输入基本不可能。此外还有雪崩效应输入哪怕只改一个比特输出也会面目全非。那它是加密吗不是。因为加密是“可逆的变换”散列是“不可逆的抽象”。现实中它常被用来做口令存储和完整性校验网站不存你的密码原文只存密码的哈希值你下载文件后算一下哈希跟官方公布的对一下就知道文件有没有被篡改。所以哈希是密码学大家族的重要成员但人家干的是完全不同的工种。5.3 一句话记住这些概念的关系我这里给一张我自己常用的“一句话区分表”拿去不谢概念有钥匙吗可逆吗典型用途对称加密一把密钥可逆文件加密、传输加密公钥加密公钥/私钥可逆密钥协商、数字签名编码无可逆公开格式转换、传输压缩无可逆公开减小体积散列无不可逆口令存储、完整性校验这张表你在心里滚几遍再遇到别人说“我用 MD5 加密了密码”你就知道该怎么纠正他了不是“加密”是“散列”。6. 密码学家怎么“攻击”密码常见的破译思路以及它们对普通人的启发6.1 攻击者不是只会暴力破解先分清楚几个经典攻击模型密码学里有个很实用的框架叫“攻击模型”它描述的是攻击者手里到底有什么货。不同模型下算法的强度判断完全不同。第一类是唯密文攻击攻击者手里只有截获的密文全靠密文本身猜明文。这是最艰难的攻击场景凯撒密码在唯密文下靠枚举就能破。第二类是已知明文攻击攻击者手里除了密文还知道若干对应的明文。比如军方电报里有固定的问候语格式攻击者猜出某个词的位置和内容就能反推密钥。第三类是选择明文攻击攻击者甚至能选一些明文喂给加密系统然后拿到对应的密文来分析。比如他故意发一份内容完全可控的文件给加密服务器通过观察密文特征来推断密钥结构。现代密码的安全性设计默认都得顶得住选择明文攻击。区分这些模型的现实意义在于我们在设计系统时不能假设攻击者“什么都不知道”。一个真实的攻防场景里攻击者经常能搞到大量的“明文-密文”对照样本。如果你设计加密方案时只防备了“对方啥也没有”的情况那离翻车就不远了。6.2 从破译史看现代安全设计的“归零思维”回看凯撒、维吉尼亚、恩尼格玛的破译史你会发现一个共同点每一次破译都不是靠蛮力而是靠找到算法结构里的数学弱点。凯撒的弱点在密钥空间太小维吉尼亚的弱点在周期重复恩尼格玛的弱点在“明文字母不可能映射到自身”这种结构性特征。这个历史规律带给现代工程师的最大启发是密码算法的安全性永远要用“最坏情况”来度量而不是用“我觉得没人能想到这个漏洞”来度量。所以现代算法在设计时就要面向全世界的密码分析师公开评审、反复攻击只有经受住多年公开冲击的算法才值得信任。这也是为什么我不建议你自己发明加密算法去保护业务数据——你大概率会在某一个转角犯下古人已经犯过的错误。用成熟的、经过检验的标准算法AES、RSA、ECC再用严格的密钥管理流程才是真正的安全感来源。6.3 对普通人的三条实操建议聊了这么多理论落到实践我给你三条最直接的建议第一不要把“密码”用在协议不支持加密的地方——看到网站地址栏没上锁、还是带锁头的灰标就别往里填任何敏感信息。第二口令的强度不等于密钥的强度——你设一个再长的登录密码如果在后端被拿去做密码字典破译测试照样会被击穿。真正可靠的方案是用密码管理器生成随机的高强度口令并开启双因素认证让“窃听者”即使拿到一个口令也没法完成全部验证流程。第三平时用 HTTPS 站点下载文件时如果页面或官方提供了哈希校验值多花十秒钟核对一下这是对完整性的最低成本实践。7. 第一篇该收在哪从“密码”出发下一站该看什么我个人的体会是学密码学最忌一上来就钻算法细节。先把“加密的角色”“密钥的意义”“攻击者的思路”“概念的分界”这几块拼图放好后面你遇到再复杂的术语都能问出三个正确的问题它解决什么问题它假设攻击者有多强它把密钥藏在哪这三个问题是攻破一切密码学知识的万能钥匙。第一篇讲了“密码”这个起点下一篇我们可以沿两条线往下走一条是“对称加密的核心算法到底怎么运转”——从 DES 的 Feistel 网络讲到 AES 的字节代换和轮密钥加另一条是“公钥体系如何用数学搭台唱戏”——大整数分解、离散对数、椭圆曲线到底在干什么。这两块啃下来你再看数字证书、HTTPS 握手、区块链签名就都不会再觉得是魔法了。我自己回头翻笔记时最感慨的一句话是密码学没有“绝对安全”只有“计算上不可行”。理解了这个前提你对安全问题的判断会冷静很多——不再被“某算法被破解了”的标题党吓住也不会天真地以为“上了加密就万事大吉”。一步步来下一篇继续。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑