项目概述

项目使用python和tkinter实现,能够实现对明文/密文的加解密,或对文本进行base64、url编码/解码。

需求分析

实现多种常见的ctf加密/解密(编码/解码)方法,选择相应加密/解密(编码/解码)算法后,输入明文/密文,可以给出结果。算法包括凯撒密码、仿射密码、维吉尼亚密码、RSA密码、base64编码、纵栏式移项密码、url编码。

方案设计

总体方案设计

理解常用的加密/解密(编码/解码)原理,用编程语言实现基本的算法功能,最后在实现图形化界面。

功能设计

用python实现基本的算法功能。

界面设计

用tkinter实现图形化。

项目实施计划

main函数,实现GUI

# 实现图形化,用户的输入口
import tkinter as tk
import tkinter.messagebox
import CaeCode
import AffiCode
import VigCode
import RSACode
import Base64
import DisCode
import URLdef coChoose():# 凯撒加密if codeVar.get() == 0:text = enText.get('1.0', tk.END)text = text.strip()key = enKey.get('1.0', tk.END)key = key.strip()prin = CaeCode.Cae(1, text, key)buT.config(text=prin)# 仿射加密elif codeVar.get() == 1:text = enText.get('1.0', tk.END)text = text.strip()a = enKey.get('1.0', '1.0 lineend')a = a.strip()b = enKey.get('2.0', '2.0 lineend')b = b.strip()prin = AffiCode.Aff(1, text, a, b)buT.config(text=prin)# 维吉尼亚加密elif codeVar.get() == 2:text = enText.get('1.0', tk.END)text = text.strip()key = enKey.get('1.0', tk.END)key = key.strip()prin = VigCode.Vig(1, text, key)buT.config(text=prin)# RSA加密elif codeVar.get() == 3:text = enText.get('1.0', tk.END)text = text.strip()p = enKey.get('1.0', '1.0 lineend')p = p.strip()q = enKey.get('2.0', '2.0 lineend')q = q.strip()e = enKey.get('3.0', '3.0 lineend')e = e.strip()prin = RSACode.RSA(1, text, p, q, e)buT.config(text=prin)# Base64编码elif codeVar.get() == 4:text = enText.get('1.0', tk.END)text = text.strip()prin = Base64.Base(1, text)buT.config(text=prin)# 纵栏式移项加密elif codeVar.get() == 5:text = enText.get('1.0', tk.END)text = text.strip()key = enKey.get('1.0', tk.END)key = key.strip()prin = DisCode.Dis(1, text, key)buT.config(text=prin)# url编码elif codeVar.get() == 6:text = enText.get('1.0', tk.END)text = text.strip()prin = URL.url(1, text)buT.config(text=prin)def deChoose():# 凯撒解密if codeVar.get() == 0:text = enText.get('1.0', tk.END)text = text.strip()key = enKey.get('1.0', tk.END)key = key.strip()prin = CaeCode.Cae(2, text, key)buT.config(text=prin)# 仿射解密elif codeVar.get() == 1:text = enText.get('1.0', tk.END)text = text.strip()a = enKey.get('1.0', '1.0 lineend')a = a.strip()b = enKey.get('2.0', '2.0 lineend')b = b.strip()prin = AffiCode.Aff(2, text, a, b)buT.config(text=prin)# 维吉尼亚解密elif codeVar.get() == 2:text = enText.get('1.0', tk.END)text = text.strip()key = enKey.get('1.0', tk.END)key = key.strip()prin = VigCode.Vig(2, text, key)buT.config(text=prin)# RSA解密elif codeVar.get() == 3:text = enText.get('1.0', tk.END)text = text.strip()p = enKey.get('1.0', '1.0 lineend')p = p.strip()q = enKey.get('2.0', '2.0 lineend')q = q.strip()e = enKey.get('3.0', '3.0 lineend')e = e.strip()prin = RSACode.RSA(2, text, p, q, e)buT.config(text=prin)# Base64编码elif codeVar.get() == 4:text = enText.get('1.0', tk.END)text = text.strip()prin = Base64.Base(2, text)buT.config(text=prin)# 纵栏式移项解密elif codeVar.get() == 5:text = enText.get('1.0', tk.END)text = text.strip()key = enKey.get('1.0', tk.END)key = key.strip()prin = DisCode.Dis(2, text, key)buT.config(text=prin)# url解码elif codeVar.get() == 6:text = enText.get('1.0', tk.END)text = text.strip()prin = URL.url(2, text)buT.config(text=prin)def helpCommand():tk.messagebox.showinfo('帮助(H)', '使用仿射密码时,密钥从上往下分别输入a,b\n'+ '使用RSA密码时,从上往下分别为p,q,e')# 主窗口及格式
window = tk.Tk()
window.title('加解密工具')
window.configure(background='White')width = 800
height = 600
screenwidth = window.winfo_screenwidth()
screenheight = window.winfo_screenheight()
size_geo = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
window.geometry(size_geo)window.resizable(width=False, height=False)# 密码编码选项框架
coFrame = tk.Frame(window, bg='white')
coFrame.grid(padx=15, pady=10, row=0, column=0, rowspan=3)codeVar = tk.IntVar()code1 = tk.Radiobutton(coFrame, text="凯撒密码", bg='white', variable=codeVar, value=0)
code1.grid(ipadx=20, ipady=15, row=0, column=0)code2 = tk.Radiobutton(coFrame, text="仿射密码", bg='white', variable=codeVar, value=1)
code2.grid(ipadx=20, ipady=15, row=1, column=0)code3 = tk.Radiobutton(coFrame, text="维吉尼亚密码", bg='white', variable=codeVar, value=2)
code3.grid(ipadx=20, ipady=15, row=2, column=0)code4 = tk.Radiobutton(coFrame, text="RSA密码", bg='white', variable=codeVar, value=3)
code4.grid(ipadx=20, ipady=15, row=3, column=0)code5 = tk.Radiobutton(coFrame, text="Base64", bg='white', variable=codeVar, value=4)
code5.grid(ipadx=20, ipady=15, row=4, column=0)code6 = tk.Radiobutton(coFrame, text="纵栏式移项密码", bg='white', variable=codeVar, value=5)
code6.grid(ipadx=20, ipady=15, row=5, column=0)code7 = tk.Radiobutton(coFrame, text="url编码", bg='white', variable=codeVar, value=6)
code7.grid(ipadx=20, ipady=15, row=6, column=0)# 输入输出框架
entry = tk.Frame(window, bg='white')
entry.grid(padx=15, pady=10, row=0, column=3)enLabel = tk.Label(entry, text='请输入文本:', bg='white')
enLabel.grid(ipadx=20, ipady=15, row=0, column=0)enText = tk.Text(entry, width=30, height=7)
enText.grid(ipadx=20, ipady=15, row=1, column=0)enLabel = tk.Label(entry, text='请输入密钥:', bg='white')
enLabel.grid(ipadx=20, ipady=15, row=2, column=0)enKey = tk.Text(entry, width=30, height=7)
enKey.grid(ipadx=20, ipady=15, row=3, column=0)# 加密解密选项
edVar = tk.IntVar()
en = tk.Button(window, text='加密(编码)', bg='white', command=coChoose)
en.grid(padx=10, pady=5, row=0, column=4)de = tk.Button(window, text='解密(解码)', bg='white', command=deChoose)
de.grid(padx=10, pady=5, row=1, column=4)# 输出结果
buT = tk.Label(window, text='')
buT.grid(row=5, column=3)# 菜单
mainmenu = tk.Menu(window)mainmenu.add_command (label="文件")
mainmenu.add_command (label="编辑")
mainmenu.add_command (label="格式")
mainmenu.add_command (label="查看")
mainmenu.add_command (label="帮助",command=helpCommand)# 显示菜单
window.config (menu=mainmenu)window.mainloop()

