Rfc2898DeriveBytes Rfc2898DeriveBytes Rfc2898DeriveBytes Rfc2898DeriveBytes Class

定義

依據 HMACSHA1 使用虛擬亂數產生器,實作密碼式的金鑰衍生功能 PBKDF2。Implements password-based key derivation functionality, PBKDF2, by using a pseudo-random number generator based on HMACSHA1.

public ref class Rfc2898DeriveBytes : System::Security::Cryptography::DeriveBytes
[System.Runtime.InteropServices.ComVisible(true)]
public class Rfc2898DeriveBytes : System.Security.Cryptography.DeriveBytes
type Rfc2898DeriveBytes = class
    inherit DeriveBytes
Public Class Rfc2898DeriveBytes
Inherits DeriveBytes
繼承
Rfc2898DeriveBytesRfc2898DeriveBytesRfc2898DeriveBytesRfc2898DeriveBytes
屬性

範例

下列程式碼範例會使用Rfc2898DeriveBytes類別來建立兩個相同的金鑰TripleDES類別。The following code example uses the Rfc2898DeriveBytes class to create two identical keys for the TripleDES class. 然後,它會加密並解密相同的索引鍵的資料。It then encrypts and decrypts some data using the keys.

using namespace System;
using namespace System::IO;
using namespace System::Text;
using namespace System::Security::Cryptography;

// Generate a key k1 with password pwd1 and salt salt1.
// Generate a key k2 with password pwd1 and salt salt1.
// Encrypt data1 with key k1 using symmetric encryption, creating edata1.
// Decrypt edata1 with key k2 using symmetric decryption, creating data2.
// data2 should equal data1.

int main()
{
   array<String^>^passwordargs = Environment::GetCommandLineArgs();
   String^ usageText = "Usage: RFC2898 <password>\nYou must specify the password for encryption.\n";

   //If no file name is specified, write usage text.
   if ( passwordargs->Length == 1 )
   {
      Console::WriteLine( usageText );
   }
   else
   {
      String^ pwd1 = passwordargs[ 1 ];
      
      array<Byte>^salt1 = gcnew array<Byte>(8);
	  RNGCryptoServiceProvider ^ rngCsp = gcnew RNGCryptoServiceProvider();
		 rngCsp->GetBytes(salt1);
      //data1 can be a string or contents of a file.
      String^ data1 = "Some test data";

      //The default iteration count is 1000 so the two methods use the same iteration count.
      int myIterations = 1000;

      try
      {
         Rfc2898DeriveBytes ^ k1 = gcnew Rfc2898DeriveBytes( pwd1,salt1,myIterations );
         Rfc2898DeriveBytes ^ k2 = gcnew Rfc2898DeriveBytes( pwd1,salt1 );

         // Encrypt the data.
         TripleDES^ encAlg = TripleDES::Create();
         encAlg->Key = k1->GetBytes( 16 );
         MemoryStream^ encryptionStream = gcnew MemoryStream;
         CryptoStream^ encrypt = gcnew CryptoStream( encryptionStream,encAlg->CreateEncryptor(),CryptoStreamMode::Write );
         array<Byte>^utfD1 = (gcnew System::Text::UTF8Encoding( false ))->GetBytes( data1 );

         encrypt->Write( utfD1, 0, utfD1->Length );
         encrypt->FlushFinalBlock();
         encrypt->Close();
         array<Byte>^edata1 = encryptionStream->ToArray();
         k1->Reset();

         // Try to decrypt, thus showing it can be round-tripped.
         TripleDES^ decAlg = TripleDES::Create();
         decAlg->Key = k2->GetBytes( 16 );
         decAlg->IV = encAlg->IV;
         MemoryStream^ decryptionStreamBacking = gcnew MemoryStream;
         CryptoStream^ decrypt = gcnew CryptoStream( decryptionStreamBacking,decAlg->CreateDecryptor(),CryptoStreamMode::Write );

         decrypt->Write( edata1, 0, edata1->Length );
         decrypt->Flush();
         decrypt->Close();
         k2->Reset();

         String^ data2 = (gcnew UTF8Encoding( false ))->GetString( decryptionStreamBacking->ToArray() );
         if (  !data1->Equals( data2 ) )
         {
            Console::WriteLine( "Error: The two values are not equal." );
         }
         else
         {
            Console::WriteLine( "The two values are equal." );
            Console::WriteLine( "k1 iterations: {0}", k1->IterationCount );
            Console::WriteLine( "k2 iterations: {0}", k2->IterationCount );
         }
      }

      catch ( Exception^ e ) 
      {
         Console::WriteLine( "Error: ", e );
      }
   }
}
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

