在本篇中介绍了以下几个方面:
-
机密性
-
密码学
-
对称加密算法(DES, 3DES, AES)
-
公开秘钥算法
- RSA大素数的获取
-
-
完整性
-
散列函数(MD5, SHA-1, 并没有提及算法实现)
-
报文鉴别(MAC)
-
数字签名
-
-
端点鉴别
-
应用
- SSL(TCP网络安全)
-
运行时安全
- 防火墙的基本知识
主要体现在以下几个方面:
-
机密性, 即发送的信息只有双方彼此能够解读,其他人以任何方式皆无法解读。
-
报文完整性, 即接收方需要能够验证,当前接收到的数据是完整的,没有被经过篡改的。机密性与完整性是相互独立的两个属性。
-
端点鉴别, 需要知道我收到的消息, 确确实实是来自于对方, 而不是恶意方伪装的。
-
运行性安全, 需要能够识别并阻拦恶意攻击。如 Dos攻击等, 其目的并非为了窃取信息,而是使得系统瘫痪, 无法运行。
机密性
首先来看机密性问题, 小明和小红之间发送的有效信息 不希望被第三方解读。 而实现这点的方式自然是, 加密, 加密,就需要相关的密码。
密码学
加密所要实现的根本目的是,将数据加密,除非拥有相关的秘钥,算法,才能够 也 必须能够 将数据恢复到 原始数据。
这里的原始数据被称作明文, 小明使用了加密算法加密其明文, 生成的文本为密文, 加密算法是公知的,而秘钥是私有的.
对称秘钥体系
-
凯撒密码 是一种简单的加密算法。
对于字母而言, 约定 用 当前字母的后 第K个字母加以替换, 即可生成对应的密文。
如: a b c k=2-> c d e
只需要双方约定好共同的K, 即可进行加密解密。
-
更进一步 则是将 k=2 换成只有双方知道的算法, 如 k = index + 1, 即 k=3
但缺点同样明显, 文本自身并不是没有特点的, 如小明和小红在沟通的时候常常会在开头加入对方的姓名, xiao hong,
那么经过加密之后,变成了 zkcq jqpi, 则根据习惯来推算, 很容易就得出来 K = 2.
-
即使是它的改进算法:
单码代替密码, 也难以规避掉这个问题。
单码代替密码不再使用固定的K, 而是有 密码本 将 明文一一映射替换为 密文, 如 a->h b->k c->a, 双方都持有相应的密码本,即可完成加解密工作。
但是依然是之前的 xiao hong 作为惯用语, 随着接收到的密文不断变大,变多,则能够逐步推算, 还原出对应的密码本。 完成解密工作。
-
多码代替密码
这是对单码代替密码的一种改进, 对于明文中 文本 位置的不同 采用不同的 密码本进行匹配。
而秘钥呢? 则是 多个密码本, 以及 位置 和 密码本之间的匹配关系。
对称加密在现代社会有两种宽泛的类型: 流密码, 块密码。
我们会观察到这样两个问题:
-
在上面提到的几种简单的文本加密算法中, 仅仅能够对文本进行加密, 而我们在网络中传输 可不一定是文本,更大的可能性是流。 包括协议的首部, 数据报本身。我们所需要加密的对象不仅仅是文本, 而在网络中 自然更为合适的是对 数据流进行加密。 这并不意味着是 流密码。
-
可匹配的可能性依然太少, 适用性不够强。
而块密码, 正是前面几种简单密码的延伸。
我们将数据流进行拆分 3 6 64 128 等等 bit 为一个块, 然后对每一个块都进行加密。
注意到 对 3 bit块进行加密。 可能会映射到的结果有: 000 001 010 011 100 101 110 111 即 2^3 8中可能性。
而我们的输入同样有8种可能性, 因此会映射为 8! = 40320 种可能的结果。 即对每一种输入都找到其映射结果, 且与其他输入的结果不重复。
40320 种可能的结果, 对现代计算机来说破解起来实在是一件很轻易的事情。而为了防止被破解, 因此往往会采用更大的块 做为映射, 比如说 64位, 这样我们的可能结果就有 (2^64)! 想要破解无疑是一件很困难的事情。
不仅仅是破解起来很是困难,实现起来也是同样的困难,需要双方维护一个 2^64 的输入输出映射表, 如果需要改变映射表, 也需要双方都进行调整才可以。
而真实采用的方式,则是 使用函数来模拟 随机排列表, 一个简单的例子是:将 64bit拆分成 8 * 8 bit, 每次用一个 8bit的映射表,去置换第一个块, 将置换后的结果 与 剩余部分混合, 再循环置换 剩下的 bit块,经过n次循环以后, 就提供了一个64bit的块, 这种算法的秘钥是 8张排列表。
DES算法
DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。
密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组。
需要注意的地方是, 如果初始秘钥转换成 byte之后, 如果其前7位是相同的, 那么这两个秘钥所计算出来的数据就是相同的。 因为 8 16 等等 是不参与DES运算的。
参考链接:JAVA DES 秘钥问题
将初始秘钥 通过16轮的计算,转换, 生成16个子秘钥(子秘钥长度为48位)。
而后将明文数据:
首先按照固定的置换规则, 将原数据中的64bit 进行置换。 得到新的数据。
其中置换后的数据被分为两部分, L0、R0, L0是输出的左32位,R0是右32位
按照一定的规则 迭代置换 运用之前计算得到的 秘钥 加密, 16轮之后, 即得到所需的L16, R16。将两部分合并成一个分组,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
其初始置换数据:
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-undefined">58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7,
</code></span></span>
逆置换:
在初始置换规则表中, 观察会发现, 原本第一位的被挪到了第40位, 而在逆置换中, 需要将第四十位置换到第一位即可。
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-undefined">40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58 26,
33,1,41, 9,49,17,57,25,
</code></span></span>
正如上面所提到的:核心就是 置换,混合。 解密则是其逆过程。
3DES
3DES(即Triple DES)是DES向AES过渡的加密算法,它使用2条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。
设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文
3DES加密过程为:C=Ek3(Dk2(Ek1(M)))
3DES解密过程为:M=Dk1(EK2(Dk3(C)))
即用 k1对数据加密 k2对加密过的数据解密 k3 对解密之后的数据再度加密.
K1、K2、K3决定了算法的安全性,若三个密钥互不相同,本质上就相当于用一个长为168位的密钥进行加密。多年来,它在对付强力攻击

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