算法

凯撒密码

# 实现凯撒密码
# 小写字典
lowDict = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
# 大写字典
capDict = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']# 将字母转换成数字
def switch(ele):flag = 0if ele.isalpha():if ele in lowDict:ele = lowDict.index(ele)elif ele in capDict:ele = capDict.index(ele)flag = 1return [int(ele), flag]# beState 处理前  afState 处理后
# 加解密算法
def algo(choose, beState, key):afState = ''# key返回的flag值是没用的[k, flag] = switch(key)for i in beState:[be, flag] = switch(i)# 加密if choose == 1:af = (be + k) % 26# 解密if choose == 2:af = (be - k) % 26if flag == 0:afState += lowDict[af]else:afState += capDict[af]return afStatedef Cae(choose, text, key):# 加密if choose == 1:plai = textreturn algo(choose, plai, key)# 解密elif choose == 2:ciph = textreturn algo(choose, ciph, key)

仿射密码

# 实现仿射密码
import math# 小写字典
lowDict = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
# 大写字典
capDict = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']def switch(ele):  # 将字母转换成数字flag = 0if ele.isalpha():if ele in lowDict:ele = lowDict.index(ele)elif ele in capDict:ele = capDict.index(ele)flag = 1return [int(ele), flag]# beState 处理前  afState 处理后
def algo(choose, beState, a, b):  # 加解密算法afState = ''[a, flag] = switch(a)[b, flag] = switch(b)if math.gcd(a, 26) != 1 or b < 0 or b >= 26:  # 判断输入的密钥格式print('你输入的密钥不符合算法格式')return Falseelse:for i in beState:[be, flag] = switch(i)# 加密if choose == 1:af = (a * be + b) % 26# 解密elif choose == 2:inva = int(math.pow(a, 11))af = inva * (be - b) % 26if flag == 0:afState += lowDict[af]else:afState += capDict[af]return afStatedef Aff(choose, text, a, b):if choose == 1:plai = textciph = algo(choose, plai, a, b)if ciph is False:return '你输入的密钥不符合算法格式(a应与26互素)'else:return ciphelif choose == 2:ciph = textplai = algo(choose, ciph, a, b)if plai is False:return '你输入的密钥不符合算法格式(a应与26互素)'else:return plai

