计算机网络安全 —— 对称加密算法 DES (一)
一、对称加密算法概念#
我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换的人都不可理解的形式, 从而保证了数据的机密性。这种变换被称为加密( encryption),被加密的数据被称为密 文( ciphertext),而加密前的数据被称为明文( plaintext)。 接收方必须能通过某种逆变换将密文重新变换回原来的明文,该逆变换被称为解密( decryption)。加密和解密过程可以以一个密钥( key)为参数,并且加密和解密过程可以公开, 而只有密钥需要保密。 即只有知道密钥的人才能解密密文,而任何人,即使知道加密或解密算法也无法解密密文。
加密密钥和解密密钥可以相同,也可以不同,取决于采用的是对称密钥密码体制还是公开密钥密码体制。
所谓对称密钥密码体制是一种加密密钥与解密密钥相同的密码体制。在这种加密系统中, 两个参与者共享同一个秘密密钥,如果用一个特定的密钥加密一条消息,也必须要使用相同的密钥来解密该消息。该系统又称为对称密钥系统。
数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。其加密解密基本流程如下图:
二、.NET 使用 DES 加密#
DES使用的密钥为64 位( 实际密钥长度为56 位,有8位用于奇偶校验)。密码的字节长度不能低于64位(8个字节),下面是实现代码:
1 using System;2 using System.IO;3 using System.Linq;4 using System.Security.Cryptography;5 using System.Text;6 7 namespace encryption.des8 {9 /// <summary>10 /// DES 加密与解密11 /// DES加密:https://www.zhihu.com/question/3676782912 /// 加密基本知识:https://www.biaodianfu.com/des.html13 /// </summary>14 public class DesAlgorithm15 {16 public Encoding Encoding { get; set; }17 public PaddingMode Padding { get; set; }18 public CipherMode Mode { get; set; }19 public string PassWord { get; private set; }20 private DESCryptoServiceProvider _des;21 22 #region .ctor23 24 public DesAlgorithm()25 {26 _des = new DESCryptoServiceProvider();27 PassWord = Convert.ToBase64String(_des.Key);28 Encoding = Encoding.UTF8;29 Padding = PaddingMode.PKCS7;30 Mode = CipherMode.CBC;31 }32 #endregion33 34 35 /// <summary>36 /// 通过字符串生成新的密钥37 /// </summary>38 /// <param name="password">密码</param>39 /// <returns></returns>40 public DESCryptoServiceProvider CreateNewkey(string password)41 {42 try43 {44 byte[] buffer = Encoding.GetBytes(password).Skip(0).Take(8).ToArray();45 _des = new DESCryptoServiceProvider()46 {47 Key = buffer,48 IV=buffer,49 };50 PassWord = password;51 return _des;52 }53 catch (Exception e)54 {55 Console.WriteLine($"Wrong Length:{e.Message},{e.InnerException}");56 return null;57 }58 }59 60 /// <summary>61 /// DES加密62 /// </summary>63 /// <param name="pToEncrypt">需要加密的字符串<see cref="string"/></param>64 /// <returns></returns>65 public string Encrypt(string pToEncrypt)66 {67 byte[] inputByteArray = Encoding.GetBytes(pToEncrypt);68 return Convert.ToBase64String(this.Encrypt(inputByteArray));69 }70 71 /// <summary>72 /// DES加密73 /// </summary>74 /// <param name="pToEncrypt">待加密的byte数组<see cref="byte"/></param>75 /// <returns></returns>76 public byte[] Encrypt(byte[] pToEncrypt)77 {78 byte[] base64 = null;79 using (var ms = new MemoryStream())80 {81 using (var cs = new CryptoStream(ms, _des.CreateEncryptor(), CryptoStreamMode.Write))82 {83 cs.Write(pToEncrypt, 0, pToEncrypt.Length);84 cs.FlushFinalBlock();85 }86 base64 = ms.ToArray();87 }88 return base64;89 }90 91 /// <summary>92 /// DES解密93 /// </summary>94 /// <param name="pToDecrypt">需要解密的字符串</param>95 /// <returns></returns>96 public string Decrypt(string pToDecrypt)97 {98 byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);99 return Encoding.GetString(this.Decrypt(inputByteArray));
100 }
101
102 /// <summary>
103 /// DES解密
104 /// </summary>
105 /// <param name="pToDecrypt">待解密的byte数组<see cref="byte"/></param>
106 /// <returns></returns>
107 public byte[] Decrypt(byte[] pToDecrypt)
108 {
109 byte[] data = null;
110 using (var ms = new MemoryStream())
111 {
112 using (CryptoStream cs = new CryptoStream(ms, _des.CreateDecryptor(), CryptoStreamMode.Write))
113 {
114 cs.Write(pToDecrypt, 0, pToDecrypt.Length);
115 cs.FlushFinalBlock();
116 }
117 data = ms.ToArray();
118 }
119 return data;
120 }
121 }
122 }
三、.NET 使用 3DES 加密#
DES使用的密钥为64 位,它是一个优秀的密码算法,目前还没有发现比蛮力攻击更好的破解方法。但随着计算机运算速度的快速提高,56位长的密钥已显得太短。56位长的密钥意味着共有256种可能的密钥,也就是说,共约有7. 6 × 1016 种密钥。假设一台计算机1 µ s可执行一次DES加密,同时假定平均只需搜索密钥空间的一半即可找到密钥,那么破译DES要超过1千年。但现在利用并行计算技术已经设计出搜索DES密钥的专用芯片。例如,在1999年有一批在因特网上合作的人借助于一台不到25万美元的专用计算机,在略大于22h的时间就破译了56 位密钥的DES。
为解决DES密钥太短的问题,人们提出了三重DES(Triple DES, 3DES),并在1985年成为美国的一个商用加密标准[ RFC 2420]。3DES在加密时,用三个密钥,执行三次DES算法: 即 E运算 → D运算 → E运算。 解密时,按相反顺序使用这三个密钥,执行D运算 → E运算 → D运算。
3DES目前正在被2001年发布的高级加密标准( Advanced Encryption Standard, AES)所替代。AES能够使用128位、192位和256位长的密钥,用硬件和软件都可以快速实现。它不需要太多内存,因此适用于小型移动设备。美国国家标准与技术研究所NIST估计,如果用1s破解56位DES的计算机来破解一个128位的AES密钥的话,要用大约149万亿年的时间才有可能。
3DES 使用现有的DES算法,并且当三个密钥相同时,效果就和DES一样。这有利于逐步推广使用3DES。也可以仅使用两个密钥,即 K1= K3,相当于密钥长度112位,这对于多数商业应用也已经足够长了。下面代码我们采用密钥长度56*3=168位的3EDS算法:
1 using System;2 using System.IO;3 using System.Linq;4 using System.Security.Cryptography;5 using System.Text;6 7 namespace encryption.des8 {9 /// <summary>10 /// 3DES加密与解密11 /// </summary>12 public class TripleDesAlgorithm13 {14 public Encoding Encoding { get; set; }15 public PaddingMode Padding { get; set; }16 public CipherMode Mode { get; set; }17 public string PassWord { get; private set; }18 19 private TripleDESCng _des;20 21 #region .ctor22 23 public TripleDesAlgorithm()24 {25 _des = new TripleDESCng();26 PassWord = Convert.ToBase64String(_des.Key);27 Encoding = Encoding.UTF8;28 Padding = PaddingMode.PKCS7;29 Mode = CipherMode.CBC;30 }31 #endregion32 33 /// <summary>34 /// 通过字符串生成新的密钥35 /// </summary>36 /// <param name="password">密码</param>37 /// <returns></returns>38 public TripleDESCng CreateNewkey(string password)39 {40 try41 {42 byte[] key = Encoding.GetBytes(password).Skip(0).Take(24).ToArray();43 byte[] iv = Encoding.GetBytes(password).Skip(0).Take(8).ToArray();44 _des = new TripleDESCng()45 {46 Key = key,47 IV = iv,48 };49 PassWord = password;50 return _des;51 }52 catch (Exception e)53 {54 Console.WriteLine($"Wrong Length:{e.Message},{e.InnerException}");55 return null;56 }57 }58 59 /// <summary>60 /// 3DES加密61 /// </summary>62 /// <param name="pToEncrypt">需要加密的字符串<see cref="string"/></param>63 /// <returns></returns>64 public string Encrypt(string pToEncrypt)65 {66 byte[] inputByteArray = Encoding.GetBytes(pToEncrypt);67 return Convert.ToBase64String(this.Encrypt(inputByteArray));68 }69 70 /// <summary>71 /// 3DES加密72 /// </summary>73 /// <param name="pToEncrypt">需要加密的byte数组<see cref="byte"/></param>74 /// <returns></returns>75 public byte[] Encrypt(byte[] pToEncrypt)76 {77 byte[] base64 = null;78 using (var ms = new MemoryStream())79 {80 using (var cs = new CryptoStream(ms, _des.CreateEncryptor(), CryptoStreamMode.Write))81 {82 cs.Write(pToEncrypt, 0, pToEncrypt.Length);83 cs.FlushFinalBlock();84 }85 base64 = ms.ToArray();86 }87 return base64;88 }89 90 /// <summary>91 /// 3DES解密92 /// </summary>93 /// <param name="pToDecrypt">需要解密的字符串<see cref="string"/></param>94 /// <returns></returns>95 public string Decrypt(string pToDecrypt)96 {97 byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);98 return Encoding.GetString(this.Decrypt(inputByteArray));99 }
100
101 /// <summary>
102 /// 3DES解密
103 /// </summary>
104 /// <param name="pToDecrypt">需要解密的byte数组<see cref="byte"/></param>
105 /// <returns></returns>
106 public byte[] Decrypt(byte[] pToDecrypt)
107 {
108 byte[] data = null;
109 using (var ms = new MemoryStream())
110 {
111 using (CryptoStream cs = new CryptoStream(ms, _des.CreateDecryptor(), CryptoStreamMode.Write))
112 {
113 cs.Write(pToDecrypt, 0, pToDecrypt.Length);
114 cs.FlushFinalBlock();
115 }
116 data = (ms.ToArray());
117 }
118 return data;
119 }
120 }
121 }
四、测试代码与效果#
1 static void Main(string[] args)2 {3 // DES字符串加密与解密4 {5 Console.WriteLine("-----------------------------------------------------DES字符串加密与解密--------------------------------------------------");6 var input = "数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。";7 Console.Write($"加密内容:\r\n{input}\r\n");8 var des = new DesAlgorithm();9 // TEST:可使用该方法通过字符串生成新的密钥
10 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
11 Console.WriteLine($"DES密钥:\r\n{des.PassWord}\r\n");
12 var encrypt = des.Encrypt(input);
13 Console.WriteLine($"DES加密后内容:\r\n{encrypt}\r\n");
14 var decrypt = des.Decrypt(encrypt);
15 Console.WriteLine($"DES解密后内容:\r\n{decrypt}\r\n");
16 }
17
18 // DES文件加密与解密
19 {
20 Console.WriteLine("---------------------------------------------------DES文件加密与解密--------------------------------------------------");
21 var input = System.IO.File.ReadAllBytes(@"C:\Users\97460\Desktop\1.rar");
22 Console.Write($"加密内容:\r\n{Convert.ToBase64String(input)}\r\n");
23 var des = new DesAlgorithm();
24 // TEST:可使用该方法通过字符串生成新的密钥
25 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
26 Console.WriteLine($"DES密钥:\r\n{des.PassWord}\r\n");
27 var encrypt = des.Encrypt(input);
28 Console.WriteLine($"DES加密后内容:\r\n{Convert.ToBase64String(encrypt)}\r\n");
29 var decrypt = des.Decrypt(encrypt);
30 Console.WriteLine($"DES解密后内容:\r\n{Convert.ToBase64String(decrypt)}\r\n");
31 System.IO.File.WriteAllBytes("1.rar", decrypt);
32 }
33
34
35
36 // 3DES字符串加密与解密
37 {
38 Console.WriteLine("---------------------------------------------------3DES字符串加密与解密--------------------------------------------------");
39 var input = "数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。";
40 Console.Write($"加密内容:\r\n{input}\r\n");
41 var des = new TripleDesAlgorithm();
42 // TEST:可使用该方法通过字符串生成新的密钥
43 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
44 Console.WriteLine($"3DES密钥:\r\n{des.PassWord}\r\n");
45 var encrypt = des.Encrypt(input);
46 Console.WriteLine($"3DES加密后内容:\r\n{encrypt}\r\n");
47 var decrypt = des.Decrypt(encrypt);
48 Console.WriteLine($"DES解密后内容:\r\n{decrypt}\r\n");
49 }
50
51 // 3DES文件加密与解密
52 {
53 Console.WriteLine("---------------------------------------------------3DES文件加密与解密--------------------------------------------------");
54 var input = System.IO.File.ReadAllBytes(@"C:\Users\97460\Desktop\1.rar");
55 Console.Write($"加密内容:\r\n{Convert.ToBase64String(input)}\r\n");
56 var des = new TripleDesAlgorithm();
57 // TEST:可使用该方法通过字符串生成新的密钥
58 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
59 Console.WriteLine($"3DES密钥:\r\n{des.PassWord}\r\n");
60 var encrypt = des.Encrypt(input);
61 Console.WriteLine($"3DES加密后内容:\r\n{Convert.ToBase64String(encrypt)}\r\n");
62 var decrypt = des.Decrypt(encrypt);
63 Console.WriteLine($"3DES解密后内容:\r\n{Convert.ToBase64String(decrypt)}\r\n");
64 System.IO.File.WriteAllBytes("1.rar", decrypt);
65 }
66 Console.ReadKey();
67 }
相关内容:计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)、计算机网络安全 —— 报文摘要算法 ME5 (三)、计算机网络安全 —— 实体鉴别与生成大随机数(四)
相关文章:

计算机网络安全 —— 对称加密算法 DES (一)
一、对称加密算法概念# 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换的人都不可理解的形式, 从而保证了数据的机密性。这种变换被称为加密( encryptio…...

5. ARM_指令集
概述 分类 汇编中的符号: 指令:能够编译生成一条32位机器码,并且能被处理器识别和执行伪指令:本身不是指令,编译器可以将其替换成若干条指令伪操作:不会生成指令,只是在编译阶段告诉编译器怎…...
Jenkins的pipeline Script的 每个组件的详细讲解
在Jenkins的Pipeline脚本中,各个组件的配置和Groovy的一些常用函数起到了决定性的作用,帮助开发人员控制自动化流程的执行。以下是对Jenkins Pipeline的主要组件和Groovy常用函数的详细讲解: 1. Jenkins Pipeline主要组件 1.1 agent 功能&…...
Tomcat 和 Netty 的区别及应用场景分析
在 Java Web 开发中,Tomcat 和 Netty 都是常见的网络框架,它们各自有着不同的设计理念和适用场景。本文将通过详细的对比和实际场景示例,帮助你理解 Tomcat 和 Netty 在功能、性能、架构等方面的差异,帮助你在实际开发中做出更合理…...

6.C操作符详解,深入探索操作符与字符串处理
C操作符详解,深入探索操作符与字符串处理 C语言往期系列文章目录 往期回顾: C语言是什么?编程界的‘常青树’,它的辉煌你不可不知VS 2022 社区版C语言的安装教程,不要再卡在下载0B/s啦C语言入门:解锁基础…...