public class rfc2898test
{
    // Generate a key k1 with password pwd1 and salt salt1.
    // Generate a key k2 with password pwd1 and salt salt1.
    // Encrypt data1 with key k1 using symmetric encryption, creating edata1.
    // Decrypt edata1 with key k2 using symmetric decryption, creating data2.
    // data2 should equal data1.

    private const string usageText = "Usage: RFC2898 <password>\nYou must 
specify the password for encryption.\n";
    public static void Main(string[] passwordargs)
    {
        //If no file name is specified, write usage text.
        if (passwordargs.Length == 0)
        {
            Console.WriteLine(usageText);
        }
        else
        {
            string pwd1 = passwordargs[0];
            // Create a byte array to hold the random value. 
            byte[] salt1 = new byte[8];
            using (RNGCryptoServiceProvider rngCsp = new 
RNGCryptoServiceProvider())
            {
                // Fill the array with a random value.
                rngCsp.GetBytes(salt1);
            }

            //data1 can be a string or contents of a file.
            string data1 = "Some test data";
            //The default iteration count is 1000 so the two methods use the 
same iteration count.
            int myIterations = 1000;
            try
            {
                Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(pwd1, salt1, 
myIterations);
                Rfc2898DeriveBytes k2 = new Rfc2898DeriveBytes(pwd1, salt1);
                // Encrypt the data.
                TripleDES encAlg = TripleDES.Create();
                encAlg.Key = k1.GetBytes(16);
                MemoryStream encryptionStream = new MemoryStream();
                CryptoStream encrypt = new CryptoStream(encryptionStream, 
encAlg.CreateEncryptor(), CryptoStreamMode.Write);
                byte[] utfD1 = new System.Text.UTF8Encoding(false).GetBytes(
data1);

                encrypt.Write(utfD1, 0, utfD1.Length);
                encrypt.FlushFinalBlock();
                encrypt.Close();
                byte[] edata1 = encryptionStream.ToArray();
                k1.Reset();

                // Try to decrypt, thus showing it can be round-tripped.
                TripleDES decAlg = TripleDES.Create();
                decAlg.Key = k2.GetBytes(16);
                decAlg.IV = encAlg.IV;
                MemoryStream decryptionStreamBacking = new MemoryStream();
                CryptoStream decrypt = new CryptoStream(
decryptionStreamBacking, decAlg.CreateDecryptor(), CryptoStreamMode.Write);
                decrypt.Write(edata1, 0, edata1.Length);
                decrypt.Flush();
                decrypt.Close();
                k2.Reset();
                string data2 = new UTF8Encoding(false).GetString(
decryptionStreamBacking.ToArray());

                if (!data1.Equals(data2))
                {
                    Console.WriteLine("Error: The two values are not equal.");
                }
                else
                {
                    Console.WriteLine("The two values are equal.");
                    Console.WriteLine("k1 iterations: {0}", k1.IterationCount);
                    Console.WriteLine("k2 iterations: {0}", k2.IterationCount);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: ", e);
            }

        }
    }
}
Imports System
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography



Public Class rfc2898test
    ' Generate a key k1 with password pwd1 and salt salt1.
    ' Generate a key k2 with password pwd1 and salt salt1.
    ' Encrypt data1 with key k1 using symmetric encryption, creating edata1.
    ' Decrypt edata1 with key k2 using symmetric decryption, creating data2.
    ' data2 should equal data1.
    Private Const usageText As String = "Usage: RFC2898 <password>" + vbLf + "You must specify the password for encryption." + vbLf

    Public Shared Sub Main(ByVal passwordargs() As String)
        'If no file name is specified, write usage text.
        If passwordargs.Length = 0 Then
            Console.WriteLine(usageText)
        Else
            Dim pwd1 As String = passwordargs(0)

            Dim salt1(8) As Byte
            Using rngCsp As New RNGCryptoServiceProvider()
                rngCsp.GetBytes(salt1)
            End Using
            'data1 can be a string or contents of a file.
            Dim data1 As String = "Some test data"
            'The default iteration count is 1000 so the two methods use the same iteration count.
            Dim myIterations As Integer = 1000
            Try
                Dim k1 As New Rfc2898DeriveBytes(pwd1, salt1, myIterations)
                Dim k2 As New Rfc2898DeriveBytes(pwd1, salt1)
                ' Encrypt the data.
                Dim encAlg As TripleDES = TripleDES.Create()
                encAlg.Key = k1.GetBytes(16)
                Dim encryptionStream As New MemoryStream()
                Dim encrypt As New CryptoStream(encryptionStream, encAlg.CreateEncryptor(), CryptoStreamMode.Write)
                Dim utfD1 As Byte() = New System.Text.UTF8Encoding(False).GetBytes(data1)
                encrypt.Write(utfD1, 0, utfD1.Length)
                encrypt.FlushFinalBlock()
                encrypt.Close()
                Dim edata1 As Byte() = encryptionStream.ToArray()
                k1.Reset()

