知识大全 .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中的密码学--对称加密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 介绍 在net之
AES对称加密例子 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 什么是AES AES是一种对
C#对称加密解密算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ///<summary
使用DES对称加密代码,支持中文 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!//名称空间usin
C#对称算法,加密解密类 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 模块编号 &n
java非对称加密的源代码(RSA) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 鉴于rsa加
Java生成RSA非对称型加密的公钥和私钥 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 非对称
.NET加密原理之方法体加密信息对应关系 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在per
VB.NET关于加密算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 前几天由于需要去研究了一
.NET中加密和解密的实现方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! NET将原来独立的