技术演进中的开发沉思-303计算机原理:加密基础

聊上篇完网络传输,就必须面对一个核心问题 ------ 安全。就拿之前我学生的毕业设计酒铺管理系统,如果接入互联网后,一般新手就会遇到一个致命的坑:远程访问数据库时,账号密码以明文形式在网络中传输,结果被局域网内的抓包工具截获,导致数据库里的销售数据和客户信息泄露。那一次,老板的客户资料差点被竞争对手获取,也让我彻底明白:网络解决了 "连通" 的问题,但加密才解决 "安全" 的问题。

一、加密基础

加密的本质,就是给传输的数据 "上锁"------ 把能直接看懂的 "明文",通过特定规则转换成看不懂的 "密文",只有掌握 "钥匙(密钥)" 的人,才能把密文还原成明文。这就像酒铺的保险柜:账本(明文)放进保险柜(加密),只有拿到钥匙(密钥)的人才能打开(解密),即使保险柜被偷走,没有钥匙也看不到账本内容。

1. 加密核心概念:明文、密文、密钥、字符编码变换

新手理解加密,先吃透这四个基础概念,它们是所有加密算法的根基:

  • 明文:未加密的原始数据,比如酒铺的订单信息 "茅台,2 瓶,899 元"、登录密码 "123456"。
  • 密文:明文经过加密后的乱码数据,比如 "x9#k7&8*",无法直接看懂含义。
  • 密钥:加密和解密的 "钥匙",是一串数字或字符,加密算法根据密钥对明文进行变换,解密时必须用相同 / 对应密钥还原。
  • 字符编码变换:加密算法操作的是二进制数据,因此第一步要把明文(字符)转换成二进制编码(比如 ASCII、UTF-8)。比如字符 "A" 的 ASCII 码是 65(二进制 01000001),"1" 是 49(二进制 00110001),加密本质是对这些二进制数进行数学运算。

我年轻时用最朴素的 "字符偏移" 做加密:把每个字符的 ASCII 码加 3,比如 "A"→65+3=68→"D","1"→49+3=52→"4",密钥就是 "3"。虽然简单,但让我第一次理解了 "明文→编码→加密→密文" 的核心流程。

二、加密算法

加密算法分两大核心类型:对称加密和公开密钥加密(非对称加密),两者的密钥使用方式截然不同,这也是教学的核心重点。

1. 对称加密

对称加密的核心特征:加密和解密使用同一个密钥,就像家里的门锁,开门和关门用同一把钥匙。最基础的对称加密是 XOR(异或)运算,也是新手最容易理解的加密方式。

(1)XOR 运算的加密原理

XOR 运算规则:两个二进制位相同则结果为 0,不同则结果为 1(0 XOR 0=0,0 XOR 1=1,1 XOR 0=1,1 XOR 1=0)。核心特性:同一个数异或两次会还原(A XOR B XOR B = A),这是 XOR 加密和解密的基础。

比如明文是 "ABC",先转 ASCII 码:A=65(01000001)、B=66(01000010)、C=67(01000011),密钥选 123(二进制 01111011):

  • 加密:65 XOR 123 = 62(00111110),66 XOR 123 = 63(00111111),67 XOR 123 = 60(00111100);
  • 解密:62 XOR 123 = 65,63 XOR 123 = 66,60 XOR 123 = 67(还原明文)。
(2)密钥长度的影响

对称加密的安全性核心取决于密钥长度

  • 8 位密钥:只有 2⁸=256 种可能,暴力破解只需尝试 256 次,几秒钟就能破解;
  • 128 位密钥:有 2¹²⁸种可能,即使超级计算机每秒尝试 10¹⁸次,也需要宇宙年龄级别的时间才能破解;
  • 常见对称加密算法:AES(128/256 位密钥)、DES(56 位,已不安全)、3DES(168 位)。

我年轻时用 8 位密钥做酒铺密码加密,被懂点编程的朋友半小时破解;换成 128 位 AES 加密后,再也没出过安全问题 ------ 这就是密钥长度的关键作用:越长越安全,但加密解密速度会略降。

(3)对称加密的优缺点
  • 优点:加密解密速度快(适合大数据传输,比如酒铺的订单数据)、实现简单;
  • 缺点:密钥分发困难(如果酒铺总店和分店共享密钥,密钥在传输过程中被截获,整个加密体系就崩了)。

2. 公开密钥加密(RSA)

公开密钥加密(非对称加密)解决了对称加密的密钥分发问题,核心特征:加密用公钥,解密用私钥;公钥公开,私钥保密,就像邮局的信箱:所有人都能用公钥(信箱口)把信投进去(加密),但只有拥有私钥(信箱钥匙)的人能打开(解密)。

RSA 算法的密钥生成与加密解密流程

RSA 算法基于 "大质数分解" 的数学难题(两个大质数相乘容易,分解乘积却极难),我用简化的小质数例子,分步拆解核心流程,避免复杂数论:

1:生成密钥对(公钥 + 私钥)
  1. 选两个小质数:p=3,q=11(实际 RSA 用 1024/2048 位大质数);
  2. 计算 n = p×q = 3×11 = 33(公钥和私钥的公共模数);
  3. 计算欧拉函数 φ(n) = (p-1)(q-1) = 2×10 = 20;
  4. 选公钥 e:e 需满足 1<e<φ(n) 且与 φ(n) 互质(最大公约数为 1),选 e=7;
  5. 计算私钥 d:d 是 e 的 "模 φ(n) 逆元",即 (e×d) mod φ(n) = 1,计算得 d=3(7×3=21,21 mod 20=1);
  6. 最终密钥对:公钥 (e=7, n=33),私钥 (d=3, n=33)。
2:加密(用公钥)

明文需转换成小于 n 的整数,比如明文 "6":加密公式:密文 = 明文 ^e mod n → 6⁷ mod 33 = 6^7=279936 → 279936 ÷33=8482 余 30 → 密文 = 30。

3:解密(用私钥)

解密公式:明文 = 密文 ^d mod n → 30³ mod 33 = 27000 ÷33=818 余 6 → 明文 = 6(还原)。

(1)公钥 / 私钥的核心作用
  • 公钥(e,n):公开给所有人,用于加密数据(比如酒铺客户用公钥加密支付密码,只有酒铺的私钥能解密);
  • 私钥(d,n):严格保密,用于解密公钥加密的数据,也用于数字签名。
(2)RSA 的优缺点
  • 优点:无需分发密钥(公钥公开),安全性高(2048 位 RSA 目前无法被暴力破解);
  • 缺点:加密解密速度慢(适合小数据,比如密码、数字签名,不适合大数据传输)。

对称加密与公开密钥加密的核心区别

对比维度 对称加密(XOR/AES) 公开密钥加密(RSA)
密钥数量 1 个(加密解密同一密钥) 2 个(公钥 + 私钥)
密钥分发 困难(需安全通道) 容易(公钥公开)
速度 快(适合大数据) 慢(适合小数据)
安全性 依赖密钥长度 依赖大质数分解难度
典型应用 订单数据、文件加密 密码传输、数字签名

实际应用中,两者通常结合使用:用 RSA 加密对称加密的密钥,用对称加密加密大数据(比如酒铺系统:RSA 加密 AES 密钥,AES 加密订单数据),兼顾安全和速度。

三、数字签名

数字签名解决了 "身份验证" 和 "数据完整性" 问题 ------ 比如酒铺老板给分店发送调价通知,分店需要确认:① 通知确实是老板发的(身份验证);② 通知内容没被篡改(数据完整)。

1. 数字签名的核心原理

数字签名基于 "信息摘要 + 私钥加密",分两步:签名和验证,核心是信息摘要(哈希函数)

