知识大全 .NET对称加密实践 (新手教程)

Posted

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 .NET对称加密实践 (新手教程)相关的知识,希望对你有一定的参考价值。

.NET对称加密实践 (新手教程)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在使用 NET框架提供的加密算法实现类来执行加密任务时 我们需要准备加密密钥和初始化向量(IV) 基于对称加密的特点 我们在加密数据之后一定要保存好密钥和初始化向量 因为解密要用到它们 但是对于不同的数据加密 我们要使用不同的密钥和初始化向量 理论上每次新的加密过程都应该使用全新的密钥和初始化向量

  通常我们需要将加密密钥和初始化向量传递给另一个人 这时候需要使用非对称加密算法来加密密钥和初始化向量 然后在网络上传输

  那么如何创建加密密钥和初始化向量呢?有两种基本方法 一种是使用加密算法实现类的构造函数 一种是使用GenerateIV()和GenerateKey()方法生成密钥和初始化向量 我们先测试构造函数的方法 如代码清单

  代码清单 使用构造函数创建密钥和初始化向量

  using System;

  using System Text;

  using System Security Cryptography;

  namespace Encription

  

  class Program

  

  static void Main(string[] args)

  

  AesCryptoServiceProvider acsp = new AesCryptoServiceProvider();

  WriteKeyAndIV(acsp);

  AesManaged am = new AesManaged();

  WriteKeyAndIV(am);

  DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();

  WriteKeyAndIV(dsp);

  TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();

  WriteKeyAndIV(tdsp);

  RijndaelManaged rm = new RijndaelManaged();

  WriteKeyAndIV(rm);

  Console Read();

  

  static void WriteKeyAndIV(SymmetricAlgorithm sa)

  

  Console WriteLine(GetStringFromByte(sa Key));

  Console WriteLine( ******* );

  Console WriteLine(GetStringFromByte(sa IV));

  Console WriteLine( );

  

  static string GetStringFromByte(byte[] bytes)

  

  string s= ;

  for (int i = ; i < bytes Length; i++)

  

  s += bytes[i] ToString()+ ;

  

  return s;

  

  

  

  如代码清单 所示 一共有三个方法 Main方法用来初始化 NET提供的 种对称加密实例 WriteKeyAndIV方法用来输出每个实例的密钥和初始化向量 GetStringFromByte方法 用来输出byte数组的原始值 那么现在我们看下输出结果 是不是如我们预料到的已经初始化了加密密钥和初始化向量呢?如图 所示

  图 代码清单 输出结果

  如图 在控制台输出了每个加密实例的密钥和初始化向量 当我们需要多个密钥或者多个初始化向量的时候 就需要采用GenerateIV()和GenerateKey()方法 下面我们对代码清单 做简要的修改 如代码清单 所示

  代码清单 使用GenerateIV()和GenerateKey()方法

  using System;

  using System Collections Generic;

  using System Linq;

  using System Text;

  using System Security Cryptography;

  namespace Encription

  

  class Program

  

  static void Main(string[] args)

  

  AesCryptoServiceProvider acsp = new AesCryptoServiceProvider();

  WriteKeyAndIV(acsp);

  acsp GenerateIV();

  acsp GenerateKey();

  WriteKeyAndIV(acsp);

  Console Read();

  

  static void WriteKeyAndIV(SymmetricAlgorithm sa)

  

  Console WriteLine(GetStringFromByte(sa Key));

  Console WriteLine( ******* );

  Console WriteLine(GetStringFromByte(sa IV));

  Console WriteLine( );

  

  static string GetStringFromByte(byte[] bytes)

  

  string s= ;

  for (int i = ; i < bytes Length; i++)

  

  s += bytes[i] ToString()+ ;

  

  return s;

  

  

  

  如代码清单 我们所做的修改很简单 Main方法中只保留了AesCryptoServiceProvider实例 再初始化该实例后 又调用它的GenerateIV和GenerateKey方法 看是否产生了新的加密密钥和初始化向量 结果如图 所示

  图 代码清单 运行结果

  如图 我们可以看到使用GenerateIV和GenerateKey方法后 生成了新的密钥和初始化向量

  我们的准备工作完成了 下面要开始真正的加密之旅了 对称加密需要和CryptoStream类的实例配合 加密流来实现数据加密 NET中的内存流 文件流 网络流都可以使用 为了示例更明了 我们以AesCryptoServiceProvider类为例 使用内存流来演示如何使用对称加密类加密 解密数据 先看代码清单

  代码清单 加密解密数据示例

  using System;

  using System Collections Generic;

  using System Linq;

  using System Text;

  using System Security Cryptography;

  using System IO;

  namespace Sample

  

  class Program

  

  static AesCryptoServiceProvider acsp = new AesCryptoServiceProvider();

  static void Main(string[] args)

  

  byte[] key = acsp Key;

  byte[] iv = acsp IV;

  string s = @ xuanhun加密测试 ;

  byte[] sbyt = Encoding Default GetBytes(s);

  byte []Enb = Encript(sbyt key iv);

  byte []Deb = Decript(Enb key iv);

  Console WriteLine(Encoding Default GetString(Enb));

  Console WriteLine(Encoding Default GetString(Deb));

  Console Read();

  

  public static byte[] Encript(byte[] s byte[] key byte[] iv)

  

  MemoryStream mstream = new MemoryStream();

  CryptoStream cstream = new CryptoStream(mstream acsp CreateEncryptor(key iv) CryptoStreamMode Write);

  cstream Write(s s Length);

  cstream FlushFinalBlock();

  byte[] outb = mstream ToArray();

  cstream Close();

  mstream Close();

  return outb ;

  

  public static byte[] Decript(byte[] s byte[] key byte[] iv)

  

  MemoryStream mtream = new MemoryStream();

  CryptoStream deStreame = new CryptoStream(mtream acsp CreateDecryptor(key iv) CryptoStreamMode Write);

  deStreame Write(s s Length);

  deStreame FlushFinalBlock();

  byte[] outs = mtream ToArray();

  mtream Close();

  deStreame Close();

  return outs ;

  

  public static byte[] GetByteFromstring(string s)

  

  return Encoding Default GetBytes(s);

  

  

  

  如代码清单 我们首先创建了AesCryptoServiceProvider实例 然后再Main方法中使用了局部变量key和iv来保存该实例的加密密钥和初始化向量 字符串s是要加密的原始字符串 局部变量sbyte保存了将字符串s转化为byte数组后的结果 我们的加密解密过程都是围绕该byte数组进行的

  接下来我们介绍Main方法中调用的两个静态方法Encript和Decript方法 分别用来实现加密和解密 在Encript方法中 我们首先初始化内存流MemoryStream的实例mstream 然后以mstream为参数创建CryptoStream实例 CryptoStream构造函数需要三个参数 第一个是流实例 第二个是加密或者解密器 在加密函数中使用CreateEncryptor方法做参数 在解密方法中使用CreateDecryptor做参数 CreateEncryptor和CreateDecryptor方法需要传入我们准备好的加密密钥和初始化向量 第三个参数是CryptoStreamMode枚举 该枚举有两个值 Write和Read 用来指示流的操作 比如在网络流中 加密并输出数据时要设置Write属性 接收并解密的一方要设置Read属性 本例中把加密和解密的数据都写入内存流 所以都设置了Write属性 在初始化CryptoStream实例之后 调用该实例的Write方法 将加密后的数据写入内存流 然后再调用内存流的ToArray方法读出加密数据 返回到Main方法中 通过Encoding Default GetString方法 获得加密后的字符串 解密过程与此类似 不再赘述

  现在我们看看改程序的运行结果 如图 所示

  图 代码清单 运行结果

cha138/Article/program/net/201311/11895

相关参考

知识大全 .NET中的密码学--对称加密

.NET中的密码学--对称加密  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  介绍  在net之

知识大全 AES对称加密例子

AES对称加密例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  什么是AES  AES是一种对

知识大全 C#对称加密解密算法

C#对称加密解密算法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ///<summary

知识大全 使用DES对称加密代码,支持中文

使用DES对称加密代码,支持中文  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!//名称空间usin

知识大全 C# 对称算法,加密解密类

C#对称算法,加密解密类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  模块编号 &n

知识大全 java非对称加密的源代码(RSA)

java非对称加密的源代码(RSA)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  鉴于rsa加

知识大全 Java生成RSA非对称型加密的公钥和私钥

Java生成RSA非对称型加密的公钥和私钥  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  非对称

知识大全 .NET加密原理之方法体加密信息对应关系

.NET加密原理之方法体加密信息对应关系  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在per

知识大全 VB.NET关于加密算法

VB.NET关于加密算法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前几天由于需要去研究了一

知识大全 .NET中加密和解密的实现方法

.NET中加密和解密的实现方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  NET将原来独立的