维吉尼亚密码

# 实现维吉尼亚密码
# 小写字典
lowDict = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
# 大写字典
capDict = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']# 将字母转换成数字
def switch(ele):flag = 0if ele in lowDict:ele = lowDict.index(ele)elif ele in capDict:ele = capDict.index(ele)flag = 1return [int(ele), flag]# beState 处理前  afState 处理后# 加解密算法
def algo(choose, beState, key):# 判断密钥格式for i in key:if not i.isalpha():print('密钥格式应为英文字母')return FalseafState = ''# 用来补齐key和遍历ciphi = 0# 用来遍历keyj = 0# 补齐keylenBeState = len(beState)lenKey = len(key)while lenKey < lenBeState:key += key[i]lenKey = len(key)i += 1# 加解密算法for i in beState:# 遍历key[k, flag] = switch(key[j])j += 1[be, flag] = switch(i)# 加密if choose == 1:af = (be + k) % 26# 解密elif choose == 2:af = (be - k) % 26if flag == 0:afState += lowDict[af]else:afState += capDict[af]return afState# 主函数
def Vig(choose, text, key):# 加密if choose == 1:plai = textciph = algo(choose, plai, key)if ciph is False:return '你输入的密钥不符合算法格式(密钥格式应为英文字母)'else:return ciph# 解密elif choose == 2:ciph = textplai = algo(choose, ciph, key)if plai is False:return '你输入的密钥不符合算法格式(密钥格式应为英文字母)'else:return plai

RSA密码

# 实现RSA密码
import math# 判断是否为素数
def isPrime(num):for i in range(2, num):if num % i == 0:return Falsereturn Truedef RSA(choose, text, p, q, e):text = int(text)p = int(p)q = int(q)e = int(e)# 加密if choose == 1:if not isPrime(p):return '你输入的p不是素数'if not isPrime(q):return '你输入的q不是素数'n = p * qphiN = (p - 1) * (q - 1)# 判断e与φ(n)是否互素if math.gcd(e, phiN) != 1:falE = '你输入的e与φ(n)不互素\n' \+ 'n = ' + str(n) + '\n' \+ 'φ(n) = ' + str(phiN)return falE# 计算e的逆元dk = 1while (k * phiN + 1) % e != 0:k += 1d = int((k * phiN + 1) / e)plai = textciph = pow(plai, e, n)tru = 'n = ' + str(n) + '\n' \+ 'φ(n) = ' + str(phiN) + '\n' \+ 'd = ' + str(d) + '\n' \+ '密文是' + str(ciph)return tru# 解密elif choose == 2:if not isPrime(p):return '你输入的p不是素数'if not isPrime(q):return '你输入的q不是素数'n = p * qphiN = (p - 1) * (q - 1)# 判断e与φ(n)是否互素if math.gcd(e, phiN) != 1:falE = '你输入的e与φ(n)不互素\n' \+ 'n = ' + str(n) + '\n' \+ 'φ(n) = ' + str(phiN)return falE# 计算e的逆元dk = 1while (k * phiN + 1) % e != 0:k += 1d = int((k * phiN + 1) / e)ciph = textplai = pow(ciph, d, n)tru = 'n = ' + str(n) + '\n' \+ 'φ(n) = ' + str(phiN) + '\n' \+ 'd = ' + str(d) + '\n' \+ '明文是' + str(plai)return tru

Base64编码

