Rfc2898DeriveBytes 建構函式

定義

初始化 Rfc2898DeriveBytes 類別的新執行個體。

多載

Rfc2898DeriveBytes(String, Byte[])
已淘汰.

使用密碼和 Salt 來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

Rfc2898DeriveBytes(String, Int32)
已淘汰.

使用密碼和 Salt 大小來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

Rfc2898DeriveBytes(Byte[], Byte[], Int32)
已淘汰.

使用密碼、Salt 和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

Rfc2898DeriveBytes(String, Byte[], Int32)
已淘汰.

使用密碼、Salt 和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

Rfc2898DeriveBytes(String, Int32, Int32)
已淘汰.

使用密碼、Salt 大小和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

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

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt、反覆項目數和雜湊演算法名稱來衍生金鑰。

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

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt、反覆項目數和雜湊演算法名稱來衍生金鑰。

Rfc2898DeriveBytes(String, Int32, Int32, HashAlgorithmName)

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt 大小、反覆項目數和雜湊演算法名稱來衍生金鑰。

Rfc2898DeriveBytes(String, Byte[])

來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs

警告

The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.

使用密碼和 Salt 來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

public:
 Rfc2898DeriveBytes(System::String ^ password, cli::array <System::Byte> ^ salt);
public Rfc2898DeriveBytes (string password, byte[] salt);
[System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public Rfc2898DeriveBytes (string password, byte[] salt);
new System.Security.Cryptography.Rfc2898DeriveBytes : string * byte[] -> System.Security.Cryptography.Rfc2898DeriveBytes
[<System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
new System.Security.Cryptography.Rfc2898DeriveBytes : string * byte[] -> System.Security.Cryptography.Rfc2898DeriveBytes
Public Sub New (password As String, salt As Byte())

參數

password
String

用來衍生金鑰的密碼。

salt
Byte[]

用來衍生金鑰的金鑰 Salt。

屬性

例外狀況

指定的 Salt 大小小於 8 個位元組,或反覆計數小於 1。

密碼或 Salt 是 null

範例

下列程式碼範例會 Rfc2898DeriveBytes 使用 類別來建立 類別的 Aes 兩個相同索引鍵。 然後,它會使用金鑰來加密和解密某些資料。

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.
         Aes^ encAlg = Aes::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.
         Aes^ decAlg = Aes::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.
                Aes encAlg = Aes.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.
                Aes decAlg = Aes.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: {0}", e);
            }
        }
    }
}
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 Aes = Aes.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 Aes = Aes.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

備註

salt 大小必須為 8 個位元組或更大。

RFC 2898 包含從密碼和 salt 建立金鑰和初始化向量的方法, (IV) 。 您可以使用 PBKDF2,這是密碼型金鑰衍生函式,使用虛擬隨機函式來衍生金鑰,以允許產生幾乎無限制長度的金鑰。 類別 Rfc2898DeriveBytes 可用來從基底索引鍵和其他參數產生衍生金鑰。 在密碼型金鑰衍生函式中,基底金鑰是密碼,而其他參數則是 salt 值和反復專案計數。

如需 PBKDF2 的詳細資訊,請參閱 RFC 2898,標題為「PKCS #5:Password-Based密碼編譯規格 2.0 版」。 如需完整詳細資料,請參閱第 5.2 節 「PBKDF2」。

重要

絕對不要在原始程式碼中硬式編碼密碼。 使用 Ildasm.exe (IL 反組譯程式) 、使用十六進位編輯器,或在文字編輯器中開啟元件,例如Notepad.exe,即可從元件擷取硬式編碼密碼。

另請參閱

適用於

Rfc2898DeriveBytes(String, Int32)

來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs

警告

The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.

使用密碼和 Salt 大小來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

public:
 Rfc2898DeriveBytes(System::String ^ password, int saltSize);
