Поделиться через


SymmetricAlgorithm Класс

Определение

Представляет абстрактный базовый класс, от которого наследуются все реализации алгоритмов симметричного шифрования.

public ref class SymmetricAlgorithm abstract : IDisposable
public abstract class SymmetricAlgorithm : IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class SymmetricAlgorithm : IDisposable
type SymmetricAlgorithm = class
    interface IDisposable
[<System.Runtime.InteropServices.ComVisible(true)>]
type SymmetricAlgorithm = class
    interface IDisposable
Public MustInherit Class SymmetricAlgorithm
Implements IDisposable
Наследование
SymmetricAlgorithm
Производный
Атрибуты
Реализации

Примеры

В следующем примере кода используется Aes класс с указанным Key свойством и вектором инициализации (IV) для шифрования файла, указанного параметром inName, и выводит зашифрованный результат в файл, указанный параметром outName. Параметры desKey и desIV для метода представляют собой 8-байтовые массивы. Для выполнения этого примера необходимо установить пакет высокого уровня шифрования.

void EncryptData( String^ inName, String^ outName, array<Byte>^aesKey, array<Byte>^aesIV )
{
   
   //Create the file streams to handle the input and output files.
   FileStream^ fin = gcnew FileStream( inName,FileMode::Open,FileAccess::Read );
   FileStream^ fout = gcnew FileStream( outName,FileMode::OpenOrCreate,FileAccess::Write );
   fout->SetLength( 0 );
   
   //Create variables to help with read and write.
   array<Byte>^bin = gcnew array<Byte>(100);
   long rdlen = 0; //This is the total number of bytes written.

   long totlen = (long)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.

   Aes^ aes = Aes::Create();

   CryptoStream^ encStream = gcnew CryptoStream( fout,aes->CreateEncryptor( aesKey, aesIV ),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();
}
private static void EncryptData(string inName, string outName, byte[] aesKey, byte[] aesIV)
 {
     //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.

     Aes aes = Aes.Create();
     CryptoStream encStream = new CryptoStream(fout, aes.CreateEncryptor(aesKey, aesIV), 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();
 }
Private Shared Sub EncryptData(inName As String, outName As String, _
rijnKey() As Byte, rijnIV() As Byte)

    'Create the file streams to handle the input and output files.
    Dim fin As New FileStream(inName, FileMode.Open, FileAccess.Read)
    Dim fout As New FileStream(outName, FileMode.OpenOrCreate, _
       FileAccess.Write)
    fout.SetLength(0)
    
    'Create variables to help with read and write.
    Dim bin(100) As Byte 'This is intermediate storage for the encryption.
    Dim rdlen As Long = 0 'This is the total number of bytes written.
    Dim totlen As Long = fin.Length 'Total length of the input file.
    Dim len As Integer 'This is the number of bytes to be written at a time.
    'Creates the default implementation, which is RijndaelManaged.
    Dim rijn As SymmetricAlgorithm = SymmetricAlgorithm.Create()
    Dim encStream As New CryptoStream(fout, _
       rijn.CreateEncryptor(rijnKey, rijnIV), 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 = Convert.ToInt32(rdlen + len)
        Console.WriteLine("{0} bytes processed", rdlen)
    End While
    
    encStream.Close()
fout.Close()
fin.Close()
End Sub

Комментарии

Классы, производные от класса , SymmetricAlgorithm используют режим цепочки, называемый цепочкой блоков шифров (CBC), который требует ключа (Key) и вектора инициализации (IV) для выполнения криптографических преобразований данных. Чтобы расшифровать данные, зашифрованные с помощью одного из SymmetricAlgorithm классов , необходимо задать Key для свойства и IV свойства те же значения, которые использовались для шифрования. Чтобы симметричный алгоритм был полезен, секретный ключ должен быть известен только отправителю и получателю.

Aes, DES, RC2и TripleDES являются реализациями симметричного алгоритма.

Обратите внимание, что при использовании производных классов недостаточно с точки зрения безопасности просто принудительной сборки мусора после завершения использования объекта . Необходимо явным образом вызвать Clear метод объекта , чтобы обнулить все конфиденциальные данные в объекте, прежде чем он будет освобожден. Обратите внимание, что сборка мусора не обнуляет содержимое собранных объектов, а просто помечает память как доступную для перераспределения. Таким образом, данные, содержащиеся в объекте сборки мусора, могут по-прежнему присутствовать в куче памяти в нераспределенной памяти. В случае криптографических объектов эти данные могут содержать конфиденциальную информацию, например ключевые данные или блок обычного текста.

Все криптографические классы в .NET Framework, которые содержат конфиденциальные Clear данные, реализуют метод . При вызове Clear метод перезаписывает все конфиденциальные данные в объекте нулями, а затем освобождает объект, чтобы его можно было безопасно собрать. После обнуления и освобождения объекта необходимо вызвать Dispose метод с параметром disposing , для которого задано значение True , чтобы удалить все управляемые и неуправляемые ресурсы, связанные с объектом .

Примечания для тех, кто реализует этот метод

При наследовании от SymmetricAlgorithm класса необходимо переопределить следующие члены: CreateDecryptor(Byte[], Byte[]), CreateEncryptor(Byte[], Byte[]), GenerateIV()и GenerateKey().

Конструкторы

SymmetricAlgorithm()

Инициализирует новый экземпляр класса SymmetricAlgorithm.

Поля

BlockSizeValue

Представляет размер блока криптографической операции (в битах).

FeedbackSizeValue

Представляет размер порции данных обратной связи для криптографической операции (в битах).

IVValue

Представляет вектор инициализации (IV) для алгоритма симметричного шифрования.

KeySizeValue

Представляет размер секретного ключа (в битах), используемого алгоритмом симметричного шифрования.

KeyValue

Представляет секретный ключ для алгоритма симметричного шифрования.

LegalBlockSizesValue

Задает размеры блоков (в битах), которые поддерживаются алгоритмом симметричного шифрования.

LegalKeySizesValue

Задает размеры ключа (в битах), которые поддерживаются алгоритмом симметричного шифрования.

ModeValue

Представляет режим шифрования, используемый в алгоритме симметричного шифрования.

PaddingValue

Представляет режим заполнения, используемый в алгоритме симметричного шифрования.

Свойства

BlockSize

Возвращает или задает размер блока криптографической операции (в битах).

FeedbackSize

Возвращает или задает размер ответа криптографической операции (в битах) для режимов шифрования "Обратная связь по шифру" (CFB) и "Выходная обратная связь" (OFB).

IV

Получает или задает вектор инициализации (IV) для алгоритма симметричного шифрования.

Key

Получает или задает секретный ключ для алгоритма симметричного шифрования.

KeySize

Получает или задает размер секретного ключа (в битах), используемого алгоритмом симметричного шифрования.

LegalBlockSizes

Получает размеры блоков (в битах), которые поддерживаются алгоритмом симметричного шифрования.

LegalKeySizes

Возвращает размеры ключа (в битах), которые поддерживаются симметричным алгоритмом.

Mode

Возвращает или задает режим функционирования симметричного алгоритма.

Padding

Возвращает или задает режим заполнения, используемый в симметричном алгоритме.

Методы

Clear()

Освобождает все ресурсы, используемые классом SymmetricAlgorithm.

Create()
Устаревшие..
Устаревшие..

Создает криптографический объект по умолчанию, используемый для выполнения алгоритма симметричного шифрования.

Create(String)
Устаревшие..

Создает заданный криптографический объект, используемый для выполнения алгоритма симметричного шифрования.

CreateDecryptor()

Создает симметричный объект-дешифратор с текущим свойством Key и вектором инициализации (IV).

CreateDecryptor(Byte[], Byte[])

При переопределении в производном классе создает объект-дешифратор для алгоритма симметричного шифрования с заданным свойством Key и вектором инициализации (IV).

CreateEncryptor()

Создает симметричный объект-шифратор с текущим свойством Key и вектором инициализации (IV).

CreateEncryptor(Byte[], Byte[])

При переопределении в производном классе создает объект-шифратор для алгоритма симметричного шифрования с заданным свойством Key и вектором инициализации (IV).

DecryptCbc(Byte[], Byte[], PaddingMode)

Расшифровывает данные с помощью режима CBC с указанным режимом заполнения.

DecryptCbc(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, PaddingMode)

Расшифровывает данные с помощью режима CBC с указанным режимом заполнения.

DecryptCbc(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, PaddingMode)

Расшифровывает данные в указанный буфер, используя режим CBC с указанным режимом заполнения.

DecryptCfb(Byte[], Byte[], PaddingMode, Int32)

Расшифровывает данные с помощью режима CFB с указанным режимом заполнения и размером обратной связи.

DecryptCfb(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, PaddingMode, Int32)

Расшифровывает данные с помощью режима CFB с указанным режимом заполнения и размером обратной связи.

DecryptCfb(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32)

Расшифровывает данные в указанный буфер, используя режим CFB с указанным режимом заполнения и размером обратной связи.

DecryptEcb(Byte[], PaddingMode)

Расшифровывает данные с помощью режима ECB с указанным режимом заполнения.

DecryptEcb(ReadOnlySpan<Byte>, PaddingMode)

Расшифровывает данные с помощью режима ECB с указанным режимом заполнения.

DecryptEcb(ReadOnlySpan<Byte>, Span<Byte>, PaddingMode)

Расшифровывает данные в указанный буфер, используя режим ECB с указанным режимом заполнения.

Dispose()

Освобождает все ресурсы, используемые текущим экземпляром класса SymmetricAlgorithm.

Dispose(Boolean)

Освобождает неуправляемые ресурсы, используемые объектом SymmetricAlgorithm, а при необходимости освобождает также управляемые ресурсы.

EncryptCbc(Byte[], Byte[], PaddingMode)

Шифрует данные с помощью режима CBC с указанным режимом заполнения.

EncryptCbc(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, PaddingMode)

Шифрует данные с помощью режима CBC с указанным режимом заполнения.

EncryptCbc(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, PaddingMode)

Шифрует данные в указанный буфер, используя режим CBC с указанным режимом заполнения.

EncryptCfb(Byte[], Byte[], PaddingMode, Int32)

Шифрует данные с помощью режима CFB с указанным режимом заполнения и размером обратной связи.

EncryptCfb(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, PaddingMode, Int32)

Шифрует данные с помощью режима CFB с указанным режимом заполнения и размером обратной связи.

EncryptCfb(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32)

Шифрует данные в указанный буфер, используя режим CFB с указанным режимом заполнения и размером обратной связи.

EncryptEcb(Byte[], PaddingMode)

Шифрует данные с помощью режима ECB с указанным режимом заполнения.

EncryptEcb(ReadOnlySpan<Byte>, PaddingMode)

Шифрует данные с помощью режима ECB с указанным режимом заполнения.

EncryptEcb(ReadOnlySpan<Byte>, Span<Byte>, PaddingMode)

Шифрует данные в указанный буфер, используя режим ECB с указанным режимом заполнения.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
Finalize()

Этот член переопределяет Finalize(); по данной теме может быть доступна более полная документация.

Позволяет объекту Object попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как объект Object будет утилизирован в процессе сборки мусора.

GenerateIV()

При переопределении в производном классе генерирует случайный вектор инициализации (IV), используемый для алгоритма.

GenerateKey()

При переопределении в производном классе генерирует случайный ключ (Key), используемый для алгоритма.

GetCiphertextLengthCbc(Int32, PaddingMode)

Возвращает длину зашифрованного текста с заданным режимом заполнения и длину открытого текста в режиме CBC.

GetCiphertextLengthCfb(Int32, PaddingMode, Int32)

Возвращает длину зашифрованного текста с заданным режимом заполнения и длину открытого текста в режиме CFB.

GetCiphertextLengthEcb(Int32, PaddingMode)

Возвращает длину зашифрованного текста с заданным режимом заполнения и длину открытого текста в режиме ЕЦБ.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
TryDecryptCbc(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, Int32, PaddingMode)

Пытается расшифровать данные в указанный буфер, используя режим CBC с указанным режимом заполнения.

TryDecryptCbcCore(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32)

При переопределении в производном классе пытается расшифровать данные в указанный буфер, используя режим CBC с указанным режимом заполнения.

TryDecryptCfb(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, Int32, PaddingMode, Int32)

Пытается расшифровать данные в указанный буфер, используя режим CFB с указанным режимом заполнения и размером обратной связи.

TryDecryptCfbCore(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32, Int32)

При переопределении в производном классе пытается расшифровать данные в указанный буфер, используя режим CFB с указанным режимом заполнения и размером обратной связи.

TryDecryptEcb(ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32)

Пытается расшифровать данные в указанный буфер, используя режим ECB с указанным режимом заполнения.

TryDecryptEcbCore(ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32)

При переопределении в производном классе пытается расшифровать данные в указанный буфер, используя режим ECB с указанным режимом заполнения.

TryEncryptCbc(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, Int32, PaddingMode)

Пытается зашифровать данные в указанный буфер, используя режим CBC с указанным режимом заполнения.

TryEncryptCbcCore(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32)

При переопределении в производном классе пытается зашифровать данные в указанный буфер, используя режим CBC с указанным режимом заполнения.

TryEncryptCfb(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, Int32, PaddingMode, Int32)

Пытается зашифровать данные в указанный буфер, используя режим CFB с указанным режимом заполнения и размером обратной связи.

TryEncryptCfbCore(ReadOnlySpan<Byte>, ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32, Int32)

При переопределении в производном классе пытается зашифровать данные в указанный буфер, используя режим CFB с указанным режимом заполнения и размером обратной связи.

TryEncryptEcb(ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32)

Пытается зашифровать данные в указанный буфер, используя режим ECB с указанным режимом заполнения.

TryEncryptEcbCore(ReadOnlySpan<Byte>, Span<Byte>, PaddingMode, Int32)

При переопределении в производном классе пытается зашифровать данные в указанный буфер, используя режим ECB с указанным режимом заполнения.

ValidKeySize(Int32)

Определяет, является ли заданный размер ключа допустимым для текущего алгоритма.

Явные реализации интерфейса

IDisposable.Dispose()

Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.

Освобождает неуправляемые ресурсы, используемые объектом SymmetricAlgorithm, а при необходимости освобождает также управляемые ресурсы.

Применяется к

См. также раздел