首先.NET中的ICryptoTransform是單向的,也就是只能從一個狀態將數據轉化成另一個狀態,反之是不可以的。當然手動 操作ICryptoTransform還是比較繁瑣的,通過CryptoStream可以更輕松地操作一個ICryptoTransform。由於 ICryptoTransform是單向的,所以加密解密這兩個過程就需要兩個ICryptoTransform,這個通過 SymmetricAlgorithm類的CreateEncryptor和CreateDecryptor方法來創建。而用CryptoStream操 作這兩個ICryptoTransform時,往往加密就是用CryptoStreamMode.Write,解密則用Read,這個從名稱上也是合情合 理的,但是其實CryptoStream的操作模式不是局限於這樣的。
關於ICryptoTransform和CryptoStream的關系模式,可以看這個圖:
其實所謂的Read和Write僅僅是把ICryptoTransform操作的兩個數據狀態換了個位置,最終操作仍然是將ICryptoTransform的源數據轉換成目標數據(單向),只不過不同的模式操作不一樣。
比如我們先使用CryptoStreamMode.Write來加密:
//+ using System.IO;
//+ using System.Security.Cryptography;
staticvoid Main()
{
using (var aes =Aes.Create())
{
var data =Encoding.Unicode.GetBytes("Mgen!");
Console.WriteLine(BitConverter.ToString(Encrypt_Write(aes.CreateEncryptor(), data).ToArray()));
}
}
staticMemoryStream Encrypt_Write(ICryptoTransform ict, byte[] data)
{
using (var ms =newMemoryStream())
using (var cstream =newCryptoStream(ms, ict, CryptoStreamMode.Write))
{
cstream.Write(data, 0, data.Length);
return ms;
}
}
用CryptoStreamMode.Read也可以完成加密:
//+ using System.IO;
//+ using System.Security.Cryptography;
staticvoid Main()
{
using (var aes =Aes.Create())
{
var data =Encoding.Unicode.GetBytes("Mgen!");
Console.WriteLine(BitConverter.ToString(Encrypt_Read(aes.CreateEncryptor(), data).ToArray()));
}
}
staticMemoryStream Encrypt_Read(ICryptoTransform ict, byte[] data)
{
using (var ms =newMemoryStream(data))
using (var cstream =newCryptoStream(ms, ict, CryptoStreamMode.Read))
using (var destMs =newMemoryStream())
{
byte[] buffer =newbyte[100];
int readLen;
while ((readLen = cstream.Read(buffer, 0, 100)) >0)
destMs.Write(buffer, 0, readLen);
return destMs;
}
}
兩者都會成功加密數據,並輸入:
DB-76-CA-5F-62-2C-59-C1-91-48-79-9F-10-B9-8E-2D
上面只講了加密,解密也是完全一樣的,CryptoStreamMode.Write或Read都可以解密!
轉自:http://www.mgenware.com/blog/?p=96