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, , DESRC2и 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) |
Возвращает длину шифра с заданным режимом заполнения и длиной открытого текста в режиме ECB. |
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, а при необходимости освобождает также управляемые ресурсы. |