.NET(C#):靈活運用CryptoStream,加密不是必須用CryptoStreamMode.Write


首先.NET中的ICryptoTransform是單向的,也就是只能從一個狀態將數據轉化成另一個狀態,反之是不可以的。當然手動 操作ICryptoTransform還是比較繁瑣的,通過CryptoStream可以更輕松地操作一個ICryptoTransform。由於 ICryptoTransform是單向的,所以加密解密這兩個過程就需要兩個ICryptoTransform,這個通過 SymmetricAlgorithm類的CreateEncryptor和CreateDecryptor方法來創建。而用CryptoStream操 作這兩個ICryptoTransform時,往往加密就是用CryptoStreamMode.Write,解密則用Read,這個從名稱上也是合情合 理的,但是其實CryptoStream的操作模式不是局限於這樣的。

 

關於ICryptoTransform和CryptoStream的關系模式,可以看這個圖:

image

 其實所謂的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM