c#加密:三、对称加密 AES、DES、RC2、Rijndael

article/2025/11/7 15:44:05

一、c#中的对称加密概述 

        对称加密算法在加密和解密时使用相同的密钥。Framework提供了四种对称加密算法。AES、DES、Rijndael、RC2。

        DES:全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。

        RC2:RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。

        Rijndael:这个类从.NET Framework 1.0开始就已经存在了。

        Aes:这个类是在.NET Framework 3.5中引入的。

        这些算法中Rijndael算法是最优秀的。Rijndael即快速又安全。它拥有两个实现:

        Rijndael和Aes这两个实现几乎是等价的,但是Aes不允许通过更改块尺寸来削弱加密强度。CLR安全团队推荐使用Aes类。

        Rijndael和Aes支持16字节、24字节和32字节的对称密钥长度:这几种长度目前均认为是安全的。

        关于AES加密算法的细节,可参考下面这篇文章。

AES加密算法的详细介绍与实现_TimeShatter的博客-CSDN博客_aes加密AES简介高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的作用与意义:明文P 没有经过加密的数据。密钥K 用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生https://blog.csdn.net/qq_28205153/article/details/55798628

二、加解密示例

//加密
byte[] key = { 99, 66, 33, 11, 8, 6,59,68,21,25,36,21,24,6,6,6 };
byte[] iv = { 99, 66, 33, 11,5,5,5,5,5,6,6,6,5,5,5,9 };
byte[] data = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };
using (SymmetricAlgorithm symmetric = Aes.Create())
{using (ICryptoTransform tran = symmetric.CreateEncryptor(key, iv)){using (Stream f = File.Create("aes.txt")){using (Stream c = new CryptoStream(f, tran, CryptoStreamMode.Write)){c.Write(data, 0, data.Length);}}}
}//解密
using (SymmetricAlgorithm symmetric = Aes.Create())
{using (ICryptoTransform tran = symmetric.CreateDecryptor(key, iv)){using (Stream f = File.OpenRead("aes.txt")){using (Stream c = new CryptoStream(f, tran, CryptoStreamMode.Read)){for(int b; (b=c.ReadByte())>-1;){Console.WriteLine(b + " ");}}}}
}

        如果使用错误的密钥进行解密,则CryptoStream会抛出CryptographicException,而捕获该异常是测试密钥是否正确的唯一途径。

        除了密钥之外,示例中还生成了一个初始化向量(Initialization Vector, IV)。这16字节的序列也是密码的一部分(和密钥相似),但它并不是保密的。当传输加密信息时,IV会以明文的方式进行传输(可能是在消息的头部进行传输),但每一段信息中其值都不相同。这样即使有些消息的未加密版本都是类似的,但是加密后的信息也会难以识别。

        如果无须IV的保护,可令16字节密钥和IV的值相同。但是,使用相同的IV发送多条消息会削弱密码的安全性并使破解的可能性大大增加。

        CryptoStream则像是管道工,它关注于流的处理。因此我们可以将Aes替换为另一种对称加密算法而仍旧使用CryptoStream。

        CryptoStream是双向的。因此可以使用CryptoStreamMode.Read来读取流,也可以使用CryptoStreamMode.Write来写入流。加密器和解密器,与读取和写入可以形成四种组合。这些组合可能会令人茫然!为了帮助理解,可以将读取理解为“拉”,而将写入理解为“推”。如果仍旧有疑问则可以首先用Write操作进行加密,而用Read操作进行解密,这种组合是最自然也最常见的。 

        请使用System.Cryptography命名空间下的RandomNumberGenerator来生成随机密钥或IV。此类随机数生成器生成的数字是真正难以预测的,或称为具备密码学强度的(而System.Random则无法保证这一点)。以下是一个示例:

