boxmoe_header_banner_img

梦中的登神殿,天才的乱葬岗

加载中

文章导读

密码学基础(摸鱼的一天)


avatar
RootReapers 2026年3月3日 168

一整天都在摆烂,学点密码学基础吧,之后权限维持之类的可能用得上


问题场景:

A和C在互相传递消息

此时,中间者B对二者消息进行监听,B能够获取到A和C之间的所有消息


那么消息的安全性将不复存在


基础知识:

明文:可以正常阅读的消息

密文:被加密的消息

密钥:加解密需要用到的关键

算法:加密的方式


现实世界的密码学远比我们这里用的复杂得多。但基本模式保持不变:

加密过程:明文 + 加密算法 + 密钥→密文

解密过程:密文 + 解密算法 + 密钥→明文

类比锁和箱子

算法:锁的工作原理,任何人都能看到你插入钥匙并且转动它

密钥:你个人专属的钥匙,只有拿到钥匙才能打开锁

明文:箱子里被锁住的东西

密文:箱子


没人试图隐藏锁的工作原理来确保锁牢固。安全性来自于保持密钥私密,这个原则同样适用于密码学。算法通常公开,并由全球专家进行测试。安全性来自于保密钥匙



对称加密场景:

A要给B寄一封绝对不能泄密的文件

但是中间必须要经过公共邮政系统,任何人都能打开阅读


A的做法如下:

把文件放进一个上锁的箱子里

然后寄过去

B再用相同的钥匙打开


这就是对称加密

加解密用到的密钥一样


对称加密的实例

凯撒密码(可能有些人在电视剧里听说过)

它可以用于学习,但是在实际生活中,它十分地不安全

凯撒密码的本质其实就是字母移位


比如对hello进行加密

h向右移动3位变成k

e向右移动3位变成h

l向右移动3位变成o

l向右移动3位变成o

o向右移动3位变成r

从hello变成khoor

密钥是3

算法是字母移位(凯撒)


对方要解密,就是用密钥往左反推3个字母

这种加密方式在CTF里也很常见,它还有一个名字,叫做ROT密码


密钥为5时,它是ROT5

密钥为13时,它是ROT13


如果有人截取了密文,但是他不知道密钥

如何解密?

写脚本,将密文看作一个字符数组(第一位索引为0依次类推)

循环取每一位的ascii码然后对其-1,然后再转回字符(此时是一个新字符,因为ascii值-1了),读到最后一位时输出完整的新字符串

再继续循环,第二次循环,由-1变成-2

依次类推

一直到-25就行了


对我们人类来说,可能很繁琐,但是电脑解密只需要1毫秒不到


这只是一个简单的例子,并不适用于真实系统的加密(你敢用是这个👍,领导不骂你是这个👎)


对称加密解析:

同一个密钥用于加解密

发送方和接收方都需要有该密钥的副本

密钥必须对其他人保密


优点:

对称加密速度很快,能够处理大量数据

效率很高


但是问题来了,数据加密好了,密钥怎么传输?


就像寄一个上锁的箱子,总得把钥匙也寄过去吧

那寄钥匙,上锁的意义在哪?


这就是对称加密的致命弱点



接下来是非对称加密

非对称加密的最大特点就是:加解密用的不是同一个密钥

它的密钥分为公钥和私钥


公钥:任何人都能知道

私钥:只有自己知道


巧妙之处:用某人的公钥加密某串数据,那么只有这个人的私钥可以解密

用私钥加密某样东西,任何拥有公钥的人都可以解密


比如街角的邮箱

邮箱槽:公钥,任何人都可以送信,塞里面之后,相当于被锁上了

邮箱的锁:私钥,只有管理员能开


场景

A在自己电脑上创建了一对公私钥

私钥留给自己,公钥完全对外公开


B拿到了公钥,然后B用A的公钥把消息加密,发给了A


A收到后,用私钥解密了它


最常见的用法:

HTTPS协议

对,就是那个网站常用的https

CTF学web的都知道

安装burpsuite的时候要装个证书,不然抓不到HTTPS的包

浏览器会报不安全


因为burpsuite就像是你和网站的中间人

如果被中间人偷听到,那么数据传输的机密性也就不复存在了


它的工作原理:

你的浏览器向网站请求公钥

网站会把公钥包裹在证书(待会说)里面,回传给浏览器

浏览器拿到公钥,接下来,浏览器和网站的交互将是完全加密的


回到刚才的场景

B能拿到A的公钥

但是B怎么确定公钥是A的,而不是一个冒充者

这时候,证书的作用就体现出来了


