.NET將原來獨(dú)立的API和SDK合并到一個框架中,這對于程序開發(fā)人員非常有利。它將CryptoAPI改編進(jìn).NET的System.Security.Cryptography名字空間,使密碼服務(wù)擺脫了SDK平臺的神秘性,變成了簡單的.NET名字空間的使用。由于隨著整個框架組件一起共享,密碼服務(wù)更容易實(shí)現(xiàn)了,現(xiàn)在僅僅需要學(xué)習(xí) System.Security.Cryptography名字空間的功能和用于解決特定方案的類。
加密和解密的算法
System.Security.Cryptography名字空間包含了實(shí)現(xiàn)安全方案的類,例如加密和解密數(shù)據(jù)、管理密鑰、驗證數(shù)據(jù)的完整性并確保數(shù)據(jù)沒有被篡改等等。本文重點(diǎn)討論加密和解密。
加密和解密的算法分為對稱(symmetric)算法和不對稱(asymmetric)算法。對稱算法在加密和解密數(shù)據(jù)時使用相同的密鑰和初始化矢量,典型的有DES、 TripleDES和Rijndael算法,它適用于不需要傳遞密鑰的情況,主要用于本地文檔或數(shù)據(jù)的加密。不對稱算法有兩個不同的密鑰,分別是公共密鑰和私有密鑰,公共密鑰在網(wǎng)絡(luò)中傳遞,用于加密數(shù)據(jù),而私有密鑰用于解密數(shù)據(jù)。不對稱算法主要有RSA、DSA等,主要用于網(wǎng)絡(luò)數(shù)據(jù)的加密。
加密和解密本地文檔
下面的例子是加密和解密本地文本,使用的是Rijndael對稱算法。
對稱算法在數(shù)據(jù)流通過時對它進(jìn)行加密。因此首先需要建立一個正常的流(例如I/O流)。文章使用FileStream類將文本文件讀入字節(jié)數(shù)組,也使用該類作為輸出機(jī)制。
接下來定義相應(yīng)的對象變量。在定義SymmetricAlgorithm抽象類的對象變量時我們可以指定任何一種對稱加密算法提供程序。代碼使用的是 Rijndael算法,但是很容易改為DES或者TripleDES算法。.NET使用強(qiáng)大的隨機(jī)密鑰設(shè)置了提供程序的實(shí)例,選擇自己的密鑰是比較危險的,接受計算機(jī)產(chǎn)生的密鑰是一個更好的選擇,文中的代碼使用的是計算機(jī)產(chǎn)生的密鑰。
下一步,算法實(shí)例提供了一個對象來執(zhí)行實(shí)際數(shù)據(jù)傳輸。每種算法都有CreateEncryptor和CreateDecryptor兩個方法,它們返回實(shí)現(xiàn)ICryptoTransform接口的對象。
最后,現(xiàn)在使用BinaryReader的ReadBytes方法讀取源文件,它會返回一個字節(jié)數(shù)組。BinaryReader讀取源文件的輸入流,在作為CryptoStream.Write方法的參數(shù)時調(diào)用ReadBytes方法。指定的CryptoStream實(shí)例被告知它應(yīng)該操作的下層流,該對象將執(zhí)行數(shù)據(jù)傳遞,無論流的目的是讀或者寫。
下面是加密和解密一個文本文件的源程序片斷:
代碼如下:
namespace com.billdawson.crypto
{
class TextFileCrypt
{
public static void Main(string[] args)
{
string file = args[0];
string tempfile = Path.GetTempFileName();
//打開指定的文件
FileStream fsIn = File.Open(file,FileMode.Open,
FileAccess.Read);
新聞熱點(diǎn)
疑難解答
圖片精選