# 实现Base64编码
# A - Z: 65 - 90  a - z: 97 - 122# Base64索引表 + '='
Base64 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z','0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '=']def Base(choose, text):if choose == 1:tru = ''# 二进制形式binary = []# 将文本转换成对应的ASCII编码,再转换成二进制位for i in text:num = ord(i)# div: 除数  re: 余数  ele: 单个字母二进制元素div = 1ele = []while div != 0:div = num // 2re = num % 2num = divele.append(re)# 单个字节补齐8位while len(ele) < 8:ele.append(0)ele.reverse()binary += ele# 每3个字节补齐24位while len(binary) % 24 != 0:binary.append(0)# 每6位二进制数为一个Base64编码索引while binary != []:flag = 0num = ''while flag < 6:num += str(binary.pop(0))flag += 1index = int(num, 2)# 判断全0索引是'A'还是'='if index == 0 and 1 not in binary:index = 64tru += Base64[index]tru += ''return tru# 解码elif choose == 2:tru = ''coding = textbinary = []for i in coding:index = Base64.index(i)if index != 64:div = 1ele = []while div != 0:div = index // 2re = index % 2index = divele.append(re)# 单个字节补齐6位while len(ele) < 6:ele.append(0)ele.reverse()else:ele = [0, 0, 0, 0, 0, 0]binary += elewhile binary != []:flag = 0num = ''while flag < 8:num += str(binary.pop(0))flag += 1index = int(num, 2)# 判断全0索引是'A'还是'='if index == 0 and 1 not in binary:breaktru += chr(index)tru += ''return tru

纵栏式移项密码

# 实现纵栏式移项密码
# 小写字典
lowDict = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm','n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
# 大写字典
capDict = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M','N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']# 将字母转换成数字
def switch(ele):flag = 0if ele in lowDict:ele = lowDict.index(ele)elif ele in capDict:ele = capDict.index(ele)flag = 1return [int(ele), flag]def Dis(choose, text, key):dict = {}lis = ''text = list(text)# 加密if choose == 1:while text != []:for i in key:[ele, flag] = switch(i)# 添加字典dict.setdefault(ele, '')if text == []:break# 置换else:temp = dict[ele] + text.pop(0)dict[ele] = temp# 排序while dict != {}:minindex = min(dict.keys())lis += dict[minindex]dict.pop(minindex)return lis# 解密elif choose == 2:textNum = len(text)keyNum = len(key)# num用于计算每个数组的个数num = textNum // keyNum# re用于计算多余的字符re = textNum % keyNumwhile text != []:for i in key:[ele, flag] = switch(i)dict.setdefault(ele, '')# 置换if re != 0:dict[ele] = text[0:num+1]re -= 1for j in range(0, num+1):text.pop(0)else:dict[ele] = text[0:num]for j in range(0, num):text.pop(0)# 排序tempList = sorted(dict.keys())tempLen = len(tempList)while tempLen > 0:for i in tempList:if dict[i] == []:tempLen -= 1elif dict[i] != []:lis += dict[i][0]dict[i] = dict[i][1:]return lis

url编码

注:url解码部分有问题

# 实现url编码
# 保留字符的编码字典
endict = {'!': '%21', '#': '%23', '$': '%24', '&': '%26', "'": '%27', '(': '%28',')': '%29', '*': '%2A', '+': '%2B', ',': '%2C', '/': '%2F', ':': '%3A',';': '%3B', '=': '%3D', '?': '%3F', '@': '%40', '[': '%5B', ']': '%5D'}# 反编码字典
dedict = {'21': '!', '23': '#', '24': '$', '26': '&', '27': "'", '28': '(','29': ')', '2A': '*', '2B': '+', '2C': ',', '2F': '/', '3A': ':','3B': ';', '3D': '=', '3F': '?', '40': '@', '5B': '[', '5D': ']'}def url(choose, text):list = ''# 编码if choose == 1:for i in text:word = iif i in endict.keys():word = endict[i]list += wordreturn list# 反编码elif choose == 2:text = text.split('%')for i in text:if i in dedict.keys():list += dedict[i]elif text.index(i) == 0:list += ielse:list += '%'list += ireturn list

总结

GUI部分做得很烂,实现图形化是我的一生之敌。部分算法本来不需要做得很复杂,例如凯撒密码,但为了统一输入输出,就稍微改多了一点(也是为了蹭代码行数),url解码部分因为时间紧急,做得不是很好。