证书是一种数字文件

能够包含某人的公钥,声明公钥属于谁

并且由一个可信的权威机构(CA,证书授权中心)对其进行数字签名(确保不被篡改)


浏览器和网站交互时,网站提供证书

首先会检查是否为可信的权威机构签署的

其次检查是否有效,签名是否过期

一切正常,浏览器接收公钥


非对称加密的优点:

机密性强

几乎不可能被爆破

安全


缺点:

加密速度慢


前置数学知识

数学基础知识:

xor异或运算:两个数字相同为假,不同为真
比如1^1=0(^是异或运算的符号)
1^0=1
0^0=0
1和0在计算机中代表真和假

如何在密码学中运用?
现在有一串明文A
它的二进制值是P
K是它的密钥,也是二进制格式

那密文C就是B^K的值

取模运算:学过编程的都知道,就是除法取余数

真实系统中的对称加密与非对称加密

对称加密:常用的有AES和DES

非对称加密:RSA


先说RSA

这是一个理论上绝对安全的算法

数学都学过因式分解

把两个特别大的质数相乘是一个很简单的事

电脑计算器就可以


比如

982451653031

169743212279

这两个妥妥的质数,相乘很容易

982451653031 × 169743212279 = 166764499494295486767649

但是如果给出166764499494295486767649

能够分解出它的因子吗?可能计算器可以


但是如果是两个300位以上的巨大质数相乘呢?

显然就很困难了,几乎不可能

A选择了两个质数p和q

p = 157和q = 199

n = p × q = 31243


得到p,q,n

将它们通过欧拉函数计算一遍


欧拉函数如下

φ(n)=(p−1)(q−1)=pq−p−q+1=n−p−q+1

ϕ(n) = n − p − q + 1 = 31243 − 157 − 199 + 1 = 30888


得到ϕ(n)的值

再找一个值e,使e与ϕ(n)互为质数

这一步也比较简单

e=163


再找一个值d

满足e×d≡1(modϕ(n))


e×d≡1 (mod ϕ(n))的意思是

e×d的值除以ϕ(n),余数为1


用数学式子表达就是:

e×d=1+k×ϕ(n)


规定公钥为(n,e)也就是(31243,163)

私钥规定为(n,d)也就是(31243,379)

假设要加密的值x=13

那么A将计算并且发送密文y

y=x^e mod n=13163 mod 31243

y=16341


B收到后,通过计算

x=y^d mod n=16341379 mod 31243

即可还原密文



CTF中的RSA

主要变量

p,q,m,n,e,d

p和q是很大的质数

n是p和q的乘积

公钥是n和e

私钥是n和d

m是明文

c是密文



非对称加密RSA了解完了

有什么作用呢,运算这么麻烦,加密数据的速度会特别慢

它不适应于加密大篇幅文本

但是,它可以用于加密密钥本身


也就是非对称加密和对称加密的结合

把对称加密的密钥用非对称进行加密

那么密钥的安全性也保证了


假设A和B都有机密要传给对方

A的机密消息看作a

B的机密消息看作b

然后他们之间还有公开的材料c


假设,a,b和c被组合在一起后,它们将不再可能被分离

其次组合的顺序无关紧要


在这两个假设的前提下

A和B将他们的秘密与公开材料c结合

变为ac和bc

然后A把ac发给B

B把bc发给A


现在A手上有:a,bc

B手上有:b,ac


组合起来都是一样的:abc


研究一下具体实现:

A和B公开选择一个大质数p以及一个生成元g

生成元g是数论中的一个核心概念,特别是在有限域或模素数循环群中

简单来说,如果g是模p的生成元(又称原根)

那么g的幂次[g^1,g^2,g^3,…,g^(p−1)]

在模p下会得到1到p-1之间的所有数(每个数恰好一次)


用集合的形式表示

{g^1 mod p, g^2 mod p, …, g^(p-1) mod p} 等于集合 {1, 2, …, p-1}

顺序不一定一致,但是计算完成后会发现得到了1~p-1的所有数


这里选择p为29和g为3


A和B再选择一个私有的整数

a=13

b=15


然后开始计算ac和bc

ac=g^a mod p=3^13 mod 29 =19

bc=g^b mod p=3^15 mod 29=26


互相发送给对方

A拿到bc后

计算(bc)^a mod p=10

B拿到ac后

计算(ac)^b mod p =10

结果一致,密钥成功交换


双方拿到了密钥

接下来直接通过对称加密进行通信即可



所选数字太小,无法提供任何安全性,在现实应用中,我们会考虑更大的数字(比如50位,100位,300位)




评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码