计算机网络安全 —— 对称加密算法 DES (一)

news2024/11/19 7:16:11

一、对称加密算法概念#

​ 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换的人都不可理解的形式, 从而保证了数据的机密性。这种变换被称为加密( encryption),被加密的数据被称为密 文( ciphertext),而加密前的数据被称为明文( plaintext)。 接收方必须能通过某种逆变换将密文重新变换回原来的明文,该逆变换被称为解密( decryption)。加密和解密过程可以以一个密钥( key)为参数,并且加密和解密过程可以公开, 而只有密钥需要保密。 即只有知道密钥的人才能解密密文,而任何人,即使知道加密或解密算法也无法解密密文。

​ 加密密钥和解密密钥可以相同,也可以不同,取决于采用的是对称密钥密码体制还是公开密钥密码体制

​ 所谓对称密钥密码体制是一种加密密钥与解密密钥相同的密码体制。在这种加密系统中, 两个参与者共享同一个秘密密钥,如果用一个特定的密钥加密一条消息,也必须要使用相同的密钥来解密该消息。该系统又称为对称密钥系统。

​ 数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。其加密解密基本流程如下图:

img

二、.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.des
  8 {
  9     /// <summary>
 10     /// DES 加密与解密
 11     /// DES加密:https://www.zhihu.com/question/36767829
 12     /// 加密基本知识:https://www.biaodianfu.com/des.html
 13     /// </summary>
 14     public class DesAlgorithm
 15     {
 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 .ctor
 23 
 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         #endregion
 33 
 34 
 35         /// <summary>
 36         /// 通过字符串生成新的密钥
 37         /// </summary>
 38         /// <param name="password">密码</param>
 39         /// <returns></returns>
 40         public DESCryptoServiceProvider CreateNewkey(string password)
 41         {
 42             try
 43             {
 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万亿年的时间才有可能。

img

​ 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.des
  8 {
  9     /// <summary>
 10     /// 3DES加密与解密
 11     /// </summary>
 12     public class TripleDesAlgorithm
 13     {
 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 .ctor
 22 
 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         #endregion
 32 
 33         /// <summary>
 34         /// 通过字符串生成新的密钥
 35         /// </summary>
 36         /// <param name="password">密码</param>
 37         /// <returns></returns>
 38         public TripleDESCng CreateNewkey(string password)
 39         {
 40             try
 41             {
 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         }

img

相关内容:计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)、计算机网络安全 —— 报文摘要算法 ME5 (三)、计算机网络安全 —— 实体鉴别与生成大随机数(四)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.C操作符详解,深入探索操作符与字符串处理

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

微信小程序 最新获取用户头像以及用户名

一.在小程序改版为了安全起见 使用用户填写来获取头像以及用户名 二.代码实现 <view class"login_box"><!-- 头像 --><view class"avator_box"><button wx:if"{{ !userInfo.avatarUrl }}" class"avatorbtn" op…

Uni-APP+Vue3+鸿蒙 开发菜鸟流程

参考文档 文档中心 运行和发行 | uni-app官网 AppGallery Connect DCloud开发者中心 环境要求 Vue3jdk 17 Java Downloads | Oracle 中国 【鸿蒙开发工具内置jdk17&#xff0c;本地不使用17会报jdk版本不一致问题】 开发工具 HBuilderDevEco Studio【目前只下载这一个就…

【Android、IOS、Flutter、鸿蒙、ReactNative 】屏幕适配

Android Java 屏幕适配 参考 今日头条适配依赖配置 添加设计屏幕尺寸 设置字体大小 通过切换不同屏幕尺寸查看字体大小 设置文本宽高 通过切换不同屏幕尺寸查看文本宽高 Android Compose 屏幕适配 <

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…

Websocket如何分块处理数据量超大的消息体

若我们服务端一次性最大处理的字节数是1M,而客户端发来了2M的数据&#xff0c;此时服务端的数据就要被切割成两次传输解码。Http协议中有分块传输&#xff0c;而在Websocket也可以分块处理超大的消息体。在jsr356标准中使用javax.websocket.MessageHandler.Partial可以分块处理…

论文复现_How Machine Learning Is Solving the Binary Function Similarity Problem

1. 内容概述 前言&#xff1a;此代码库支持 USENIX Security 22 论文 《How Machine Learning Is Solving the Binary Function Similarity Problem》&#xff0c;作者包括 Andrea Marcelli 等人&#xff0c;提供了相关代码、数据集和技术细节。 关键内容&#xff1a;技术报告…

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记&#xff1a;学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

【WPF】Prism学习(六)

Prism Dependency Injection 1.依赖注入&#xff08;Dependency Injection&#xff09; 1.1. Prism与依赖注入的关系&#xff1a; Prism框架一直围绕依赖注入构建&#xff0c;这有助于构建可维护和可测试的应用程序&#xff0c;并减少或消除对静态和循环引用的依赖。 1.2. P…

多账号登录管理器(淘宝、京东、拼多多等)

目录 下载安装与运行 解决什么问题 功能说明 目前支持的平台 功能演示 登录后能保持多久 下载安装与运行 下载、安装与运行 语雀 解决什么问题 多个账号的快捷登录与切换 功能说明 支持多个电商平台支持多个账号的登录保持支持快捷切换支持导入导出支持批量删除支持…

UniAPP快速入门教程(一)

一、下载HBuilder 首先需要下载HBuilder开发工具&#xff0c;下载地址:https://www.dcloud.io/hbuilderx.htmlhttps://www.dcloud.io/hbuilder.html 选择Windows正式版.zip文件下载。下载解压后直接运行解压目录里的HBuilderX.exe就可以启动HBuilder。 UniApp的插件市场网址…

PyAEDT:Ansys Electronics Desktop API 简介

在本文中&#xff0c;我将向您介绍 PyAEDT&#xff0c;这是一个 Python 库&#xff0c;旨在增强您对 Ansys Electronics Desktop 或 AEDT 的体验。PyAEDT 通过直接与 AEDT API 交互来简化脚本编写&#xff0c;从而允许在 Ansys 的电磁、热和机械求解器套件之间无缝集成。通过利…

SpringBoot源码解析(四):解析应用参数args

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args 目录…

【Linux】指令 + 重定向操作

Linux基本指令 一.Linux基本指令1.mv&#xff08;重要&#xff09;2.cat3.more和less&#xff08;重要&#xff09;4.head和tail5.date6.cal7.find&#xff08;重要&#xff09; 二.Linux相关知识点1. Linux系统中&#xff1a;一切皆文件2. 重定向操作1. 输出重定向2. 追加重定…

【精通 Readline 库】:优化 Shell 外壳程序的艺术

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

ESP-IDF VScode 项目构建/增加组件 新手友好!!!

项目构建 1.新建文件夹&#xff0c;同时在该文件夹内新建.c和.h文件 如图所示&#xff0c;在components中新建ADC_User.c、ADC_User.h、CMakeLists.txt文件。当然这里你也可以不在components文件夹内新建文件&#xff0c;下面会说没有在components文件夹内新建文件构建项目的方…

玩转N1盒子:速刷OpenWRT软路由系统并实现公网访问管理

文章目录 前言1. 制作刷机固件U盘1.1 制作刷机U盘需要准备以下软件&#xff1a;1.2 制作步骤 2. N1盒子降级与U盘启动2.1 N1盒子降级2.2 N1盒子U盘启动设置2.3 使用U盘刷入OpenWRT2.4 OpenWRT后台IP地址修改2.5 设置旁路由&无线上网 3. 安装cpolar内网穿透3.1 下载公钥3.2 …

机器学习4

九、线性回归 1、概念 假设存在多个点&#xff0c;需要使用一条线来保障尽量拟合这些点&#xff0c;寻找这条线就叫回归。 机器学习中一种有监督学习的算法,回归问题主要关注的是因变量(需要预测的值)和一个或多个数值型的自变量(预测变量)之间的关系。 2、损失函数 存…

【Java EE初阶---多线程(初阶)】初识计算机

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java &#xff0c;Java数据结构 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录…

网络安全之国际主流网络安全架构模型

目前&#xff0c;国际主流的网络安全架构模型主要有&#xff1a; ● 信息技术咨询公司Gartner的ASA&#xff08;Adaptive Security Architecture自适应安全架构&#xff09; ● 美国政府资助的非营利研究机构MITRE的ATT&CK&#xff08;Adversarial Tactics Techniques &…