python实现加密解密功能(GUI)相关推荐

  1. python数据库连接信息加密_python实现对服务器脚本敏感信息的加密解密功能

    背景 在实际项目实施中,会编写很多在服务器执行的作业脚本.程序中凡是涉及到数据库链接.操作系统用户链接.IP地址.主机名称的内容都是敏感信息.在纯内网系统中往因为开发时间紧迫,往往都直接将这些敏感信息 ...

  2. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  3. java 文件 加解密_Java实现文件的加密解密功能示例

    Java实现文件的加密解密功能示例 发布时间:2020-10-05 22:05:15 来源:脚本之家 阅读:86 作者:FC WORLD!!! 本文实例讲述了Java实现文件的加密解密功能分享给大家供 ...

  4. java实现文件加密与解密_Java实现文件的加密解密功能示例

    本文实例讲述了Java实现文件的加密解密功能分享给大家供大家参考,具体如下: package com.copy.encrypt; import java.io.File; import java.io ...

  5. oracle加密可以跟java一致吗,在GBase 8s上使用java udr实现Oracle兼容的加密解密功能...

    最近碰到客户从Oracle迁移到GBase 8s使用到字段加密解密功能,使用到了Utl_raw.cast_to_varchar2.Utl_raw.cast_to_raw.Utl_encode.base ...

  6. C语言实现加密解密功能 附带详细注释源码

    加密主要是通过一种算法对原内容进行处理,使原来内容不直观可见.解密过程通常要知道加密的算法,然后对加密后的内容进行逆处理,从而实现解密功能.当然解密也有一些暴力破解的方法.接下来以 c 语言 为例讲解 ...

  7. c语言编程文件的加密解密,C语言实现任何文件的加密解密功能

    本文实例为大家分享了C语言实现文件加密解密功能的具体代码,供大家参考,具体内容如下 使用命令提示符,实现任何文件的加密和解密功能. 代码如下: //#define _CRT_SECURE_NO_WAR ...

  8. python pycrypto 加密解密

    原文链接: python pycrypto 加密解密 上一篇: 面试链表问题 汇总 下一篇: sympy 解决常见高数问题 参考 http://www.cnblogs.com/huxianglin/p ...

  9. 前后端加密解密 【JS加密模块(md5 、 crypto 、 crypto-js、jsencrypt) python RSA加密解密(pycryptodome )模块安装与使用】

    JS加密模块[js-md5(AES) . crypto (AES). crypto-js().jsencrypt(非对称加密.RSA)] 一.安装 npm install js-md5 npm ins ...

最新文章

  1. ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
  2. 视频目标检测--Flow-Guided Feature Aggregation for Video Object Detection
  3. jsp可以使用iframe_使用 JavaScript object URLs,可以处理图像、音频和视频
  4. 通过Rancher Desktop在桌面上运行K8s
  5. 【gRPC】ProtoBuf 语言快速学习指南
  6. Java—servlet简单使用
  7. 无线服务器密码让别人改了,wifi密码被改了怎么办_wifi密码被别人改了怎么办?-192路由网...
  8. storm如何集成kafka
  9. 余承东:华为Mate 30 RS保时捷设计 9月19日发布
  10. Open3d之计算源点云与目标云的距离
  11. 四阶龙格库塔法的基本思想_“李军班长工作法”为“卓越班组”建设注入新动力...
  12. 手机电阻屏和电容屏哪个好?电容屏和电阻屏的区别!
  13. 【搞定Go语言】第3天22:常用的HTTP服务压测工具介绍
  14. 实习期间的一些思考整理(4)2018.4.14~4.16
  15. php 菱形问号,python爬虫出现菱形问号乱码的解决方法
  16. 【学前教育论文】幼儿学前教育中采茶小游戏的运用可行性分析(节选)
  17. 【区块链论文整理】SIGMOD篇(一)
  18. java如何给字符串每三位分隔逗号
  19. 如何使用计算机网络打印机,电脑重新连接网络打印机的操作方法-电脑自学网...
  20. iPhone开发秘籍(一)--第一章 iPhone SDK简介

热门文章

  1. beoplay耳机序列号查询_购买蓝牙耳机注意事项,这几款蓝牙耳机推荐看看
  2. 计算机科学与技术就业前景分析,计算机科学与技术专业就业前景分析
  3. ZBrush 4R7操作常见问题
  4. C++学习(一五零)qt的公有类、私有类、Q_Q、Q_D、二进制兼容
  5. [学习资料] Tiny210(S5PV210) u-boot移植
  6. 趣头条四季度净亏损超预期 盘后暴跌逾14%
  7. 基于卷积神经网络的密集人群估计/人群计数算法【内含教程和踩坑】
  8. [实用软件推荐] GIF截图软件 ScreenToGif
  9. 《高级计算机网络》之移动自组网——大连理工大学研究生课程整理笔记(非常详细,通俗易懂)
  10. 信息安全技术安全漏洞等级划分指南》(GB/T30279-2013)