public Rfc2898DeriveBytes (string password, int saltSize);
[System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public Rfc2898DeriveBytes (string password, int saltSize);
new System.Security.Cryptography.Rfc2898DeriveBytes : string * int -> System.Security.Cryptography.Rfc2898DeriveBytes
[<System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
new System.Security.Cryptography.Rfc2898DeriveBytes : string * int -> System.Security.Cryptography.Rfc2898DeriveBytes
Public Sub New (password As String, saltSize As Integer)

參數

password
String

用來衍生金鑰的密碼。

saltSize
Int32

您希望此類別產生之隨機 Salt 的大小。

屬性

例外狀況

指定的 Salt 大小小於 8 個位元組。

密碼或 Salt 是 null

備註

salt 大小必須為 8 個位元組或更大。

RFC 2898 包含從密碼和 salt 建立金鑰和初始化向量的方法, (IV) 。 您可以使用 PBKDF2,這是密碼型金鑰衍生函式,使用虛擬隨機函式來衍生金鑰,以允許產生幾乎無限制長度的金鑰。 類別 Rfc2898DeriveBytes 可用來從基底索引鍵和其他參數產生衍生金鑰。 在密碼型金鑰衍生函式中,基底金鑰是密碼,而其他參數則是 salt 值和反復專案計數。

如需 PBKDF2 的詳細資訊,請參閱 RFC 2898,標題為「PKCS #5:Password-Based密碼編譯規格 2.0 版」。 如需完整詳細資料,請參閱第 5.2 節 「PBKDF2」。

重要

絕對不要在原始程式碼中硬式編碼密碼。 使用 Ildasm.exe (IL 反組譯程式) 、使用十六進位編輯器,或在文字編輯器中開啟元件,例如Notepad.exe,即可從元件擷取硬式編碼密碼。

另請參閱

適用於

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

來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs

警告

The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.

使用密碼、Salt 和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

public:
 Rfc2898DeriveBytes(cli::array <System::Byte> ^ password, cli::array <System::Byte> ^ salt, int iterations);
public Rfc2898DeriveBytes (byte[] password, byte[] salt, int iterations);
[System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public Rfc2898DeriveBytes (byte[] password, byte[] salt, int iterations);
new System.Security.Cryptography.Rfc2898DeriveBytes : byte[] * byte[] * int -> System.Security.Cryptography.Rfc2898DeriveBytes
[<System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
new System.Security.Cryptography.Rfc2898DeriveBytes : byte[] * byte[] * int -> System.Security.Cryptography.Rfc2898DeriveBytes
Public Sub New (password As Byte(), salt As Byte(), iterations As Integer)

參數

password
Byte[]

用來衍生金鑰的密碼。

salt
Byte[]

用來衍生金鑰的金鑰 Salt。

iterations
Int32

操作的重複次數。

屬性

例外狀況

指定的 Salt 大小小於 8 個位元組,或反覆計數小於 1。

密碼或 Salt 是 null

備註

salt 大小必須是 8 個位元組或更大,且反復專案計數必須大於零。 建議的反覆運算數目下限為 1000。

RFC 2898 包含從密碼和 salt 建立金鑰和初始化向量的方法, (IV) 。 您可以使用 PBKDF2,這是密碼型金鑰衍生函式,使用虛擬隨機函式來衍生金鑰,以允許產生幾乎無限制長度的金鑰。 類別 Rfc2898DeriveBytes 可用來從基底索引鍵和其他參數產生衍生金鑰。 在密碼型金鑰衍生函式中,基底金鑰是密碼,而其他參數則是 salt 值和反復專案計數。

如需 PBKDF2 的詳細資訊,請參閱 RFC 2898,標題為「PKCS #5:Password-Based密碼編譯規格 2.0 版」。 如需完整詳細資料,請參閱第 5.2 節 「PBKDF2」。

重要

絕對不要在原始程式碼中硬式編碼密碼。 使用 Ildasm.exe (IL 反組譯程式) 、使用十六進位編輯器,或在文字編輯器中開啟元件,例如Notepad.exe,即可從元件擷取硬式編碼密碼。

適用於

Rfc2898DeriveBytes(String, Byte[], Int32)

來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs

警告

The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.

使用密碼、Salt 和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

public:
 Rfc2898DeriveBytes(System::String ^ password, cli::array <System::Byte> ^ salt, int iterations);
public Rfc2898DeriveBytes (string password, byte[] salt, int iterations);
[System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public Rfc2898DeriveBytes (string password, byte[] salt, int iterations);
new System.Security.Cryptography.Rfc2898DeriveBytes : string * byte[] * int -> System.Security.Cryptography.Rfc2898DeriveBytes
[<System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
new System.Security.Cryptography.Rfc2898DeriveBytes : string * byte[] * int -> System.Security.Cryptography.Rfc2898DeriveBytes
Public Sub New (password As String, salt As Byte(), iterations As Integer)

參數

password
String

用來衍生金鑰的密碼。

salt
Byte[]

用來衍生金鑰的金鑰 Salt。

iterations
Int32

操作的重複次數。

屬性

例外狀況

指定的 Salt 大小小於 8 個位元組,或反覆計數小於 1。

密碼或 Salt 是 null

範例

下列程式碼範例會 Rfc2898DeriveBytes 使用 類別來建立 類別的 Aes 兩個相同索引鍵。 然後,它會使用金鑰來加密和解密某些資料。

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.
         Aes^ encAlg = Aes::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.
         Aes^ decAlg = Aes::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.
                Aes encAlg = Aes.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.
                Aes decAlg = Aes.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: {0}", e);
            }
        }
    }
}
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 Aes = Aes.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 Aes = Aes.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

備註

salt 大小必須是 8 個位元組或更大,且反復專案計數必須大於零。 建議的反覆運算數目下限為 1000。

RFC 2898 包含從密碼和 salt 建立金鑰和初始化向量的方法, (IV) 。 您可以使用 PBKDF2,這是密碼型金鑰衍生函式,使用虛擬隨機函式來衍生金鑰,以允許產生幾乎無限制長度的金鑰。 類別 Rfc2898DeriveBytes 可用來從基底索引鍵和其他參數產生衍生金鑰。 在密碼型金鑰衍生函式中,基底金鑰是密碼,而其他參數則是 salt 值和反復專案計數。

如需 PBKDF2 的詳細資訊,請參閱 RFC 2898,標題為「PKCS #5:Password-Based密碼編譯規格 2.0 版」。 如需完整詳細資料,請參閱第 5.2 節 「PBKDF2」。

重要

絕對不要在原始程式碼中硬式編碼密碼。 使用 Ildasm.exe (IL 反組譯程式) 、使用十六進位編輯器,或在文字編輯器中開啟元件,例如Notepad.exe,即可從元件擷取硬式編碼密碼。

另請參閱

適用於

Rfc2898DeriveBytes(String, Int32, Int32)

來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs

警告

The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.

使用密碼、Salt 大小和反覆計數來衍生金鑰,以初始化 Rfc2898DeriveBytes 類別的新執行個體。

public:
 Rfc2898DeriveBytes(System::String ^ password, int saltSize, int iterations);
public Rfc2898DeriveBytes (string password, int saltSize, int iterations);
[System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public Rfc2898DeriveBytes (string password, int saltSize, int iterations);
new System.Security.Cryptography.Rfc2898DeriveBytes : string * int * int -> System.Security.Cryptography.Rfc2898DeriveBytes
[<System.Obsolete("The default hash algorithm and iteration counts in Rfc2898DeriveBytes constructors are outdated and insecure. Use a constructor that accepts the hash algorithm and the number of iterations.", DiagnosticId="SYSLIB0041", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
new System.Security.Cryptography.Rfc2898DeriveBytes : string * int * int -> System.Security.Cryptography.Rfc2898DeriveBytes
Public Sub New (password As String, saltSize As Integer, iterations As Integer)

參數

password
String

用來衍生金鑰的密碼。

saltSize
Int32

您希望此類別產生之隨機 Salt 的大小。

iterations
Int32

操作的重複次數。

屬性

例外狀況

指定的 Salt 大小小於 8 個位元組,或反覆計數小於 1。

密碼或 Salt 是 null

iterations 超出範圍。 這個參數需要非負數的數字。

備註

salt 大小必須是 8 個位元組或更大,且反復專案計數必須大於零。 建議的反覆運算數目下限為 1000。

RFC 2898 包含從密碼和 salt 建立金鑰和初始化向量的方法, (IV) 。 您可以使用 PBKDF2,這是密碼型金鑰衍生函式,使用虛擬隨機函式來衍生金鑰,以允許產生幾乎無限制長度的金鑰。 類別 Rfc2898DeriveBytes 可用來從基底索引鍵和其他參數產生衍生金鑰。 在密碼型金鑰衍生函式中,基底金鑰是密碼,而其他參數則是 salt 值和反復專案計數。

如需 PBKDF2 的詳細資訊,請參閱 RFC 2898,標題為「PKCS #5:Password-Based密碼編譯規格 2.0 版」。 如需完整詳細資料,請參閱第 5.2 節 「PBKDF2」。

重要

絕對不要在原始程式碼中硬式編碼密碼。 使用 Ildasm.exe (IL 反組譯程式) 、使用十六進位編輯器,或在文字編輯器中開啟元件,例如Notepad.exe,即可從元件擷取硬式編碼密碼。

另請參閱

適用於

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

來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt、反覆項目數和雜湊演算法名稱來衍生金鑰。

public:
 Rfc2898DeriveBytes(cli::array <System::Byte> ^ password, cli::array <System::Byte> ^ salt, int iterations, System::Security::Cryptography::HashAlgorithmName hashAlgorithm);
public Rfc2898DeriveBytes (byte[] password, byte[] salt, int iterations, System.Security.Cryptography.HashAlgorithmName hashAlgorithm);
new System.Security.Cryptography.Rfc2898DeriveBytes : byte[] * byte[] * int * System.Security.Cryptography.HashAlgorithmName -> System.Security.Cryptography.Rfc2898DeriveBytes
Public Sub New (password As Byte(), salt As Byte(), iterations As Integer, hashAlgorithm As HashAlgorithmName)

參數

password
Byte[]

用來衍生金鑰的密碼。

salt
Byte[]

用來衍生金鑰的金鑰 Salt。

iterations
Int32

操作的重複次數。

hashAlgorithm
HashAlgorithmName

要用來衍生金鑰的雜湊演算法。

例外狀況

saltSize 小於零。

hashAlgorithmName 屬性是 nullEmpty

雜湊演算法名稱無效。

適用於

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

來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt、反覆項目數和雜湊演算法名稱來衍生金鑰。

public:
 Rfc2898DeriveBytes(System::String ^ password, cli::array <System::Byte> ^ salt, int iterations, System::Security::Cryptography::HashAlgorithmName hashAlgorithm);
public Rfc2898DeriveBytes (string password, byte[] salt, int iterations, System.Security.Cryptography.HashAlgorithmName hashAlgorithm);
new System.Security.Cryptography.Rfc2898DeriveBytes : string * byte[] * int * System.Security.Cryptography.HashAlgorithmName -> System.Security.Cryptography.Rfc2898DeriveBytes
Public Sub New (password As String, salt As Byte(), iterations As Integer, hashAlgorithm As HashAlgorithmName)

參數

password
String

用來衍生金鑰的密碼。

salt
Byte[]

用來衍生金鑰的金鑰 Salt。

iterations
Int32

操作的重複次數。

hashAlgorithm
HashAlgorithmName

要用來衍生金鑰的雜湊演算法。

例外狀況

hashAlgorithmName 屬性是 nullEmpty

雜湊演算法名稱無效。

適用於

Rfc2898DeriveBytes(String, Int32, Int32, HashAlgorithmName)

來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs
來源:
Rfc2898DeriveBytes.cs

Rfc2898DeriveBytes 類別的新執行個體初始化,該類別使用指定的密碼、salt 大小、反覆項目數和雜湊演算法名稱來衍生金鑰。

public:
 Rfc2898DeriveBytes(System::String ^ password, int saltSize, int iterations, System::Security::Cryptography::HashAlgorithmName hashAlgorithm);
public Rfc2898DeriveBytes (string password, int saltSize, int iterations, System.Security.Cryptography.HashAlgorithmName hashAlgorithm);
new System.Security.Cryptography.Rfc2898DeriveBytes : string * int * int * System.Security.Cryptography.HashAlgorithmName -> System.Security.Cryptography.Rfc2898DeriveBytes
Public Sub New (password As String, saltSize As Integer, iterations As Integer, hashAlgorithm As HashAlgorithmName)

參數

password
String

用來衍生金鑰的密碼。

saltSize
Int32

您希望此類別產生之隨機 Salt 的大小。

iterations
Int32

操作的重複次數。

hashAlgorithm
HashAlgorithmName

要用來衍生金鑰的雜湊演算法。

例外狀況

saltSize 小於零。

hashAlgorithmName 屬性是 nullEmpty

雜湊演算法名稱無效。

適用於