//随机生成密钥
byte[] key_random = new byte[16];
byte[] iv_random = new byte[16];
RandomNumberGenerator rand = RandomNumberGenerator.Create();
//随机生成一个key
rand.GetBytes(key_random);
//随机生成一个iv
rand.GetBytes(iv_random);

        如果不指定密钥和IV,则加密算法会自动生成密码学强度的随机数作为密钥和IV。这些值可以通过Aes对象的Key和IV属性进行查看。

三、内存加密

        我们可以使用MemoryStream完全将加密和解密放在内存中。

public class AesTools{static byte[] Encrypt(byte[] data, byte[] key, byte[] iv){using (SymmetricAlgorithm symmetric = Aes.Create()){symmetric.KeySize = 128;symmetric.BlockSize = 128;symmetric.Mode = CipherMode.CBC;symmetric.Padding = PaddingMode.PKCS7;using (ICryptoTransform tran = symmetric.CreateEncryptor(key, iv)){return EnCrypt(data, tran);}}}static byte[] Decrypt(byte[] data, byte[] key, byte[] iv){using (SymmetricAlgorithm symmetric = Aes.Create()){symmetric.KeySize = 128;symmetric.BlockSize = 128;symmetric.Mode = CipherMode.CBC;symmetric.Padding = PaddingMode.PKCS7;using (ICryptoTransform tran = symmetric.CreateDecryptor(key, iv)){return DeCrypt(data, tran);}}}static byte[] EnCrypt(byte[] data, ICryptoTransform tran){return tran.TransformFinalBlock(data, 0, data.Length);}static byte[] DeCrypt(byte[] data, ICryptoTransform tran){return tran.TransformFinalBlock(data, 0, data.Length);}public static string Encrypt(string data, byte[] key, byte[] iv){return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(data), key, iv));}public static string Decrypt(string data, byte[] key, byte[] iv){return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(data), key, iv));}}

        测试代码

//随机生成密钥
byte[] key_random = new byte[16];
byte[] iv_random = new byte[16];
RandomNumberGenerator rand = RandomNumberGenerator.Create();
//随机生成一个key
rand.GetBytes(key_random);
//随机生成一个iv
rand.GetBytes(iv_random);string encrypted = AesTools.Encrypt("yeah小小的猫咪", key_random, iv_random);
Console.WriteLine(encrypted);string decrypted = AesTools.Decrypt(encrypted, key_random, iv_random);
Console.WriteLine(decrypted);

        可以看到如下输出 

四、串联加密流

        CryptoStream是一个装饰器,它可以将其他的流串联起来。以下示例会先将压缩的加密文本写入文件,之后再从该文件中读取这些内容。

         所有名称为单个字符的变量都是链条的一部分。而那些algorithm、encryptor和decryptor将协助CryptoStream进行加密工作。

        不论流的大小如何,上述串联加密流的方式只会占用很少的内存。

串联加密和压缩流

 五、销毁加密对象

        销毁CryptoStream可以确保将加密流内部缓存的数据刷新到基础流中。加密流的内部缓存是非常必要的,因为加密算法会将数据分块处理而不是一个字节一个字节地处理。

        和其他的流不太一样,CryptoStream的Flush方法并不会进行任何操作。如果需要刷新加密流(但并不销毁它),则必须使用FlushFinalBlock方法。和Flush不同,FlushFinalBlock只能调用一次,并且在调用之后该流就不能再写入任何数据了。

        在我们的范例中,我们还销毁了Aes算法对象和ICryptoTransform对象(encryptor和decryptor)。Rijndael变换并不需要实际进行销毁,但销毁操作仍然扮演着一个重要的角色。该操作会将对称密钥和关联的数据从内存中清除,以防止本机运行的其他软件(尤其是恶意软件)探测这些数据。我们不能依赖垃圾回收器来执行这种操作因为垃圾回收只会将内存进行标记(标记为未使用状态),而不会将内存的每一个字节填充为零。

        除了可以使用using销毁Aes对象之外,还可以使用Clear方法。它的销毁语义鲜为人知,因此它将Dispose方法用显式实现的方式隐藏了起来。

