计算机网络中的安全1
文章目录
1.什么是网络安全
两个主题通过计算机网络进行通信中的通信安全,这种通信安全具有以下性质:(假设下载你和我在通信)
- 机密性。只有你和我直到我们之间通信的内容。做到这一点,需要用到加密技术。
- 报文完整性。我希望我们之间通信的信息在在通信过程中不会被(恶意或意外地)改动。需要可看传输和检测合技术。
- 断点鉴别。我如何证明正在和我通信的“你”(对方)是你(本人)。需要用到端点鉴别技术。
- 运行安全性。抵御或防止对我主机(个人电脑、服务器)的恶意攻击。
主要应对的入侵有:窃听、对报文数据的增删改。
2.使用加密
2.1密码学的一些基本概念
报文的最初形式(我想要发给你的原始数据加上一些其他的数据,他们都是未加密的)称为明文。
我用一种加密算法将报文加密成一般人看不懂的形式。生成的这种一般人看不懂的加密报文称为密文。
加密算法简单可以理解为 (秘钥Ka+明文m) 二者经过加密算法运算之后密文(可以用Ka(m)表示)。秘钥一般是一串数字或字符。
如果你希望看懂我发的信息,自然就需要解密算法和秘钥Kb(加密和解密用的秘钥可能相同也可能不同,后面会讲到)。
经过 (秘钥Kb+密文Ka(m))二者经过解密算法运算之后的到明文m(用公式表达是Kb( Ka(m) ) = m)。
2.2对称加密
加密和解密用的秘钥相同的加密算法成为对称加密。
凯撒密码
算法:对于英语文本,将报文中的每个字母用字母表中该字母后第k位替换。
举例:加入选取k=1,那么报文中所有的’a’变为’b’,所有的’b’变为’c’······所有的’z’变为’a’。
明文m=“hello”,经过加密之后的密文是"ifmmp"。
限制:秘钥k只有25种可能,很容易暴力破解(对k一个一个尝试)。
单码代替密码
凯撒密码的改进。
算法:每一个字母都有一个唯一的替换字母,这个字母根据替换规则来定,并不一定是后k位。
如果不知道替换规则,那摆在面前的就是26!种配对方法,安全性较凯撒密码提高了不少。
限制:对明文护具语言进行统计分析,利用字母的出现频率和组合规律,猜测可能会有的信息,使得密文容易被破解。
三种入侵情况:
- 唯密文攻击:只知道密文、可以通过统计分析的方法帮助破解。
- 已知明文攻击:破坏者以某种方式得知明文中存在一些字母组合,例如"hello",记录下来密文就会可能会得到’h e l o '这些字母的匹配。
- 选择明文攻击:破坏者选择一些报文明文并且得到对应的密文,例如破坏者通过某种方式诱导我给你发一段他想要我发送的信息。
多码代替密码
再次改进,对于一个字母’a’,它可能拥有不止一个替代字母,例如有’c’和’e’那么在加密是,我们可以一次使用’c’和‘e’进行替换。
块加密
块加密指的是把要加密的明文分为k比特的块。例如取k=64。则明文被分为若干个64位的块。每个块单独加密。
块加密的应用包括安全电子邮件PGP、使TCP连接更安全的SSL、使网络层传输更安全的IPsec。
那么这些被分割k比特的块优势如何加密的呢?
有两种方法:
- 一种是像上面提到的那样用其他的串来代替。例如 k=3,则可以使用’001’代替’111’。
- 这样的方法中k值越大,提到方案就越多,也就越安全。但是维护一个k值很大的对应表是一件很困难的事,因此我们需要再次改进。
- 另一种是用函数模拟随机排列表。如下图,假设原来选择的k=64,我们先将64比特的块分为8份,每份8比特。对于每一个8比特份的一小份,进行替换(8比特的替换维护起来比较容易)。然后将替换之后8比特份打乱顺序重新排成一个64比特块。对于这个新的64比特块,我们继续进行上述操作。
- 置乱函数应当告知对方或使用公开的置乱函数,不然对方也没有办法解密。保证只有你能解密的关键是秘钥:一个字符串,它决定了8比特之间的替换规律(图中的T)和算法内部排序。对于长度为n的秘钥,有2的n次方中可能的秘钥。
- 循环n次的目的是使得每个输入比特影响最后输出比特的大部分。
目前流行的块密码技术有:数据加密标准DES、3DES、高级加密标准AES等。不同的算法在实现上有所差异(更为复杂)。
块密码的连接
如果单纯地使用上面的那些方法。可能会出现有几个数据块明文相同的情况,他们经过加密后得到的密文也想通,这就给破坏者猜测其明文的机会。
改进办法:发送方在发送第i块数据的时候,随机生成一个随机数r(i),并且计算c(i)=Ks( m(i)⊕r(i)) (Ks是用秘钥s加密的加密算法,m(i)是第i个明文块)
发送方实际发送的是c(1) r(1) c(2) r(2)······。
接收方通过计算m(i)=Ks( c(i)⊕r(i) )得到明文块。这样即使两个明文块相同,他们的密文快也不相同。
限制:这样导致要传输的数据是之前的两倍!!
改进方法:密码快连接CBC技术
仅随着第一个报文发送一个随机值。
具体实现:
- 在加密报文之前,发送方生成随机值成为初始向量 c(0)。以明文方式发送。
- 对于第一个块,发送方计算m(1)⊕c(0) 然后对这个和进行块密码加密。c(1) = Ks( m(1)⊕c(0) )。随后发送c(1)。
- 同理 第i个块发送 c(i) = Ks( m(i)⊕c(i-1) )。
接收方通过Ks解密得到 m(i)⊕c(i-1),而c(i-1)上一次已经得到,那就可以得到m(i)。
i | 对于第i个块接收方已知(接收到): | 计算 |
---|---|---|
c(0) Ks | ||
i=1 | c(1) c(0) Ks | 通过Ks解密得到 m(1)⊕c(0) 再得m(1) |
i=2 | c(2) c(1) c(0) Ks | 通过Ks解密得到 m(2)⊕c(1) 再得m(2) |
i=3 | c(3) c(2) c(1) c(0) Ks | 通过Ks解密得到 m(3)⊕c(2) 再得m(3) |
2.3公开密钥加密(非对称加密)
假设存在一个特殊的钥匙,K+和K-,K+只能把锁合上而不能打开,只有K-才能把锁打开。当我需要别人给我邮寄重要的东西时,我把K+公之于众,对方用K+把东西锁在箱子里,那么这时,只有我(拿着K-)才能把这个箱子打开。
用在加密中就是非对称加密。K+指的是公钥,对于任何人公开;K-是私钥,只有自己持有。
K-( K+(m) ) = m。
当然这种方法也是由一定
RSA算法
采用模n的算数运算
一些基本等式:
[ (a mod n) + (b mod n) ] mod n =(a + b) mod n
[ (a mod n) - (b mod n) ] mod n =(a - b) mod n
[ (a mod n) * (b mod n) ] mod n =(a * b) mod n
推出
(a mod n)^d mod n = a^d mod n
RSA算法秘钥生成步骤:
- 选择两个比较大的素数 p和q。
- 计算 n = p * q ,z = (p - 1) * (q - 1)。
- 选择小于n的一个数e,使得e与z没有非1的公因数(互质或互素)。
- 求出一个数d,使得e * d - 1可以被z整除。也就是 e* d mod z = 1。
- 得到公钥K+是(n,e),私钥K-是(n,d)。
假设我要发送一个长度为m的比特组合(m<n)。加密过程是 密文c = m^e mod n。
你收到c之后进行解密的过程是 明文m` = c^d mod n。
如何证明解密出的m`就是我发送的m呢?
m` = c^d mod n
c = m^e mod n
所以
m` = (m^e mod n)^d mod n
又因为
(a mod n)^d mod n = a^d mod n
假设 a = m^e
所以
m` = (m^e)^d mod n
= m^ed mod n
又因为
在数论中,如果p和q是素数,且有 n=p*q和z=(p-1)*(p-1),则x^y mod n 与 x^(y mod z) mod n是等同的。
所以
对于x=m,y=e*d
m` = m^(ed mod z) mod n 从这里也可以看出如果用私钥(n,d)加密后的数据也是只有对应的公钥才能解开。
又因为
e* d mod z = 1
所以
m` = m^1 mod n
= m
至此我们就证明了RSA确实可以得到这样的一对密钥。
下面的例子看起来会更直观
假设已经选择e=5,n=36,d=29
加密过程
明文字母 | 明文的数字表示 | m^e | 密文c = m^e mod n |
---|---|---|---|
l | 12 | 248832 | 17 |
o | 15 | 759375 | 15 |
v | 22 | 5153632 | 22 |
e | 5 | 3125 | 10 |
密文c | c^d | m = c^d mod n | 明文字母 |
---|---|---|---|
17 | 4.8196857210675091509141182522307e+35 | 12 | l |
15 | 1.2783403948858939111232757568359e+34 | 15 | o |
22 | 8.5164331908653770195619449972111e+38 | 22 | v |
10 | 100,000,000,000,000,000,000,000,000,000 | 5 | e |
2.4两种加密方法结合的方法
对称加密的问题在于如何将密钥传递给对方。而公开密钥加密的问题在于运算量大,速度较慢。
有一种方式将二者结合起来:首先通过公开密钥加密的方式发送给对方一个密钥,然后双方通过这个密钥进行对称加密。
这种方法也叫作会话秘钥。
3.报文完整性和数字签名
在网络安全的四个性质中,第一个“机密性”可以通过加密实现,这一部分我们来看看如何实现报文完整性,和如何利用数字签名技术。
在收到一个报文时,即使通过加密技术使得信息没有被泄露,我们依然会有以下两个担忧:
- 这个报文真的是A发送过来的吗?
- 这个报文在传输过程中有没有被人篡改过?
3.1密码散列函数
散列函数指的是以m为输入,计算得到有个固定长度的字符串(散列值)H(m)。
密码散列函数可以使得对于任意两个不同的报文报文x和y H(x)和H(y)不可能相等。
因此原报文a发生一点变化(a0),H(a)!=H(a0)这样就可以察觉到传输过程中报文是否发生变化。
常见的有MD散列算法。
3.2报文鉴别码
发送方生成报文m,并为m计算出散列值H(m),将(m,H(m))一起作为一个扩展报文发送给对方。对方在接收后根据得到的m再次散列并将结果与扩展报文中的H(m)进行比较,如果结果一致,则证明该报文完整。
限制:如果仅仅采用散列函数还是有问题,例如破坏者在最该m为m0后将H(m)也变为H(m0)那么接收方将无从察觉。
改进:通信双方共享一个秘密信息 鉴别秘钥s,一个比特串。
这时候发送方发送的是(m,H(m+s))扩展报文,由于破坏者不知道s,因此他也就无法伪造H(m+s)。
H(m+s)被称为报文检测码MAC(注意这个MAC不是数据链路层的那个MAC帧)
MAC的优点:仅关心报文完整性为不必关心机密性。
当然这里将的MAC只是基本原理,实际使用的时候回对它进行改进。现在常见的有HMAC。
最后,对于鉴别秘钥 s,可以通过非对称加密的方式发送。
3.3数字签名
首先,签名是用于证明我自己(确实确实做过某件事情、同意或承认某件事情),电子签名是一种在数字领域实现这些功能的密码技术。
数字签名应当是可鉴别的、不可伪造的。
具有这种性质的这东西一般是独特的,前面我们讲到的非对称加密中,私钥就具有这样的性质。
因此我们可以通过私钥对要发送的报文或文件进行加密,而公钥是公开的,即使是加密过的文件对于公众来说也是可以解密的,而一旦这个文件可以用我的公钥打开,那也就说明我对这个文件进行了签名。
限制:非对称加密计算量大,而且没有必要对整个报文或文件进行加密。
改进:通过散列函数得到报文或文件的报文摘要,我们对于这个摘要用私钥进行加密,而后将报文本身与已经进行数字签名的报文摘要(可以直接称为数字签名)一起发送出去。
3.4公钥认证
即证明某个公钥属于某个特定的实体。
当我在使用非对称加密与A进行通信时,我必须要确认我是用的公钥是属于A的。
将公钥与实体进行绑定是由认证中心CA完成。CA的职责就是使识别和发行证书合法化。
主要功能:
- 正式一个实体的真实身份。
- 一旦CA验证了一个实体的真实身份,CA就会生成一个将其身份与实体公钥绑定的证书。
4.端点鉴别
端点鉴别就是一个实体经过计算网络向另一个实体证明其身份的过程。
其中一个重点是鉴别对方是“活动的”实体。
鉴别协议ap一般在两个通信实体运行其他协议之前进行,仅当鉴别完成之后才能运行其他协议。
下面以通信双方A、B和破坏者C进行说明。
ap1.0
A说:我是A B就认为它是A
C说:我是A B就认为它是A
ap2.0
通过IP地址
C可以生成一个数据报,并在IP数据报中填入A的IP地址。
A说:我是A+IP地址 B就认为它是A
C说:我是A+A的IP地址 B就认为它是A
ap3.0
使用秘密口令。
C可以窃取秘密口令
A说:我是A+秘密口令 B就认为它是A
C说:我是A+A的秘密口令 B就认为它是A
ap3.1
使用加密的秘密口令
回放攻击C可以直接将加密后的秘密口令拿去证明自己的身份。
ap4.0
上述ap3.0 3.1的只要问题是,B不能确定是A发送给自己口令还是C的回放。也就是说B无法判断此时A是否是在活跃状态。
引入不重数,在一个协议周期中只使用一次的是。
- A向B发送报文:“我是A”
- B选择一个不重数R,发送给A。
- A使用A与B共享的对称秘钥Kab机密不重数R,然后发送给B。
- B收到后解密,如果得到刚刚发送的R,则可以认为对方是A。
关键在于这是B可以明确两点:通信对方就是A、A是活跃的。
参考资料《计算机网络 自顶向下方法》