MACTripleDES 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
使用輸入資料 TripleDES 的 CryptoStream,計算訊息驗證碼 (MAC)。
public ref class MACTripleDES : System::Security::Cryptography::KeyedHashAlgorithm
public class MACTripleDES : System.Security.Cryptography.KeyedHashAlgorithm
[System.Runtime.InteropServices.ComVisible(true)]
public class MACTripleDES : System.Security.Cryptography.KeyedHashAlgorithm
type MACTripleDES = class
inherit KeyedHashAlgorithm
[<System.Runtime.InteropServices.ComVisible(true)>]
type MACTripleDES = class
inherit KeyedHashAlgorithm
Public Class MACTripleDES
Inherits KeyedHashAlgorithm
- 繼承
- 屬性
範例
下列範例會為名為 input.txt
的檔案建立 MAC,該檔案位於包含範例可執行文件的資料夾。 MAC 和原始文字會寫入相同資料夾中名為 encrypted.hsh
的檔案。 接著會讀取簽署的檔案,並計算檔案文字部分的 MAC,並與文字隨附的 MAC 進行比較。
using System;
using System.IO;
using System.Security.Cryptography;
public class MACTripleDESexample
{
public static void Main(string[] Fileargs)
{
string dataFile;
string signedFile;
//If no file names are specified, create them.
if (Fileargs.Length < 2)
{
dataFile = @"text.txt";
signedFile = "signedFile.enc";
if (!File.Exists(dataFile))
{
// Create a file to write to.
using (StreamWriter sw = File.CreateText(dataFile))
{
sw.WriteLine("Here is a message to sign");
}
}
}
else
{
dataFile = Fileargs[0];
signedFile = Fileargs[1];
}
try
{
// Create a random key using a random number generator. This would be the
// secret key shared by sender and receiver.
byte[] secretkey = new Byte[24];
//RNGCryptoServiceProvider is an implementation of a random number generator.
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
// The array is now filled with cryptographically strong random bytes.
rng.GetBytes(secretkey);
// Use the secret key to sign the message file.
SignFile(secretkey, dataFile, signedFile);
// Verify the signed file
VerifyFile(secretkey, signedFile);
}
}
catch (IOException e)
{
Console.WriteLine("Error: File not found", e);
}
} //end main
// Computes a keyed hash for a source file and creates a target file with the keyed hash
// prepended to the contents of the source file.
public static void SignFile(byte[] key, String sourceFile, String destFile)
{
// Initialize the keyed hash object.
using (MACTripleDES hmac = new MACTripleDES(key))
{
using (FileStream inStream = new FileStream(sourceFile, FileMode.Open))
{
using (FileStream outStream = new FileStream(destFile, FileMode.Create))
{
// Compute the hash of the input file.
byte[] hashValue = hmac.ComputeHash(inStream);
// Reset inStream to the beginning of the file.
inStream.Position = 0;
// Write the computed hash value to the output file.
outStream.Write(hashValue, 0, hashValue.Length);
// Copy the contents of the sourceFile to the destFile.
int bytesRead;
// read 1K at a time
byte[] buffer = new byte[1024];
do
{
// Read from the wrapping CryptoStream.
bytesRead = inStream.Read(buffer, 0, 1024);
outStream.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);
}
}
}
return;
} // end SignFile
// Compares the key in the source file with a new key created for the data portion of the file. If the keys
// compare the data has not been tampered with.
public static bool VerifyFile(byte[] key, String sourceFile)
{
bool err = false;
// Initialize the keyed hash object.
using (MACTripleDES hmac = new MACTripleDES(key))
{
// Create an array to hold the keyed hash value read from the file.
byte[] storedHash = new byte[hmac.HashSize / 8];
// Create a FileStream for the source file.
using (FileStream inStream = new FileStream(sourceFile, FileMode.Open))
{
// Read in the storedHash.
inStream.Read(storedHash, 0, storedHash.Length);
// Compute the hash of the remaining contents of the file.
// The stream is properly positioned at the beginning of the content,
// immediately after the stored hash value.
byte[] computedHash = hmac.ComputeHash(inStream);
// compare the computed hash with the stored value
for (int i = 0; i < storedHash.Length; i++)
{
if (computedHash[i] != storedHash[i])
{
err = true;
}
}
}
}
if (err)
{
Console.WriteLine("Hash values differ! Signed file has been tampered with!");
return false;
}
else
{
Console.WriteLine("Hash values agree -- no tampering occurred.");
return true;
}
} //end VerifyFile
} //end class
Imports System.IO
Imports System.Security.Cryptography
Public Class MACTripleDESexample
Public Shared Sub Main(ByVal Fileargs() As String)
Dim dataFile As String
Dim signedFile As String
'If no file names are specified, create them.
If Fileargs.Length < 2 Then
dataFile = "text.txt"
signedFile = "signedFile.enc"
If Not File.Exists(dataFile) Then
' Create a file to write to.
Using sw As StreamWriter = File.CreateText(dataFile)
sw.WriteLine("Here is a message to sign")
End Using
End If
Else
dataFile = Fileargs(0)
signedFile = Fileargs(1)
End If
Try
' Create a random key using a random number generator. This would be the
' secret key shared by sender and receiver.
Dim secretkey() As Byte = New [Byte](23) {}
'RNGCryptoServiceProvider is an implementation of a random number generator.
Using rng As New RNGCryptoServiceProvider()
' The array is now filled with cryptographically strong random bytes.
rng.GetBytes(secretkey)
' Use the secret key to encode the message file.
SignFile(secretkey, dataFile, signedFile)
' Take the encoded file and decode
VerifyFile(secretkey, signedFile)
End Using
Catch e As IOException
Console.WriteLine("Error: File not found", e)
End Try
End Sub
' Computes a keyed hash for a source file and creates a target file with the keyed hash
' prepended to the contents of the source file.
Public Shared Sub SignFile(ByVal key() As Byte, ByVal sourceFile As String, ByVal destFile As String)
' Initialize the keyed hash object.
Using myhmac As New MACTripleDES(key)
Using inStream As New FileStream(sourceFile, FileMode.Open)
Using outStream As New FileStream(destFile, FileMode.Create)
' Compute the hash of the input file.
Dim hashValue As Byte() = myhmac.ComputeHash(inStream)
' Reset inStream to the beginning of the file.
inStream.Position = 0
' Write the computed hash value to the output file.
outStream.Write(hashValue, 0, hashValue.Length)
' Copy the contents of the sourceFile to the destFile.
Dim bytesRead As Integer
' read 1K at a time
Dim buffer(1023) As Byte
Do
' Read from the wrapping CryptoStream.
bytesRead = inStream.Read(buffer, 0, 1024)
outStream.Write(buffer, 0, bytesRead)
Loop While bytesRead > 0
End Using
End Using
End Using
Return
End Sub
' end SignFile
' Compares the key in the source file with a new key created for the data portion of the file. If the keys
' compare the data has not been tampered with.
Public Shared Function VerifyFile(ByVal key() As Byte, ByVal sourceFile As String) As Boolean
Dim err As Boolean = False
' Initialize the keyed hash object.
Using hmac As New MACTripleDES(key)
' Create an array to hold the keyed hash value read from the file.
Dim storedHash(hmac.HashSize / 8) As Byte
' Create a FileStream for the source file.
Using inStream As New FileStream(sourceFile, FileMode.Open)
' Read in the storedHash.
inStream.Read(storedHash, 0, storedHash.Length - 1)
' Compute the hash of the remaining contents of the file.
' The stream is properly positioned at the beginning of the content,
' immediately after the stored hash value.
Dim computedHash As Byte() = hmac.ComputeHash(inStream)
' compare the computed hash with the stored value
Dim i As Integer
For i = 0 To storedHash.Length - 2
If computedHash(i) <> storedHash(i) Then
err = True
End If
Next i
End Using
End Using
If err Then
Console.WriteLine("Hash values differ! Signed file has been tampered with!")
Return False
Else
Console.WriteLine("Hash values agree -- no tampering occurred.")
Return True
End If
End Function 'VerifyFile
End Class
'end class
備註
MAC 可用來判斷透過不安全通道傳送的訊息是否已遭到竄改,前提是傳送者和接收者共用秘密密鑰。 傳送者會計算原始數據的 MAC,並以單一訊息的形式傳送兩者。 接收者會在收到的訊息上重新計算 MAC,並檢查計算的 MAC 是否符合傳輸的 MAC。
數據或 MAC 的任何變更都會導致不符,因為必須知道秘密密鑰,才能變更訊息並重現正確的 MAC。 因此,如果程式代碼相符,則會驗證訊息。
MACTripleDES 使用長度為 16 或 24 個字節的索引鍵,併產生長度為 8 個字節的哈希序列。
建構函式
MACTripleDES() |
初始化 MACTripleDES 類別的新執行個體。 |
MACTripleDES(Byte[]) |
使用指定的金鑰資料,初始化 MACTripleDES 類別的新執行個體。 |
MACTripleDES(String, Byte[]) |
使用指定的金鑰資料,並使用指定的 TripleDES 實作,初始化 MACTripleDES 類別的新執行個體。 |
欄位
HashSizeValue |
代表計算出來之雜湊碼的大小,以位元為單位。 (繼承來源 HashAlgorithm) |
HashValue |
表示計算出來的雜湊碼的值。 (繼承來源 HashAlgorithm) |
KeyValue |
要使用於雜湊演算法的金鑰。 (繼承來源 KeyedHashAlgorithm) |
State |
表示雜湊計算的狀態。 (繼承來源 HashAlgorithm) |
屬性
CanReuseTransform |
取得值,表示目前的轉換是否可重複使用。 (繼承來源 HashAlgorithm) |
CanTransformMultipleBlocks |
在衍生類別中覆寫時,取得值以指出是否有多個區塊可被轉換。 (繼承來源 HashAlgorithm) |
Hash |
取得計算出來之雜湊碼的值。 (繼承來源 HashAlgorithm) |
HashSize |
取得計算出來之雜湊碼的大小,以位元為單位。 (繼承來源 HashAlgorithm) |
InputBlockSize |
在衍生類別中覆寫時,取得輸入區塊的大小。 (繼承來源 HashAlgorithm) |
Key |
取得或設定要使用於雜湊演算法的金鑰。 (繼承來源 KeyedHashAlgorithm) |
OutputBlockSize |
在衍生類別中覆寫時,取得輸出區塊的大小。 (繼承來源 HashAlgorithm) |
Padding |
取得或設定雜湊演算法中所使用的填補模式。 |
方法
明確介面實作
IDisposable.Dispose() |
釋放 HashAlgorithm 所使用的 Unmanaged 資源,並選擇性地釋放 Managed 資源。 (繼承來源 HashAlgorithm) |