生数科技发布 Vidu 1.5 新版本,引领视频大模型新潮流
在国内视频大模型领域,生数科技一直以创新和突破而备受瞩目。近日,生数科技再度发力,发布了 Vidu 1.5 新版本,为视频创作带来了全新的变革与机遇。 Vidu 1.5 新版本在多个方面展现出了卓越的性能和创新的特点。首先,它…...
CentOS 7 aarch64停止更新后安装gcc8 —— 筑梦之路
CentOS 7.9非X86架构系统生命周期结束后(2024-6-30)配置在线可用yum源 —— 筑梦之路_centos7.9 arm-CSDN博客 以前的做法 sudo yum install centos-release-scl-rh sudo yum install devtoolset-8-buildsudo yum install devtoolset-8-gdb sudo yum i…...

WPF下 DataGrid加入序号列
先上代码: <DataGrid Name"DGV" AutoGenerateColumns"False" Grid.Row"0" Grid.Column"0" HorizontalGridLinesBrush"RoyalBlue" VerticalGridLinesBrush"Tomato" CanUserAddRows"False&qu…...
iOS UI 自动化 手势右滑退出当前页面
1、TouchAction from appium.webdriver.common.touch_action import TouchAction# 获取屏幕的宽度和高度 screen_width driver.get_window_size()["width"] screen_height driver.get_window_size()["height"]# 定义滑动的起点和终点坐标 start_x 0 en…...
《MySQL 实战教程:从零开始到高手进阶》
当然可以。下面是一篇关于MySQL的学习指南,它适合初学者到中级用户,涵盖了MySQL的基础知识、安装步骤、基本命令以及一些高级功能。 MySQL 学习指南 1. 了解 MySQL MySQL 是一个关系型数据库管理系统(RDBMS),由瑞典…...

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞
时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考: https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…...

