应用密码学与网络安全实验通关指南

这是计科网络方向应用密码学与网络安全的随课实验, 占课程分数的20%. 第一次主要是介绍内容, 两周后的第二次实验主要是验收, 实验内容自己线下完成即可.

实验内容如下:

  1. 密码学及应用:熟悉云安全实验平台及环境,完成:
    实验1(古典密码算法)――>练习一Caesar密码,
    实验1(古典密码算法)――>练习二单表置换密码,
    实验1(古典密码算法)――>练习三仿射密码
  2. 密码学及应用:
    实验2(对称密码算法)――>练习一DES,
    实验2(对称密码算法)――>练习二AES
  3. 密码学及应用:
    实验3(非对称密码算法)――>练习一RSA,
    实验4( Hash算法) ――>练习一MD5
  4. 密码学及应用:
    实验5(密码应用)――>练习一文件安全传输

这个实验的目的是为了考察对于各个加密算法的流程的理解和掌握, 并不是要让你真的手搓这些算法(当然能手搓也是一种能力). 最后验收只要将结果展示出来并且能解释清楚(需要完整讲述算法流程, 主要验收DES, AES, RSA, MD5, 以及文件安全传输)

DES

DES 算法是在 Feistel network 的基础上执行的.以下是 DES 算法的流程图:

avatar

我们可以看到DES算法可以分为左右两个部分, 左半部分为迭代加密, 右半部分为子密钥生成.

子密钥生成

我们要从初始的64位的秘钥中生成16个48位的子密钥(Sub-key), 大致步骤如下:

  1. 初始秘钥经过PC-1置换, 得到56位的初始秘钥, 剩余的8位做校验位
  2. 将56位的初始秘钥分成左右两部分, 分别记为Ci, Di
  3. 将左右两部分分别循环左移1~2位, 即可得到Ci+1, Di+1, 当i=1,2,9,16时左移1位,其它左移2位。
  4. 将Ci+1, Di+1分别经过PC-2置换, 合并到一起就得到了48位的子密钥
  5. 如此总共进行16轮, 就得到了16个48位的子密钥

迭代加密

迭代加密部分, 主要分为两个步骤:

  1. 初始明文经过IP置换, 将其分为左右两半部分分别为L和R
  2. 每一轮迭代,都是接收一组 L, R,返回 L’, R’ ,作为下一轮迭代的 L, R . 迭代过程如下:其中F函数(称为轮函数)是整个算法的核心,功能是:以一个子密钥,加密 32-bit 的信息。
    avatar
  3. 利用之前得到的 16 个子密钥,执行步骤 2 一共 16 次
  4. 将最终的 R 与 L 拼接,再做一次FP置换(IP置换的逆变换),即得到密文

轮函数

  1. 对32位的输入进行E扩展, 变为为48位的扩展输出
  2. 扩展输出与子密钥进行异或运算
  3. 扩展输出经过S盒置换, 得到32位的输出
  4. P置换, 得到28位的输出

AES

AES算法的流程图:
avatar

每一轮迭代都是字节替换, 行移位, 列混淆, 轮秘钥加这四个步骤. 以128位秘钥为例, N=10, 需要N+1(11)个轮秘钥, 中间循环迭代N-1(9)轮, 也可以说迭代N轮, 最后一轮不进行列混淆

关于字节替换, 行移位, 列混淆的具体细节可以去看PPT, 在验收时不要求能详细说出来.

秘钥扩展

AES加密可以采用不同长度的秘钥, 一般为128位, 192位, 256位, 分别对应10轮, 12轮, 14轮. 秘钥扩展的步骤如下(以128位秘钥为例):

  1. 扩展密钥的前四个字直接由输入密钥中复制,即w[0]~w[3], w[i]的值等于w[i-1]异或w[i-4] (i>=4,i不是4的倍数)
  2. 对于下标为4的倍数的密钥字,其产生方法更为复杂,表示为函数g(w[i-1]). 包括的运算步骤有:字循环(RotWord):使一个字中的4个字节循环左移一个字节; 字节代换(SubWord):利用S盒对输入字中的每个字节进行代替; 字循环与字节代换的结果再与轮常量Rcon[j]相异或
  3. w[i]的值等于w[i-4]异或g(w[i-1]) (i>=4, i是4的倍数)

