DES稱之為Data Encryption Standard, 屬於基礎的單方向性服務. 可以拿來應用於資料串流編碼. 根據微軟提供的類別物件, 如下所示:
[ComVisibleAttribute(true)]
public sealed class DESCryptoServiceProvider : DES
可以看到這個是一個密封(sealed)的實體類別, 意味它不能被繼承. 不過他實作了DES類別. 來看看DES類別的架構:
[ComVisibleAttribute(true)]
public abstract class DES : SymmetricAlgorithm
這個DES是一個抽象, 不能被實例化. 由此推斷, 他的上層依然也是屬於抽象.
[ComVisibleAttribute(true)]
public abstract class SymmetricAlgorithm : IDisposable
這個上層的SymmetricAlgorithm對於DESCryptoProvider而言是最頂級的抽象, 這個頂級的抽象實作了IDisposable介面, 表示由下直接或間接繼承的具象類別所產生的實例物件可以被直接摧毀(Dispose). 在微軟的DES加密服務提供64位元長度.
根據DESCryptoServiceProvider的完整類別繼承結構如下所示:
System.Object
System.Security.Cryptography.SymmetricAlgorithm
System.Security.Cryptography.DES
System.Security.Cryptography.DESCryptoServiceProvider
這個服務類別來自mscorlib (在 mscorlib.dll 中), 因此在創建專案, 直接就可以使用了, 預設他會匯入mscorlib.dll的參考.
以下根據MSDN的基本範例來看看怎麼使用DES加密服務:
private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV)
{
//Create the file streams to handle the input and output files.
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);
//Create variables to help with read and write.
byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
long rdlen = 0; //This is the total number of bytes written.
long totlen = fin.Length; //This is the total length of the input file.
int len; //This is the number of bytes to be written at a time.
DES des = new DESCryptoServiceProvider();
CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
Console.WriteLine("Encrypting...");
//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
Console.WriteLine("{0} bytes processed", rdlen);
}
encStream.Close();
fout.Close();
fin.Close();
}
上述是一個DES加密服務的實體操作(EncryptData), 用來對資料串流進行加密, 這個操作傳入四個引數, 分別來說明這四個引數的作用:
1. inName: 這個參數是要傳入資料串流的實體路徑
2. outName: 將取得的加密資料串流寫回指定路徑
3. desKey: 這個是DES所使用的加密金鑰
4. desIV: 這是CBC的初始化向量, DES必須要用到, 他不是ECB