应用系统开发(12) Zync中实现数字相敏检波
在 Xilinx Zynq 系列(如 Zynq-7000 或 Zynq UltraScale+)中实现数字相敏检波(DSP,Digital Synchronous Detection)可以通过硬件(PL部分,FPGA逻辑)和软件(PS部分,ARM Cortex-A 处理器)的协同工作来实现。以下是一个详细的设计方法,包括基本原理和 Zynq 的实现步骤。…...

栈Stack和队列Queue
目录 一、栈 (1)用数组实现 (2)用单链表实现 (3)用标注尾结点的单链表实现 (4)用双向链表实现 2、栈的实际应用 (1)改变元素的序列 (2&am…...

uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点
如图,如果要实现上方的效果: 上方两个效果根据经纬度标记点缩放后有重复点会添加数量 用到的文档地址https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.htmlMapContext.addMarkers(Object object) 添加标记点Ma…...

Percona XtraBackup备份docker版本mysql 5.7
my.cnf配置文件 [client] default_character_setutf8[mysqld] # 数据存储目录(必须手动指定) datadir/var/lib/mysql/data# 字符集 collation_server utf8_general_ci character_set_server utf8 # 二进制日志 server-id1 log_bin/var/log/mysql/binl…...
C++:关联式容器的介绍及map与set的使用
我们之前已经学习过string,vector,list,queue,priority_queue等容器,这些容器我们统称为序列式容器,因为它们的数据的逻辑结构呈线性。因为这些容器中存储的数据即便二者之间发生交换,也不会对原有的容器结构造成太大影响。 但上篇文章我们介…...
一文说清:Linux下C++静态库的封装和调用
一 引言 《一文说清:windows下C静态库的封装和调用》中说了: 静态库允许开发者在多个项目中复用代码,减少重复劳动,并增强程序的可维护性。并讲述了windows环境下创建、封装以及调用C静态库的过程。 本文则描述了,如…...

【Java 学习】数据类型、变量、运算符、条件控制语句
Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量?什么是数据类型?2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …...
【软考】系统架构设计师-数据库设计基础
数据库核心考点 三级模式-两级映射 外模式--视图 概念模式--表(模式、基本表) 内模式--物理文件 数据库设计 概念结构设计:属性冲突、命名冲突、结构冲突 逻辑结构设计:关系模式(层次模型、网络模型)…...
【Jmeter相关】
Jmeter 可以作为接口测试问题,也会涉及到性能相关的问题 一、JMeter中用户定义的变量(User Defined Variables)和用户参 数(User Parameters)的区别是什么? 在JMeter中都是用于定义和存储测试数据的方法,但它们有一…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...