我前几天写了一篇关于如何对作品进行数字签名保护的文章,介绍了实际操作的步骤。
但有一些朋友反馈说,他们想更系统地了解一下加密的基本原理。所以今天我就想用一种最通俗的方式,也就是文科生也能听懂的方式,来介绍一下这方面的内容。
🔐
从加密到区块链:用最通俗的方式讲清楚密码学的核心原理
一、加密:让信息变得“看不懂”
加密的意思就是——让别人看不懂信息。比如你给朋友发一条消息:“明天见”,如果这条消息被别人截获了,那隐私就没了。
加密的做法,就是先把“明天见”这三个字经过一段计算,变成一串完全看不懂的符号,比如:
7d#8xAq!91@uT
别人就算拿到这串符号,也看不出原文是什么。而你的朋友知道解密的“方法”或“密钥”,就能把它还原回去。
加密的核心要点是:
– 同样的原文,如果密钥不同,结果也完全不同。
– 没有密钥,几乎不可能恢复出原文。
二、对称加密:同一把钥匙,加密也解密
对称加密其实很好理解。比如两台电脑要传文件,它们都提前约好一个密钥,比如:
密钥 = "mysecret"
当电脑A要传文件给电脑B时,它就用这个密钥加密文件。电脑B收到后,用同一个密钥解密,就能拿到原文。
你可以想象成两台机器都装了相同的“加密软件”,只有知道这组“密码”的机器才能正常交流。
常见的算法有:
– AES(Advanced Encryption
Standard):现代最常用的对称算法,安全且高效。
– DES:早期算法,已被淘汰。
它的主要问题在于:
> 如果两台机器在远距离通信,如何把密钥安全地告诉对方?
这就像你要告诉朋友家门密码,却怕被别人中途偷听到一样。
三、非对称加密:两把钥匙,一锁一开
为了解决“密钥传输”问题,出现了非对称加密。它设计了两把互相关联的钥匙:
– 一把叫 公钥(public key)
– 一把叫 私钥(private key)
它们之间有这样的关系:
– 用公钥加密的内容,只能用对应的私钥解开;
– 用私钥加密的内容,只能用对应的公钥解开。
换句话说:
– 公钥负责“上锁”;
– 私钥负责“开锁”;
但你不能从锁推导出钥匙。
工作流程举例:
1. 你生成一对钥匙:公钥和私钥。
2. 你把公钥发给别人,让所有人都能用。
3. 别人给你发信息时,用你的公钥加密。
4. 只有你(持有私钥的人)才能解密。
这样一来,就不怕中途有人窃听了。哪怕别人拿到了公钥,也无法解密任何内容。
常见算法有:
– RSA:基于大数分解难题。
–
ECC(椭圆曲线加密):更高效、密钥更短,现代系统多采用这种。
四、数字签名:证明信息没被改过,也真的是你发的
数字签名的目的不是“加密内容”,而是“确认身份和完整性”。
想象你发出一份电子文件,比如合同或公证书,你希望别人知道:
– 这份文件确实是我签的;
– 传输过程中没人改过。
数字签名的具体工作步骤是:
- 生成哈希值首先,计算这份文件的哈希值(可以理解为它的“数字指纹”)。
- 哈希函数会把文件的全部内容压缩成一个固定长度的字符串,例如 64
个字符。 - 哪怕文件只改动一个标点符号,哈希值也会完全不同。
- 哈希函数会把文件的全部内容压缩成一个固定长度的字符串,例如 64
- 用私钥加密这个哈希值这个加密后的结果就是“签名”。
- 注意:签名不是对整份文件加密,而只是对哈希值加密,这样效率高。
- 别人验证签名时用你的公钥解开签名,拿到哈希值;
- 再自己对收到的文件重新计算哈希;
- 两者对比——一样就说明文件没被改,且确实是你签的。
数字签名 = 私钥签发 + 公钥验证 + 哈希校验
五、哈希函数:把内容压缩成唯一的“数字指纹”
哈希函数是一种单向运算。
输入任何数据,它都会输出一个固定长度的数字串。
例如(使用 SHA-256 算法):
输入:Hello
输出:185F8DB32271FE25F561A6FC938B2E264306EC304EDA518007D1764826381969
特性:
1. 不可逆:从结果无法反推出输入的内容。
2. 高敏感性:输入哪怕改一个字,结果完全不同。
3. 定长输出:无论输入多大,输出长度都一样。
4.
唯一性强:几乎不可能出现两个不同输入生成同一个结果。
这意味着:哈希值就像文件的“唯一身份证号”。系统可以通过比对哈希,判断文件是否被篡改。
六、区块链:哈希链起到“防篡改”的作用
区块链本质上是一个按时间顺序排列的记录链,每个“区块”都保存了三样关键信息:
1. 当前区块的数据(例如交易记录)
2. 上一个区块的哈希值
3. 自己的哈希值
每个区块的哈希值都取决于前一个区块。
如果有人试图修改第 5 个区块的内容,第 5 个区块的哈希就会改变,于是第 6
个区块中保存的“上一个哈希”就对不上了,整个链条立刻就断开。
因此区块链具有天然的防篡改特性。这是一种“数学式的信任”:不依赖任何中央机构,而由计算规则本身保证。
七、附录:比特币挖矿的工作原理(这一部分文科生可以略过)
一、为什么要“挖矿”
在比特币系统里,每10分钟会生成一个新区块。但必须由某个节点(矿工)来“提出”这个区块。
系统要求:
>
谁先算出一个符合条件的哈希值,谁就有权写入区块链,并获得奖励。这就像一场数学比赛:所有矿工都在同时计算,看谁先算出正确答案。
二、哈希的难题:找到“符合条件的哈希值”
系统规定新区块的哈希结果必须满足一个特定条件,比如:
哈希结果前面必须有4个连续的0
例如:
0000AF93BC19D2...
这样的结果才被认为是“有效区块”。
哈希算法是不可预测的,唯一的办法是不断尝试。
三、矿工的尝试过程
每个矿工会把区块中的所有数据(包括交易记录、上一个区块的哈希等)固定下来,然后加入一个随机数(Nonce)。
这个随机数从0开始,每加1就重新计算一次哈希。
| 尝试次数 | Nonce 值 | 计算结果哈希 | 是否符合 |
|---|---|---|---|
| 1 | 0 | A83F2D9C… | ❌ |
| 2 | 1 | FEE1AB77… | ❌ |
| 3 | 2 | 0000AF93… | ✅ |
当某个矿工算出一个哈希结果满足规则,比如前4个字符全是0,就成功“挖出”新区块。
四、计算下一个有效哈希值的算法逻辑
目标难度="0000"nonce=0whileTrue:text=上一区块哈希+当前区块数据+str(nonce)hash_value=SHA256(text)ifhash_value.startswith(目标难度):("找到有效哈希:", hash_value)breaknonce+=1
五、为什么安全
因为:
– 改一个区块就要重新计算所有后续区块的哈希;
– 区块越多,重新计算越难;
– 计算量巨大,使篡改几乎不可能。
六、难度调整机制
系统每2016个区块会自动调整难度:
– 如果出块太快,就提高要求(例如要求5个0);
– 如果太慢,就降低要求。
保证平均10分钟出块。
七、总结
| 元素 | 功能 | 原理 |
|---|---|---|
| 哈希函数 | 保证唯一性、防篡改 | 内容→哈希值 |
| Nonce | 随机参数 | 改变输入、控制结果 |
| 工作量证明 | 竞争出块权 | 找到符合条件的哈希 |
| 链接哈希 | 形成区块链结构 | 每块依赖上块 |
| 难度调整 | 保持节奏 | 自动调节 |
加密是保密,签名是认证,哈希是指纹,区块链是由指纹串起的账本,挖矿就是在这本账上寻找符合规则的下一页。
联系信息(Contact)
本文作者:Geoffrey Chen
公钥验证(Verified GPG Public Key)
🔗 keys.openpgp.org
(可通过邮箱搜索获取)
Discover more from Geoffrey Chen
Subscribe to get the latest posts sent to your email.