一整天都在摆烂,学点密码学基础吧,之后权限维持之类的可能用得上
问题场景:
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)
暂无评论