(1)信息摘要(哈希函数)

哈希函数(比如 MD5、SHA256)能把任意长度的数据转换成固定长度的摘要(比如 SHA256 生成 256 位摘要),具有两个核心特性:

  • 不可逆:无法从摘要还原原文;
  • 唯一性:原文哪怕改一个字符,摘要会完全不同("雪崩效应")。

比如原文 "茅台单价 899" 的 SHA256 摘要是 A1B2C3,改一个字符成 "茅台单价 999",摘要变成 X9Y8Z7,完全不同。

(2)数字签名的签名流程
  1. 老板生成调价通知原文("茅台单价调整为 999 元");
  2. 计算原文的 SHA256 摘要(比如摘要 S);
  3. 用老板的私钥加密摘要 S,得到数字签名;
  4. 把原文 + 数字签名发送给分店。
(3)数字签名的验证逻辑(教学重点)

分店接收后,验证步骤:

  1. 用老板的公钥解密数字签名,得到摘要 S1;
  2. 重新计算收到的原文的 SHA256 摘要,得到 S2;
  3. 对比 S1 和 S2:
    • 若一致:说明原文是老板发的(只有老板有私钥),且内容没被篡改;
    • 若不一致:说明原文被篡改,或不是老板发的。

2. 数字签名与加密的区别

很多新手混淆数字签名和加密,我用通俗例子总结:

  • 加密:把信锁进保险箱(只有收件人能看),保护数据隐私;
  • 数字签名:给信盖防伪章(确认发件人身份 + 内容未改),验证身份和完整性。

四、 实现简单加密程序

为了让新手直观理解加密原理,我用 VBScript 实现两个简单程序:XOR 对称加密和数字签名验证,代码可直接运行(Windows 系统双击执行)。

1. XOR 对称加密程序

vbscript 复制代码
' 酒铺密码XOR加密解密程序
Option Explicit

' 定义密钥(128位,这里简化为字符串转ASCII码)
Dim key: key = "wine_shop_2024_key"
' 待加密的明文(比如登录密码)
Dim plaintext: plaintext = "WineShop123!"
' 存储密文/解密后的明文
Dim ciphertext, decryptedtext

' XOR加密函数
Function XOREncrypt(plain, key)
    Dim i, plainByte, keyByte, cipherByte
    Dim cipher: cipher = ""
    For i = 1 To Len(plain)
        ' 取明文第i个字符的ASCII码
        plainByte = Asc(Mid(plain, i, 1))
        ' 循环取密钥的字符ASCII码
        keyByte = Asc(Mid(key, (i Mod Len(key)) + 1, 1))
        ' XOR运算
        cipherByte = plainByte Xor keyByte
        ' 转成字符存储(密文)
        cipher = cipher & Chr(cipherByte)
    Next
    XOREncrypt = cipher
End Function

' XOR解密函数(和加密函数相同,因为XOR两次还原)
Function XORDecrypt(cipher, key)
    XORDecrypt = XOREncrypt(cipher, key)
End Function

' 执行加密和解密
ciphertext = XOREncrypt(plaintext, key)
decryptedtext = XORDecrypt(ciphertext, key)

' 输出结果
MsgBox "明文:" & plaintext & vbCrLf & _
       "密文(乱码):" & ciphertext & vbCrLf & _
       "解密后:" & decryptedtext, vbInformation, "XOR加密解密"

2. 简单数字签名验证程序

vbscript 复制代码
' 酒铺通知数字签名验证程序
Option Explicit

' 模拟RSA私钥/公钥(简化版)
Dim privateKey: privateKey = 3 ' 私钥d=3
Dim publicKey: publicKey = 7   ' 公钥e=7
Dim n: n = 33                  ' 模数n=33

' 模拟SHA256摘要函数(简化版,实际用系统API)
Function GetHash(text)
    Dim hash: hash = 0
    Dim i
    For i = 1 To Len(text)
        hash = (hash + Asc(Mid(text, i, 1))) Mod n
    Next
    GetHash = hash
End Function

' RSA加密(私钥签名/公钥验证)
Function RSAEncrypt(num, key, n)
    Dim result: result = 1
    Dim i
    For i = 1 To key
        result = (result * num) Mod n
    Next
    RSAEncrypt = result
End Function

' 老板生成通知并签名
Dim notice: notice = "茅台单价调整为999元"
Dim hashValue: hashValue = GetHash(notice) ' 计算摘要
Dim signature: signature = RSAEncrypt(hashValue, privateKey, n) ' 私钥签名

' 分店接收并验证
Dim receivedNotice: receivedNotice = notice ' 假设接收的原文(未篡改)
' Dim receivedNotice: receivedNotice = "茅台单价调整为899元" ' 篡改测试
Dim receivedHash: receivedHash = GetHash(receivedNotice) ' 重新计算摘要
Dim decryptedSignature: decryptedSignature = RSAEncrypt(signature, publicKey, n) ' 公钥解密签名

' 验证结果
If decryptedSignature = receivedHash Then
    MsgBox "通知验证通过:" & vbCrLf & _
           "原文:" & receivedNotice & vbCrLf & _
           "签名验证成功,是老板的真实通知!", vbInformation, "数字签名验证"
Else
    MsgBox "通知验证失败:" & vbCrLf & _
           "原文:" & receivedNotice & vbCrLf & _
           "签名验证失败,内容被篡改或不是老板发送的!", vbCritical, "数字签名验证"
End If

五、难点突破

加密技术抽象且涉及数学知识,新手容易陷入 "看不懂、不会用" 的误区,结合多年经验,我总结了针对性的教学方法,重点突破 RSA 算法和数字签名的理解难点:

1. 核心教学方法

(1)类比法
  • 对称加密 → "家里的门锁":一把钥匙开一把锁,钥匙丢了就完了;
  • 非对称加密 → "邮局信箱":公钥是信箱口(公开),私钥是信箱钥匙(保密);
  • 数字签名 → "手写签名 + 防伪水印":签名(私钥加密)唯一,水印(摘要)防篡改;
  • RSA 的大质数分解 → "把两个大球揉成面团容易,把面团拆回两个大球难"。
(2)分步拆解法
  • 讲 RSA 时,先拆 "密钥生成→加密→解密" 三步,用小质数(3、11)举例,先掌握逻辑,再扩展到大质数;
  • 讲数字签名时,先拆 "生成摘要→私钥签名→公钥验证→对比摘要" 四步,每步只讲核心动作,不纠结细节。
(3)动手实验法
  • 先让学生运行 VBScript 的 XOR 加密程序,修改明文 / 密钥,观察密文变化;
  • 篡改数字签名案例中的原文,让学生看到 "验证失败" 的结果,理解完整性验证;
  • 对比不同密钥长度的加密效果(8 位 vs128 位),直观感受密钥长度的影响。
(4)结合实际业务理解用途
  • 对称加密:酒铺系统传输大量订单数据(快);
  • RSA:客户支付密码传输(安全,公钥加密);
  • 数字签名:老板给分店发调价通知(验证身份 + 防篡改)。

2. 难点突破

(1)RSA 算法的密钥生成与加解密流程
  • 突破方法:
    1. 放弃复杂数论,只用 "小质数 + 简单乘法 / 取模" 举例,先理解 "加密用公钥、解密用私钥" 的逻辑,再提实际 RSA 用 2048 位大质数;
    2. 用流程图可视化 RSA 流程:
bash 复制代码
flowchart TD
    A[选质数p=3,q=11] --> B[计算n=33,φ(n)=20]
    B --> C[选公钥e=7]
    C --> D[算私钥d=3]
    D --> E[加密:6^7 mod33=30]
    E --> F[解密:30^3 mod33=6]