                ' Try to decrypt, thus showing it can be round-tripped.
                Dim decAlg As TripleDES = TripleDES.Create()
                decAlg.Key = k2.GetBytes(16)
                decAlg.IV = encAlg.IV
                Dim decryptionStreamBacking As New MemoryStream()
                Dim decrypt As New CryptoStream(decryptionStreamBacking, decAlg.CreateDecryptor(), CryptoStreamMode.Write)
                decrypt.Write(edata1, 0, edata1.Length)
                decrypt.Flush()
                decrypt.Close()
                k2.Reset()
                Dim data2 As String = New UTF8Encoding(False).GetString(decryptionStreamBacking.ToArray())

                If Not data1.Equals(data2) Then
                    Console.WriteLine("Error: The two values are not equal.")
                Else
                    Console.WriteLine("The two values are equal.")
                    Console.WriteLine("k1 iterations: {0}", k1.IterationCount)
                    Console.WriteLine("k2 iterations: {0}", k2.IterationCount)
                End If
            Catch e As Exception
                Console.WriteLine("Error: ", e)
            End Try
        End If

    End Sub
End Class

備註

Rfc2898DeriveBytes 接受密碼、 salt 和反覆計數,並接著會產生金鑰,透過呼叫GetBytes方法。Rfc2898DeriveBytes takes a password, a salt, and an iteration count, and then generates keys through calls to the GetBytes method.

RFC 2898 包含密碼和 salt,建立索引鍵和初始化向量 (IV) 的方法。RFC 2898 includes methods for creating a key and initialization vector (IV) from a password and salt. 您可以使用 PBKDF2,密碼為基礎的金鑰衍生函式,來衍生金鑰使用似隨機函式,可讓要產生的幾乎無限制長度的金鑰。You can use PBKDF2, a password-based key derivation function, to derive keys using a pseudo-random function that allows keys of virtually unlimited length to be generated. Rfc2898DeriveBytes類別可以用來產生衍生的金鑰的基底的索引鍵與其他參數。The Rfc2898DeriveBytes class can be used to produce a derived key from a base key and other parameters. 密碼為基礎的金鑰衍生函式中的基底的索引鍵是密碼,而其他參數則 salt 值和反覆項目計數。In a password-based key derivation function, the base key is a password and the other parameters are a salt value and an iteration count.

如需 PBKDF2 的詳細資訊,請參閱 RFC 2898,"PKCS #5:Password-based Cryptography Specification Version 2.0,」 上可用註解的網站要求For more information about PBKDF2, see RFC 2898, "PKCS #5: Password-Based Cryptography Specification Version 2.0," available on the Request for Comments Web site. 完整的詳細資訊,請參閱區段 5.2,"PBKDF2"。See section 5.2, "PBKDF2," for complete details.

重要

永遠不會硬式編碼在原始程式碼中的密碼。Never hard-code a password within your source code. 可以從組件擷取硬式編碼的密碼,利用Ildasm.exe (IL 反組譯工具)、 使用十六進位編輯器,或只開啟 Notepad.exe 之類的文字編輯器中的組件。Hard-coded passwords can be retrieved from an assembly by using the Ildasm.exe (IL Disassembler), by using a hexadecimal editor, or by simply opening up the assembly in a text editor such as Notepad.exe.

建構函式

Rfc2898DeriveBytes(Byte[], Byte[], Int32) Rfc2898DeriveBytes(Byte[], Byte[], Int32) Rfc2898DeriveBytes(Byte[], Byte[], Int32) Rfc2898DeriveBytes(Byte[], Byte[], Int32)

使用密碼、Salt 和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。Initializes a new instance of the Rfc2898DeriveBytes class using a password, a salt, and number of iterations to derive the key.

Rfc2898DeriveBytes(Byte[], Byte[], Int32, HashAlgorithmName) Rfc2898DeriveBytes(Byte[], Byte[], Int32, HashAlgorithmName) Rfc2898DeriveBytes(Byte[], Byte[], Int32, HashAlgorithmName) Rfc2898DeriveBytes(Byte[], Byte[], Int32, HashAlgorithmName)

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt、反覆項目數和雜湊演算法名稱來衍生金鑰。Initializes a new instance of the Rfc2898DeriveBytes class using the specified password, salt, number of iterations and the hash algorithm name to derive the key.

Rfc2898DeriveBytes(String, Byte[]) Rfc2898DeriveBytes(String, Byte[]) Rfc2898DeriveBytes(String, Byte[]) Rfc2898DeriveBytes(String, Byte[])

使用密碼和 Salt 來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。Initializes a new instance of the Rfc2898DeriveBytes class using a password and salt to derive the key.

Rfc2898DeriveBytes(String, Byte[], Int32) Rfc2898DeriveBytes(String, Byte[], Int32) Rfc2898DeriveBytes(String, Byte[], Int32) Rfc2898DeriveBytes(String, Byte[], Int32)

使用密碼、Salt 和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。Initializes a new instance of the Rfc2898DeriveBytes class using a password, a salt, and number of iterations to derive the key.

Rfc2898DeriveBytes(String, Byte[], Int32, HashAlgorithmName) Rfc2898DeriveBytes(String, Byte[], Int32, HashAlgorithmName) Rfc2898DeriveBytes(String, Byte[], Int32, HashAlgorithmName) Rfc2898DeriveBytes(String, Byte[], Int32, HashAlgorithmName)

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt、反覆項目數和雜湊演算法名稱來衍生金鑰。Initializes a new instance of the Rfc2898DeriveBytes class using the specified password, salt, number of iterations and the hash algorithm name to derive the key.

Rfc2898DeriveBytes(String, Int32) Rfc2898DeriveBytes(String, Int32) Rfc2898DeriveBytes(String, Int32) Rfc2898DeriveBytes(String, Int32)

使用密碼和 Salt 大小來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。Initializes a new instance of the Rfc2898DeriveBytes class using the password and salt size to derive the key.

Rfc2898DeriveBytes(String, Int32, Int32) Rfc2898DeriveBytes(String, Int32, Int32) Rfc2898DeriveBytes(String, Int32, Int32) Rfc2898DeriveBytes(String, Int32, Int32)

使用密碼、Salt 大小和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。Initializes a new instance of the Rfc2898DeriveBytes class using a password, a salt size, and number of iterations to derive the key.

Rfc2898DeriveBytes(String, Int32, Int32, HashAlgorithmName) Rfc2898DeriveBytes(String, Int32, Int32, HashAlgorithmName) Rfc2898DeriveBytes(String, Int32, Int32, HashAlgorithmName) Rfc2898DeriveBytes(String, Int32, Int32, HashAlgorithmName)

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt 大小、反覆項目數和雜湊演算法名稱來衍生金鑰。Initializes a new instance of the Rfc2898DeriveBytes class using the specified password, salt size, number of iterations and the hash algorithm name to derive the key.

屬性

HashAlgorithm HashAlgorithm HashAlgorithm HashAlgorithm
IterationCount IterationCount IterationCount IterationCount

取得或設定操作的重複次數。Gets or sets the number of iterations for the operation.

Salt Salt Salt Salt

取得或設定用於操作的金鑰 Salt 值。Gets or sets the key salt value for the operation.

方法

CryptDeriveKey(String, String, Int32, Byte[]) CryptDeriveKey(String, String, Int32, Byte[]) CryptDeriveKey(String, String, Int32, Byte[]) CryptDeriveKey(String, String, Int32, Byte[])

Rfc2898DeriveBytes 物件衍生密碼編譯金鑰。Derives a cryptographic key from the Rfc2898DeriveBytes object.

Dispose() Dispose() Dispose() Dispose()

在衍生類別中覆寫時,將目前 DeriveBytes 類別的執行個體所使用的所有資源全部釋出。When overridden in a derived class, releases all resources used by the current instance of the DeriveBytes class.

(Inherited from DeriveBytes)
Dispose(Boolean) Dispose(Boolean) Dispose(Boolean) Dispose(Boolean)

釋放 Rfc2898DeriveBytes 類別所使用的 Unmanaged 資源,並選擇性地釋放 Managed 資源。Releases the unmanaged resources used by the Rfc2898DeriveBytes class and optionally releases the managed resources.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

判斷指定的物件是否等於目前的物件。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBytes(Int32) GetBytes(Int32) GetBytes(Int32) GetBytes(Int32)

傳回這個物件的虛擬隨機金鑰。Returns the pseudo-random key for this object.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

做為預設雜湊函式。Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

取得目前執行個體的 TypeGets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

建立目前 Object 的淺層複本 (Shallow Copy)。Creates a shallow copy of the current Object.

(Inherited from Object)
Reset() Reset() Reset() Reset()

重設作業的狀態。Resets the state of the operation.

ToString() ToString() ToString() ToString()

傳回代表目前物件的字串。Returns a string that represents the current object.

(Inherited from Object)

適用於

另請參閱