六、密钥管理的建议

        对加密密钥进行硬编码是不可取的,因为使用常见的工具就可以将程序集反编译为可读代码。一个较好方案是在每一次安装时制作一个随机密钥,并使用Windows数据保护来安全地存储它(或者使用Windows数据保护加密整条消息)。如果要加密消息流,则公钥加密仍然是目前的最佳选择。


http://chatgpt.dhexx.cn/article/Wf5oiRSq.shtml

相关文章

MFC的.rc 和.rc2文件

一、介绍 rc和rc2都是资源文件,包含了应用程序中用到的所有的资源。它们两指向的是同一个资源。 两者不同在于:rc2文件中的资源可以直接在VS集成环境中以可视化的方法进行编辑和修改; 而rc中的资源是根据需要手工地进行编辑。 二、实例 工程 rc文件 #include …

SEO搜索引擎优化方式

SEO搜索引擎优化方式 SEO搜索引擎优化方式 文章目录 SEO搜索引擎优化方式[TOC](文章目录) 前言一、黑帽SEO1、关键字的堆叠2、隐藏文本3、门页 二、白帽SEO1、 TDK2、 提高网站语义化的html标签占比3、 SSR 总结 前言 利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名&…

seo搜索引擎优化-SEO优化教程附关键词工具以及文章采集软件

seo搜索引擎优化,什么是SEO搜索引擎优化。简单点来说就是用户通过搜索引擎搜索想要的结果第一时间找到你的网站。那我们怎么做好搜索引擎优化呢?要做好搜索引擎优化首先我们得了解首页引擎。怎么才能快速的了解搜索引擎。不管是百度/360/谷歌/搜狗等搜索…

抖音seo搜索排名,源码开发部署/seo排名系统源码分析。

前言:抖音seo搜索排名,源码开发部署/seo排名系统源码分析。抖音seo源码搭建部分代码 抖音seo是什么?其实seo它是搜索引擎优化,不仅这样,抖音里也有搜索引擎优化,抖音seo其实就是优化抖音的搜索结果&#xf…

SEO -- 搜索引擎优化