(2)数字签名的验证逻辑
  • 突破方法:
    1. 先做 "物理实验":写一句话在纸上,计算字符 ASCII 码之和(摘要),用私钥加密摘要(签名);让学生改一个字,重新计算摘要,对比发现不一致;
    2. 用代码案例演示:先运行 "未篡改" 的验证,再篡改原文,运行 "验证失败" 的案例,直观理解 "摘要对比" 的核心;
    3. 区分 "签名" 和 "加密":签名是 "私钥加密摘要",验证是 "公钥解密 + 摘要对比",加密是 "公钥加密数据",解密是 "私钥解密数据"。
(3)字符编码与二进制运算的关联
  • 突破方法:
    1. 先教基础:字符→ASCII 码→二进制,比如 "A"=65=01000001,让学生手动转换;
    2. 用 XOR 运算的核心特性 "异或两次还原" 做演示:比如 65 XOR 123 = 62,62 XOR 123 = 65,让学生手动计算,理解加密解密的本质。

六、最后总结

从早年用简单字符偏移加密密码,到后来用 AES+RSA 保护酒铺系统的核心数据,我最大的感悟是:加密的核心不是 "搞复杂的数学",而是 "用合适的算法解决安全问题"------ 对称加密快,用于大数据;非对称加密安全,用于密钥和小数据;数字签名验证身份,三者结合就是完整的安全体系。

从核心要掌握三个重点:

  1. 对称与公开密钥加密的区别:对称加密单密钥、速度快、分发难;非对称加密双密钥、速度慢、分发易,实际应用中通常结合使用;
  2. 数字签名的验证逻辑:核心是 "信息摘要对比",私钥签名、公钥验证,既验证身份,又保证数据完整性;
  3. 加密的核心价值:保护数据隐私(加密)、验证身份(签名)、确保完整(摘要),是网络传输安全的基石。

难点的突破关键:

  1. 讲 RSA 时,先简化(小质数)再扩展(大质数),先懂逻辑再懂数学;
  2. 讲数字签名时,先做物理实验再写代码,先理解 "防伪" 再理解 "算法";
  3. 所有抽象概念都用生活类比,让新手从 "能理解" 到 "会使用",再到 "懂原理"。

新手学习加密,最容易陷入 "追求复杂算法" 的误区。我的建议是:先掌握 XOR、AES、RSA 的核心逻辑,用简单代码实现加密和解密,再结合实际场景(比如密码传输、文件加密)理解用途 ------ 加密的本质是 "解决安全问题",不是 "炫技",能用最简单的算法满足安全需求,就是最好的选择。如今的加密技术不断发展(比如量子加密),但对称 / 非对称加密、数字签名的核心思想从未改变。就像我一辈子和数据安全打交道,从简单的字符偏移到复杂的 RSA,加密的工具变了,但 "保护数据不被窃取、不被篡改、不被冒充" 的核心目标从未变 ------ 这也是加密的本质:让数据在不安全的网络中,安全地传输和存储。

相关推荐
EntyIU6 小时前
python开发中虚拟环境配置
开发语言·python
乌萨奇也要立志学C++6 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
vyuvyucd7 小时前
C++引用:高效编程的别名利器
算法
AI 智能服务7 小时前
第6课__本地工具调用(文件操作)
服务器·人工智能·windows·php
鱼跃鹰飞7 小时前
Leetcode1891:割绳子
数据结构·算法
️停云️7 小时前
【滑动窗口与双指针】不定长滑动窗口
c++·算法·leetcode·剪枝·哈希
charlie1145141917 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++
wjs20247 小时前
Bootstrap5 消息弹窗
开发语言
资生算法程序员_畅想家_剑魔7 小时前
Kotlin常见技术分享-02-相对于Java 的核心优势-协程
java·开发语言·kotlin
IT=>小脑虎8 小时前
C++零基础衔接进阶知识点【详解版】
开发语言·c++·学习