示意图:
avatar

MD5

MD5是一个基于哈希函数的加密算法, 其输入为任意长度的二进制数据, 输出为128位的二进制数据.
其流程如下:

  1. 对输入明文进行填充, 使其能被512整除(后面每一轮的输入都是512位),填充的具体步骤如下: 首先将数据长度表示为二进制形式,并附加到数据的末尾; 在数据末尾添加一个’1’比特,然后填充0直到数据长度满足对512取模的结果为448(即数据长度模512等于448); 将数据长度(64位)附加到填充后的数据末尾,以二进制表示
  2. 将512位的明文分组划分为16个子明文分组,每个子明文分组为32位
  3. 初始化4个32位的链接变量,记为A、B、C、D, 初始是固定值
  4. 对每个子明文分组和四个链接变量(a,b,c,d, 如果是第一次运算的话, 就是ABCD的值)都进行FF,GG,HH,II四轮运算(共64次运算)
  5. 将运算之后的链接变量a,b,c,d与初始链接变量A,B,C,D进行求和运算得到新的链接变量
  6. 新的链接变量作为下一个明文分组的输入重复进行以上操作
  7. 最后,4个链接变量里面的数据就是MD5摘要

RSA比较简单我就不写了

文件安全传输

要设计一套A和B之间可以安全通信的方案, 不需要考虑传输部分, 因为这是基于前面的代码的, 集成起来比较麻烦. 验收时讲解流程和展示结果即可, 不需要现场运行

方案设计:

avatar

参数选取

RSA A:选择 p=61,q=53,e=17 得到公钥(e,n)=(17,3233) 私钥(d,
n)=(2573,3233)
RSA B:选择 p=47,q=59,e=63 得到公钥(e,n)=(63,2773) 私钥(d,
n)=(847,2773)
明文: levit
AES 秘钥: 12345678KJNMLSDG

加密过程(A):
AES 密文: 640246746 37579803911 321220508 1223758774 116
用 B 的公钥对 AES 秘钥进行 RSA 加密 RSA_AES_miyao : ۯ Ϳ ʭ ؆ ij β ճ ਝ ѽ
॥ ¤ ઁ উ ३ ષ
对明文计算 MD5 摘要,MD5_miwen: ea152a3ff6469c391ee8c79a01191d80
A 的私钥对 MD5_miwen 加密, RSA_MD5_miwen: ઁ ઁ ઁ ۰ χ χ స ص
స ਘ ō ۰ ਘ ұ ō ਘ ઁ ਐ ਘ Ɵ ұ ਐ ষ
最后把加密生成的文件 AES_miwen.txt、RSA_AES_miyao.txt、
RSA_MD5_miwen.txt 打包发给终端 B

解密过程(B):
终端 B 的私钥对 RSA_AES_miyao.txt 进行 RSA 解密, 得到:AES_Key
对 AES_miwen 解密,得到明文 AES_mingwen.txt
用 MD5 算法对所得明文 AES_mingwen.txt 进行加密生成解密后的明文摘要。得
到: AES_mingwen_MD5.txt
RSA 算法用终端 A 的公钥对 RSA_MD5_miwen.txt 进行解密,得到:
RSA_MD5_mingwen.txt
比较 RSA_MD5_mingwen.txt 和 AES_mingwen_MD5.txt 有什么不同

加密结果与编码有关, 同样参数也可能显示不一样的结果

结果展示:

avatar
avatar
avatar
avatar

代码和实验报告开源在了我的github上, 如果对你有帮助的话, 欢迎star和follow😘