文章目录 1、SEO简介2、SEO基本介绍3、SEO优化方法分类4、SEO优化策略5、SEO优化的优势6、SEO优化的发展问题7、SEO优化的意义 1、SEO简介 SEO(Search Engine Optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提…

前端开发之SEO(搜索引擎优化)

前端开发之SEO(搜索引擎优化) 文章目录 前言一、突出重要内容合理的title、description和keywords语义化书写HTML代码,符合W3C标准利用布局,把重要内容HTML代码放在最前重要内容不要用JS输出尽少使用iframe框架为图片加上alt属性需…

SEO优化之147SEO搜索引擎推送工具

什么是推送? 对于SEO人员应该都不陌生吧,推送就是把网站的链接主动提交给搜索引擎, 确保新的链接可以尽快被收录,同时保护原创(防止别人抄袭,以及转载后导致自己的网站没收录) 为什么我们要去…

百度搜索排名优化和SEO搜索引擎优化

文章目录 一、前文二、原理和简介三、站内优化3.1 网站地图生成3.2 关键字密度检测 四、站外优化4.1 百度收录4.2 实名实网认证(免费)4.3 官网认证(3000元/年)4.4 其他 五、购买服务与付费六、站长工具 一、前文 年前给公司做了几…

SEO搜索引擎优化-引擎排名

SEO搜索引擎优化 引擎排名 SEO是指通过采用易于搜索引擎索引的合理手段,使网站各项基本要素适合搜索引擎检索原则并且对用户更友好(Search Engine Friendly),从而更容易被搜索引擎收录及优先排序从属于SEM(搜索引擎营销)。 SEO的中文意思是搜索引擎优化。…

浅谈SEO搜索引擎基本工作原理

搜索引擎工作原理一共包括三个过程:网页搜索,预处理信息,建立索引,那么今天铭伟就把搜索引擎的工作原理进行解析一篇。 1、抓取网页。每个独立的搜索引擎都有自己的网页抓取程序爬虫(spider)。爬虫Spider顺…

抖音SEO搜索排名算法是什么?看完这篇就够了

抖音SEO搜索排名算法是什么?很多人在做抖音SEO搜索排名的时候,对抖音SEO搜索排名算法并不是很了解,这就导致在操作的过程中关键词优化效果并不是很好,今天卢涛就跟大家详细讲解抖音搜素seo算法。 一、抖音SEO搜索算法是什么 抖音S…

短视频seo搜索优化主要内容

短视频SEO是一款短视频营销系统,简单点来说就是可以在短视频平台上进行制作关键词的排名。相对于搜索引擎平台来说,短视频目前的趋势还是比较火爆的,伴随着时代的发展进步,以及手机的更新换代,短视频几乎每个人每天都会…

如何进行seo搜索引擎优化(搜索引擎SEO优化)

SEO搜索引擎优化如何做?给你支五招 如果你的网页加载速度比对手慢,那将在SERP中受到严重影响。因此做SEO搜索引擎优化,页面加载速度不能不重视起来,五种提高页面速度,优化SEO搜索引擎的办法。 一、压缩图片 图像文件…

PDF文件页面大小不一致的解决办法

有时候我们会遇到两个PDF合并后,大小不一样,但是PDF编辑软件中鲜少有能够修改页面大小的,那么我们如何做那? 答案就是还是在Adobe Acrobat DC中。 第一步:打开你想改变页面大小的PDF文件 第二步:点击文件…

使用Mac的预览修改pdf文件页面尺寸的大小

使用Mac自带的预览修改pdf页面尺寸的大小 真就百度不想让你搜到正确答案。 全部都是自己的软件怎么怎么好用。。 1.使用预览打开你想要缩小的pdf 2.打开左上角”文件-打印“ 3.选择如图所示选项 4.存储为pdf 5.完成 就这么简单。再次意识到博客存在的必要性。

减小pdf文件大小最简单的方法?缩小pdf文档的大小在线网站方法?

现在使用PDF的用户有很多,因为PDF的兼容性比较好,包括数据、图片、表格以及文字等。但是PDF文件过大也是麻烦。所以我们接下来就来谈谈怎么将PDF文件进行压缩。。而这些包含着设计内容的PDF文件体积往往比较大,在上传一些传输平台时会受到限制…

PDF如何修改页面大小,这一种方法轻松搞定

PDF如何修改页面大小呢?现在有些PDF文件的页面是参差不齐的,看起来并不会那么美观,但是一想到PDF文件很难直接修改页面就很头疼,想要给PDF文件修改页面大小是可以通过PDF编辑器来实现的,下面我们就一起来看一看其中的奥…

pdf格式压缩大小,pdf如何压缩大小?

pdf格式压缩大小,pdf如何压缩大小?虽然pdf是一种比较好用的文件格式,但是它也有一些缺点,例如不好编辑和文件体积过大。大家都知道pdf文件如果里面包含一些图片的时候,它的体积就会变得很大,有时候一个几页…

pdf文件过大怎么缩小?pdf减小文件大小的方法

pdf文件作为平时工作中经常使用的格式,常常会因为体积过大,不方便上传和储存,这就需要将pdf文件压缩,现在市面上很多pdf压缩软件,需要下载才可以操作,今天分享的这款pdf在线压缩工具,可以在浏览…

PDF缩放问题(页面统一转成A4大小)

背景 项目中需要将客户上传的附件合并到一起,生成一个新的PDF以供查看,但是有的PDF页面纸张太大,合并之后只取到了A4大小的一个角,下面是处理前的样子。 处理后: 处理代码 public static File pdfToA4(File file)…