对象层次结构
     .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. OD基本快捷键及功能
  2. FPGA之道(22)VHDL基本程序框架
  3. 营销型网站建设需要注意哪些问题?
  4. CTFshow 命令执行 web38
  5. 如何修改来自ERP 系统的product category
  6. BayaiM__ oracle函数_01
  7. 这有一个机器人,粉刷本领强
  8. 盖茨买下一座城,想建成沙漠中的智慧城市
  9. VirtualDub - 开源视频捕捉及线性处理软件
  10. 视觉SLAM十四讲 罗德里格斯公式推导 全解
  11. iMX8MPlus和iMX8QM机器学习框架eIQ性能对比
  12. 图片显示不出时显示默认图片
  13. blob jdbc mysql_JDBC中级篇(MYSQL)——处理文件(BLOB)
  14. ae渲染出现错误是什么问题_AE渲染输出损坏怎么解决?教你如何渲染才是正确的...
  15. html优秀作品展示,31个漂亮的作品展示网页设计
  16. gstreamer学习笔记:将音视频合成MPEG2-TS流并打包通过rtp传输
  17. chatgpt 镜像版
  18. 基于OpenNI开发的Middleware介绍
  19. el-select和el-tree树形结构下拉单选和多选
  20. 树莓派 | Linux 中怎么查看图片

热门文章

  1. “梅丽莎”病毒背后的神秘黑客
  2. windows server 2016 DC重置用户密码报错
  3. XSS漏洞的渗透利用另类玩法
  4. 不负高端商务旗舰之名,金立M2017将搭载高通芯片
  5. mysql报错:You must at least set –server-id to enable either a master or a slave
  6. CodeIgniter框架中的多语言
  7. size_t_百度百科
  8. java除,小数的问题
  9. LINQ to XML:如何读写XCData
  10. struts响应用户请求的工作流程