对象层次结构
     .NET Framework 安全系统实现可扩展模式的派生类继承。层次结构如下所示:

     算法类型类,例如 SymmetricAlgorithm 或 HashAlgorithm。该级别为抽象。

     从算法类型类继承的算法类,例如 RC2 或 SHA1。该级别为抽象。

     从算法类继承的算法类的实现,例如 RC2CryptoServiceProvider 或 SHA1Managed。该级别是完全实现的。

使用这种模式的派生类,很容易添加新算法或现有算法的新实现。例如,若要创建新的公钥算法,则应从 AsymmetricAlgorithm 类继承。若要创建特定算法的新实现,应创建该算法的非抽象派生类。

流设计
       公共语言运行库使用面向流的设计实现对称算法和哈希算法。此设计的核心是 CryptoStream 类,它派生自 Stream 类。基于流的加密对象全都支持用于处理对象的数据传输部分的单个标准接口 (CryptoStream)。由于所有对象都在标准接口上生成,所以可以将多个对象(如一个哈希对象后跟一个加密对象)链接在一起,并且可以对数据执行多个操作而不需要为数据提供任何中间存储。使用流模型时还可以用更小的对象生成对象。例如,可以将加密算法和哈希算法的组合视为单个流对象(即使该对象可能是从一组流对象生成的)。
下面以一个静态加密类为例(注释说明):
【对称加密】
public static class SymmetricEncryptionUtility { private static bool _ProtectKey;//是否需要使用DPAPI来保护密钥; private static string _AlgorithmName;//加密算法的名称; public static string AlgorithmName { get { return _AlgorithmName; } set { _AlgorithmName = value; } } public static bool ProtectKey { get { return _ProtectKey; } set { _ProtectKey = value; } } /// <summary> ///【根据加密算法类来生成密钥文件】; /// </summary> /// <param name="targetFile">保存密钥的文件</param> public static void GenerateKey(string targetFile) { //创建加密算法; SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName); Algorithm.GenerateKey();//当在派生类中重写时,生成用于该算法的随机密钥; //得到密钥; byte[] Key = Algorithm.Key; if (ProtectKey) { //使用DPAPI来加密密钥; Key = ProtectedData.Protect(Key, null, DataProtectionScope.LocalMachine); } //把密钥保存到key.config。 using (FileStream fs = new FileStream(targetFile, FileMode.Create)) { fs.Write(Key, 0, Key.Length); } } /// <summary> /// 【从密钥文件中读取密钥】; /// </summary> /// <param name="algorithm">加密的算法</param> /// <param name="keyFile">密钥文件路径</param> public static void ReadKey(SymmetricAlgorithm algorithm, string keyFile) { byte[] Key; using (FileStream fs = new FileStream(keyFile, FileMode.Open)) { Key = new byte[fs.Length]; fs.Read(Key, 0, (int)fs.Length); } if (ProtectKey) algorithm.Key = ProtectedData.Unprotect(Key, null, DataProtectionScope.LocalMachine); else algorithm.Key = Key; } /// <summary> /// 【加密数据】 /// </summary> /// <param name="data">原始数据</param> /// <param name="keyFile">密钥文件路径</param> /// <returns></returns> public static byte[] EncryptData(string data, string keyFile) { //将要加密的字符串数据转换为字符数组; byte[] ClearData = Encoding.UTF8.GetBytes(data); //创建加密算法; SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName); ReadKey(Algorithm, keyFile); //加密信息; MemoryStream Target = new MemoryStream(); //生成随机的初始化向量; Algorithm.GenerateIV(); Target.Write(Algorithm.IV, 0, Algorithm.IV.Length); //加密实际的数据; CryptoStream cs = new CryptoStream(Target, Algorithm.CreateEncryptor(), CryptoStreamMode.Write); //参数1:对其执行加密转换的流。 //参数2:要对流执行的加密转换。 //参数3:对加密流的访问方式。 cs.Write(ClearData, 0, ClearData.Length); cs.FlushFinalBlock(); //将加密后的结果作为字符数组返回; return Target.ToArray(); } /// <summary> /// 【解密数据】 /// </summary> /// <param name="data">原始数据</param> /// <param name="keyFile">密钥文件路径</param> /// <returns></returns> public static string DecryptData(byte[] data, string keyFile) { // 对称加密:加密算法和解密算法一致; SymmetricAlgorithm Algorithm = SymmetricAlgorithm.Create(AlgorithmName); ReadKey(Algorithm, keyFile); // 解密信息; MemoryStream Target = new MemoryStream(); // 读取IV,并使用它初始化解密算法; int ReadPos = 0; byte[] IV = new byte[Algorithm.IV.Length]; Array.Copy(data, IV, IV.Length); Algorithm.IV = IV; ReadPos += Algorithm.IV.Length; CryptoStream cs = new CryptoStream(Target, Algorithm.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(data, ReadPos, data.Length - ReadPos); cs.FlushFinalBlock(); // 从内存数据流中获得字节并将它转换为文本; return Encoding.UTF8.GetString(Target.ToArray()); } }

转载于:https://www.cnblogs.com/zhangqs008/archive/2009/12/01/2341215.html

.NET中的加密类(对称加密)相关推荐

  1. [译] 最佳安全实践:在 Java 和 Android 中使用 AES 进行对称加密

    原文地址:Security Best Practices: Symmetric Encryption with AES in Java and Android 最佳安全实践:在 Java 和 Andr ...

  2. Android安全加密:对称加密

    Android安全加密专题文章索引 Android安全加密:对称加密 Android安全加密:非对称加密 Android安全加密:消息摘要Message Digest Android安全加密:数字签名 ...

  3. 细数非对称加密与对称加密的区别

    2019独角兽企业重金招聘Python工程师标准>>> 有两种加密方法常常在SSL生态系统中被提及--非对称加密与对称加密. SSL握手期间的非对称加密 当你浏览一个使用SSL证书的 ...

  4. java-信息安全(九)-基于DH,非对称加密,对称加密等理解HTTPS

    概述 java-信息安全(七)-基于非对称加密,对称加密等理解HTTPS 如果想要理解好https,请尽量了解好以上信息等. 参看文章: http://www.ruanyifeng.com/blog/ ...

  5. JackHttp -- 浅谈编码、加密(对称加密,非对称加密,Hash算法)

    如果你还不清楚 JackHttp 是什么,请戳这里!!! JackHttp 是一个网络框架系列,为什么还要分享编码和加密呢?主要有如下几个原因: HTTP 在网络传输过程中是明文的. HTTP 在网络 ...

  6. 【加密】对称加密DES和非对称加密AES、数字签名|非对称加密--公钥和私钥的区别

    目录 对称加密DES和非对称加密AES.数字签名 对称加密 1.1 定义 1.2 优缺点 1.3 常用对称加密算法 非对称加密( Asymmetric Cryptography ) 非对称加密(现代加 ...

  7. 非对称加密和对称加密

    什么是非对称加密 对称加密算法在加密和解密时使用的是同一个秘钥:而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key, ...

  8. SSL证书背后的加密技术--非对称加密和对称加密

    SSL(安全套接字层)是一种标准的安全技术,用于在服务器和客户端之间建立加密连接.安装SSL证书后,就可以建立此安全连接.但这是如何实现的?数据是如何加密的?本文介绍了SSL背后的加密技术,它涵盖了非 ...

  9. 如何在 Swift 中使用 CommonCrypto 类进行加密(I)

    原文连接:Cryptography in Swift with CommonCrypto 原文日期:2015/08/10 译者:CMB 校对:numbbbbb 定稿:shanks 现在,许多开发者已经 ...

  10. 公钥密码学中的素数以及对称加密

    密码学,一向被人们认为门槛很高,特别高端...这也是实际,但是这决不意味着普通人无法了解它的精髓,对于喜欢画圆的人来讲,即便是理解了密码技术背后的哪怕一点理论,也是激动人心的. 声明和悲叹 最近,一次 ...

最新文章

  1. STM32F1笔记(十一)ADC
  2. (软件工程复习核心重点)第八章面向对象方法学习题
  3. Paradigm 已对 NFT 艺术品铸造和收藏协议 ZORA 进行投资
  4. 如何根据原理图画封装_画了这么多年PCB,你真的了解原理图吗?
  5. mysql 定时备份 空_如何在不停止Mysql服务的状况下,定时备份mysql数据库
  6. 计算机科学技术专业单片机,计算机科学与技术专业毕业论文---基于单片机的智能浇花系统的设计与实现.docx...
  7. 【PhotoScan精品教程】PhotoScan简介、安装教程(附PhotoScan1.4.5安装包下载)
  8. mysql中ddl是什么_mysql ddl什么意思
  9. c语言父子线程交替打印,多线程面试题之【三线程按顺序交替打印ABC的方法】...
  10. 第6周编程题在线测试
  11. 【个人网站搭建】服务器、域名准备
  12. JS数据交互:动态从数据库中获取数据填充Select
  13. APP消息推送方案调研
  14. 前端学习day 10--小米商城首页的制作
  15. JavaScript 基础知识查漏补缺
  16. LCD液晶显示屏的特性与控制
  17. 麒麟 统信系统商店下载的安装包位置
  18. 天台外国语学校计算机老师,携手同行促提升——天台县信息技术青年教师发展共同体研修活动在平桥镇第二小学举行...
  19. 一个靠 GitHub 打赏的码农,年入十万美元!
  20. 福特android auto教程,福特车载系统年底支持CarPlay和Android Auto

热门文章

  1. 如何使用Alfred mac版的Snippets文字扩展功能
  2. Automapper问题记录
  3. 0024-CENTOS6.5安装CDH5.12.1(一)
  4. 渐进式Web应用(PWA)入门教程(下)
  5. 极棒开启AI挑战 全球寻找顶级语音合成“机械师”
  6. 译文-Minor GC vs Major GC vs Full GC
  7. msys2编译器的配置
  8. 终端花屏后的恢复办法
  9. eclipse svn使用小记
  10. Java程序员必会的工具库,让你的代码量减少90%!