службы шифрованияCryptographic Services

Общедоступные сети, такие как Интернет, не предоставляют средств обеспечения защищенного взаимодействия между объектами.Public networks such as the Internet do not provide a means of secure communication between entities. При взаимодействии через такие сети может происходить чтение или даже изменение передаваемой информации неправомочными третьими лицами.Communication over such networks is susceptible to being read or even modified by unauthorized third parties. Использование криптографии обеспечивает защиту данных от просмотра, обнаружение изменения данных и безопасный обмен данными на основе незащищенных каналов.Cryptography helps protect data from being viewed, provides ways to detect whether data has been modified, and helps provide a secure means of communication over otherwise nonsecure channels. Например, данные могут быть зашифрованы с помощью некоторого криптографического алгоритма, переданы в зашифрованном виде, а затем расшифрованы лицом, которому они предназначались.For example, data can be encrypted by using a cryptographic algorithm, transmitted in an encrypted state, and later decrypted by the intended party. Если зашифрованные данные будут перехвачены третьим лицом, расшифровать их будет трудно.If a third party intercepts the encrypted data, it will be difficult to decipher.

Классы в пространстве имен System.Security.Cryptography .NET Framework управляют различными аспектами криптографии.In the .NET Framework, the classes in the System.Security.Cryptography namespace manage many details of cryptography for you. Некоторые из них являются оболочками для неуправляемого кода Microsoft Cryptography API (CryptoAPI), в то время как другие реализованы полностью в виде управляемого кода.Some are wrappers for the unmanaged Microsoft Cryptography API (CryptoAPI), while others are purely managed implementations. При использовании этих классов вам вовсе не обязательно быть экспертом в криптографии.You do not need to be an expert in cryptography to use these classes. При создании экземпляра одного из классов, реализующих алгоритмы шифрования, ключи создаются автоматически с целью удобства использования, а принятые по умолчанию значения свойств призваны обеспечить максимальную защищенность.When you create a new instance of one of the encryption algorithm classes, keys are autogenerated for ease of use, and default properties are as safe and secure as possible.

В этом обзоре представлен краткий обзор методов шифрования и методы, поддерживаемые платформой .NET Framework, включая манифесты ClickOnce, требованиям стандарта Suite B и поддержку криптографии следующего поколения (CNG), платформой .NET Framework 3.5.This overview provides a synopsis of the encryption methods and practices supported by the .NET Framework, including the ClickOnce manifests, Suite B, and Cryptography Next Generation (CNG) support introduced in the .NET Framework 3.5.

Обзор включает следующие разделы.This overview contains the following sections:

Дополнительные сведения о шифровании, а также службах, компонентах и средствах корпорации Майкрософт, позволяющих обеспечить криптографическую защиту в приложениях, см. в разделе данной документации, посвященном обеспечению безопасности при разработке приложений Win32 и COM.For additional information about cryptography and about Microsoft services, components, and tools that enable you to add cryptographic security to your applications, see the Win32 and COM Development, Security section of this documentation.

Криптографические примитивыCryptographic Primitives

В типичной ситуации, когда используется криптография, две стороны (Анна и Виктор) осуществляют связь по незащищенному каналу.In a typical situation where cryptography is used, two parties (Alice and Bob) communicate over a nonsecure channel. Анна и Виктор хотят быть уверены в том, что передаваемые ими данные не могут быть прочитаны даже в случае возможного перехвата.Alice and Bob want to ensure that their communication remains incomprehensible by anyone who might be listening. Более того, так как Анна и Виктор находятся в удаленных друг от друга местах, Анна должна быть уверена, что информация, которую она получает от Виктора, не подвергается изменению во время передачи.Furthermore, because Alice and Bob are in remote locations, Alice must make sure that the information she receives from Bob has not been modified by anyone during transmission. Также она должна быть уверена в том, что получаемые ею данные действительно исходят от Виктора, а не от кого-то, выдающего себя за него.In addition, she must make sure that the information really does originate from Bob and not from someone who is impersonating Bob.

Криптография используется для достижения следующих целей:Cryptography is used to achieve the following goals:

  • Конфиденциальность: Для защиты удостоверения или данных пользователя от несанкционированного просмотра.Confidentiality: To help protect a user's identity or data from being read.

  • Целостность данных: Для защиты данных от изменений.Data integrity: To help protect data from being changed.

  • Проверка подлинности: Чтобы убедиться, что данные поступили от определенного лица.Authentication: To ensure that data originates from a particular party.

  • Неотрекаемость: Чтобы предотвратить сторона отрицать факт отправки сообщения.Non-repudiation: To prevent a particular party from denying that they sent a message.

Для достижения этих целей можно использовать алгоритмы и правила, известные как криптографические примитивы, для создания криптографической схемы.To achieve these goals, you can use a combination of algorithms and practices known as cryptographic primitives to create a cryptographic scheme. В таблице ниже приведены криптографические примитивы и описано их использование.The following table lists the cryptographic primitives and their uses.

Криптографический примитивCryptographic primitive ИспользоватьUse
Шифрование с закрытым ключом (симметричное шифрование)Secret-key encryption (symmetric cryptography) Осуществляет преобразование данных с целью предотвращения их просмотра третьей стороной.Performs a transformation on data to keep it from being read by third parties. При таком способе шифрования для шифрования и расшифровки данных используется один общий закрытый ключ.This type of encryption uses a single shared, secret key to encrypt and decrypt data.
Шифрование с открытым ключом (асимметричное шифрование)Public-key encryption (asymmetric cryptography) Осуществляет преобразование данных с целью предотвращения их просмотра третьей стороной.Performs a transformation on data to keep it from being read by third parties. При таком способе шифрования для шифрования и расшифровки данных используется набор, состоящий из открытого и закрытого ключей.This type of encryption uses a public/private key pair to encrypt and decrypt data.
Создание криптографической подписиCryptographic signing Позволяет проверить, действительно ли данные исходят от конкретного лица, с помощью уникальной цифровой подписи этого лица.Helps verify that data originates from a specific party by creating a digital signature that is unique to that party. Этот процесс также использует хэш-функции.This process also uses hash functions.
Криптографическое хэшированиеCryptographic hashes Отображает данные любого размера в байтовую последовательность фиксированной длины.Maps data from any length to a fixed-length byte sequence. Результаты хэширования статистически уникальны; отличающаяся хотя бы одним байтом последовательность не будет преобразована в то же самое значение.Hashes are statistically unique; a different two-byte sequence will not hash to the same value.

К началуBack to top

Шифрование с закрытым ключомSecret-Key Encryption

При шифровании с закрытым ключом для шифрования и расшифровки данных используется один закрытый ключ.Secret-key encryption algorithms use a single secret key to encrypt and decrypt data. Необходимо обезопасить этот ключ от несанкционированного доступа, потому что любое обладающее им лицо может использовать его для расшифровки данных или шифрования собственных данных с подменой источника.You must secure the key from access by unauthorized agents, because any party that has the key can use it to decrypt your data or encrypt their own data, claiming it originated from you.

Шифрование с закрытым ключом называют также симметричным шифрованием, так как для шифрования и расшифровки используется один и тот же ключ.Secret-key encryption is also referred to as symmetric encryption because the same key is used for encryption and decryption. Алгоритмы шифрования с закрытым ключом являются очень быстрыми (по сравнению с алгоритмами шифрования с открытым ключом) и хорошо подходят для осуществления криптографических преобразований больших массивов данных.Secret-key encryption algorithms are very fast (compared with public-key algorithms) and are well suited for performing cryptographic transformations on large streams of data. Асимметричные алгоритмы шифрования, такие как RSA, имеют математические ограничения на объем шифруемых данных.Asymmetric encryption algorithms such as RSA are limited mathematically in how much data they can encrypt. Для симметричных алгоритмов шифрования подобные проблемы обычно не возникают.Symmetric encryption algorithms do not generally have those problems.

Разновидность алгоритмов шифрования с закрытым ключом, называемая блочным шифром, используется для шифрования целого блока данных за один раз.A type of secret-key algorithm called a block cipher is used to encrypt one block of data at a time. Блочные шифры (такие как DES, TrippleDES и AES) преобразуют входной блок данных длиной в n байтов в выходной блок зашифрованных данных.Block ciphers such as Data Encryption Standard (DES), TripleDES, and Advanced Encryption Standard (AES) cryptographically transform an input block of n bytes into an output block of encrypted bytes. Если необходимо зашифровать или расшифровать последовательность байтов, следует делать это блок за блоком.If you want to encrypt or decrypt a sequence of bytes, you have to do it block by block. Так как значение n достаточно мало (8 байт для DES и TripleDES; 16 байт (по умолчанию), 24 или 32 байта для AES), данные большей длины, чем n , должны шифроваться блоками, по одному за раз.Because n is small (8 bytes for DES and TripleDES; 16 bytes [the default], 24 bytes, or 32 bytes for AES), data values that are larger than n have to be encrypted one block at a time. Блоки данных размером менее n байт должны быть увеличены до n байт перед обработкой.Data values that are smaller than n have to be expanded to n in order to be processed.

Одна из простейших форм блочного шифра называется режимом электронной кодовой книги (ECB).One simple form of block cipher is called the electronic codebook (ECB) mode. Режим ECB не считается безопасным, так как в нем не используется вектор инициализации для инициализации первого текстового блока.ECB mode is not considered secure, because it does not use an initialization vector to initialize the first plaintext block. Для заданного закрытого ключа kпростой блочный шифр, не использующий вектор инициализации, зашифрует одинаковые входные блоки текста в одинаковые выходные блоки зашифрованного текста.For a given secret key k, a simple block cipher that does not use an initialization vector will encrypt the same input block of plaintext into the same output block of ciphertext. Поэтому, если во входном текстовом потоке есть одинаковые блоки, в зашифрованном потоке также будут одинаковые блоки.Therefore, if you have duplicate blocks in your input plaintext stream, you will have duplicate blocks in your output ciphertext stream. Такие повторяющиеся выходные блоки сообщают неправомочным пользователям о ненадежных алгоритмах шифрования, которыми можно воспользоваться, и о возможных типах атак.These duplicate output blocks alert unauthorized users to the weak encryption used the algorithms that might have been employed, and the possible modes of attack. Шифр ECB поэтому очень уязвим для анализа и, в конечном итоге, для взлома ключа.The ECB cipher mode is therefore quite vulnerable to analysis, and ultimately, key discovery.

Классы блочных шифров, предоставляемые библиотекой базовых классов, используют режим сцепления, называемый сцеплением шифровальных блоков (CBC), хотя эту настройку по умолчанию можно изменить.The block cipher classes that are provided in the base class library use a default chaining mode called cipher-block chaining (CBC), although you can change this default if you want.

Шифры CBC решают проблемы, связанные с использованием шифров ECB, благодаря использованию вектора инициализации (IV) для шифрования первого текстового блока.CBC ciphers overcome the problems associated with ECB ciphers by using an initialization vector (IV) to encrypt the first block of plaintext. Перед шифрованием каждого блока открытого текста он объединяется с зашифрованным текстом предыдущего блока с помощью поразрядной исключающей операции OR (XOR).Each subsequent block of plaintext undergoes a bitwise exclusive OR (XOR) operation with the previous ciphertext block before it is encrypted. Поэтому каждый блок зашифрованного текста зависит от всех предыдущих блоков.Each ciphertext block is therefore dependent on all previous blocks. При использовании этой системы шифрования стандартные заголовки сообщений, которые могут быть известны неправомочному пользователю, не могут быть использованы им для восстановления закрытого ключа.When this system is used, common message headers that might be known to an unauthorized user cannot be used to reverse-engineer a key.

Одним из способов раскрытия данных, зашифрованных с помощью шифра CBC, является подбор ключа методом полного перебора возможных ключей.One way to compromise data that is encrypted with a CBC cipher is to perform an exhaustive search of every possible key. В зависимости от длины использованного для шифрования ключа такой подбор занимает очень много времени даже на самых быстрых компьютерах, поэтому он является практически неосуществимым.Depending on the size of the key that is used to perform encryption, this kind of search is very time-consuming using even the fastest computers and is therefore infeasible. Шифры с большей длиной ключа труднее взломать.Larger key sizes are more difficult to decipher. Несмотря на то что использование шифрования не гарантирует теоретическую невозможность раскрытия зашифрованных данных неправомочным лицом, стоимость такого взлома становится чрезвычайно высокой.Although encryption does not make it theoretically impossible for an adversary to retrieve the encrypted data, it does raise the cost of doing this. Если процесс подбора ключа и раскрытия зашифрованных данных занимает три месяца, в то время как сами данные актуальны в течение всего нескольких дней, подбор ключа методом полного перебора не представляет практической ценности.If it takes three months to perform an exhaustive search to retrieve data that is meaningful only for a few days, the exhaustive search method is impractical.

Недостатком шифрования с закрытым ключом является необходимость того, чтобы две стороны согласовали ключ и вектор инициализации, для чего может потребоваться их передача через систему связи.The disadvantage of secret-key encryption is that it presumes two parties have agreed on a key and IV, and communicated their values. Вектор инициализации не считается секретным и может передаваться вместе с сообщением в текстовом формате.The IV is not considered a secret and can be transmitted in plaintext with the message. Однако ключ не должен стать известен неправомочным пользователям.However, the key must be kept secret from unauthorized users. Из-за этих проблем шифрование с закрытым ключом часто используется в сочетании с шифрованием с открытым ключом для безопасной передачи ключа и вектора инициализации.Because of these problems, secret-key encryption is often used together with public-key encryption to privately communicate the values of the key and IV.

Предположим, что Анна и Виктор являются двумя сторонами, которые хотят осуществлять связь по незащищенному каналу, они могут использовать шифрование с закрытым ключом следующим образом: Анна и Виктор соглашаются использовать некоторый определенный алгоритм (например, AES) с конкретный ключ и вектор Инициализации.Assuming that Alice and Bob are two parties who want to communicate over a nonsecure channel, they might use secret-key encryption as follows: Alice and Bob agree to use one particular algorithm (AES, for example) with a particular key and IV. Анна пишет сообщение и создает сетевой поток (возможно именованный канал или канал электронной почты), через который можно отправить сообщение.Alice composes a message and creates a network stream (perhaps a named pipe or network email) on which to send the message. Затем она шифрует текст с помощью ключа и вектора инициализации и по интрасети пересылает зашифрованное сообщение и вектор инициализации Виктору.Next, she encrypts the text using the key and IV, and sends the encrypted message and IV to Bob over the intranet. Виктор принимает зашифрованный текст и осуществляет расшифровку, используя ранее согласованные ключ и вектор инициализации.Bob receives the encrypted text and decrypts it by using the IV and previously agreed upon key. Если происходит перехват передаваемых данных, злоумышленник не может восстановить исходное сообщение, так как ему не известен ключ.If the transmission is intercepted, the interceptor cannot recover the original message, because he does not know the key. В этой ситуации в секрете должен сохраняться только ключ.In this scenario, only the key must remain secret. В более реалистичном случае либо Анна, либо Виктор создает закрытый ключ и использует шифрование с открытым ключом (асимметричное) для передачи другой стороне закрытого (симметричного) ключа.In a real world scenario, either Alice or Bob generates a secret key and uses public-key (asymmetric) encryption to transfer the secret (symmetric) key to the other party. Подробнее о шифровании с открытым ключом читайте в следующем разделе.For more information about public-key encryption, see the next section.

Платформа .NET Framework предоставляет следующие классы, которые реализуют алгоритмы шифрования с закрытым ключом:The .NET Framework provides the following classes that implement secret-key encryption algorithms:

К началуBack to top

Шифрование с открытым ключомPublic-Key Encryption

При шифровании с открытым ключом используются закрытый ключ, который должен храниться в секрете от неправомочных пользователей, а также открытый ключ, который может предоставляться кому угодно.Public-key encryption uses a private key that must be kept secret from unauthorized users and a public key that can be made public to anyone. Открытый и закрытый ключи математически взаимосвязаны. Данные, зашифрованные с помощью открытого ключа, можно расшифровать исключительно с помощью соответствующего закрытого ключа, а цифровая подпись данных, подписанных с помощью закрытого ключа, может быть проверена только с помощью соответствующего открытого ключа.The public key and the private key are mathematically linked; data that is encrypted with the public key can be decrypted only with the private key, and data that is signed with the private key can be verified only with the public key. Открытый ключ можно предоставить любому лицу; он используется для шифрования данных, которые должны быть отправлены хранителю закрытого ключа.The public key can be made available to anyone; it is used for encrypting data to be sent to the keeper of the private key. Алгоритмы шифрования с открытым ключом также известны как асимметричные алгоритмы, потому что для шифрования данных требуется один ключ, а для расшифровки — другой.Public-key cryptographic algorithms are also known as asymmetric algorithms because one key is required to encrypt data, and another key is required to decrypt data. Основное правило шифрования запрещает повторное использование ключа; оба ключа в каждом сеансе шифрования должны быть уникальными.A basic cryptographic rule prohibits key reuse, and both keys should be unique for each communication session. Однако на практике асимметричные ключи обычно используются подолгу.However, in practice, asymmetric keys are generally long-lived.

Две стороны (Анна и Виктор) могут использовать шифрование с открытым ключом следующим образом: Во-первых Анна создает пару открытого и закрытого ключей.Two parties (Alice and Bob) might use public-key encryption as follows: First, Alice generates a public/private key pair. Если Виктор хочет послать Анне зашифрованное сообщение, он запрашивает у нее ее открытый ключ.If Bob wants to send Alice an encrypted message, he asks her for her public key. Анна высылает Виктору свой открытый ключ через незащищенную сеть, и Виктор использует полученный ключ для шифрования своего сообщения.Alice sends Bob her public key over a nonsecure network, and Bob uses this key to encrypt a message. Виктор пересылает зашифрованное сообщение Анне, а она расшифровывает его с помощью своего закрытого ключа.Bob sends the encrypted message to Alice, and she decrypts it by using her private key. Если Виктор получил ключ Анны по незащищенному каналу, например через открытую сеть, он оказывается уязвимым для атак типа «злоумышленник в середине».If Bob received Alice's key over a nonsecure channel, such as a public network, Bob is open to a man-in-the-middle attack. Поэтому Виктору необходимо убедиться в том, что Анна имеет правильную копию открытого ключа.Therefore, Bob must verify with Alice that he has a correct copy of her public key.

Во время передачи Виктору открытого ключа Анны может произойти несанкционированный перехват ключа третьим лицом.During the transmission of Alice's public key, an unauthorized agent might intercept the key. Более того, возможна ситуация, что то же самое лицо перехватит зашифрованное сообщение Виктора.Furthermore, the same agent might intercept the encrypted message from Bob. Тем не менее неправомочная сторона не может расшифровать сообщение с помощью открытого ключа.However, the agent cannot decrypt the message with the public key. Сообщение можно расшифровать только с помощью закрытого ключа Анны, который не передавался через какие-либо системы связи.The message can be decrypted only with Alice's private key, which has not been transmitted. Анна не использует свой закрытый ключ для шифрования ответного сообщения Виктору, потому что любое лицо может расшифровать это сообщение с помощью открытого ключа.Alice does not use her private key to encrypt a reply message to Bob, because anyone with the public key could decrypt the message. Если Анна желает послать Виктору ответное сообщение, она запрашивает у Виктора его открытый ключ и шифрует свое сообщение, используя его.If Alice wants to send a message back to Bob, she asks Bob for his public key and encrypts her message using that public key. Затем Виктор расшифровывает сообщение с помощью своего соответствующего закрытого ключа.Bob then decrypts the message using his associated private key.

В этом случае Анна и Виктор используют шифрование с открытым ключом (асимметричное) для передачи закрытого (симметричного) ключа, а затем пользуются шифрованием с этим закрытым ключом в течение сеанса связи.In this scenario, Alice and Bob use public-key (asymmetric) encryption to transfer a secret (symmetric) key and use secret-key encryption for the remainder of their session.

В списке ниже сравниваются алгоритмы шифрования с открытым и закрытым ключом.The following list offers comparisons between public-key and secret-key cryptographic algorithms:

  • Алгоритмы шифрования с открытым ключом используют буфер фиксированного размера, в то время как алгоритмы шифрования с закрытым ключом могут использовать буфер переменного размера.Public-key cryptographic algorithms use a fixed buffer size, whereas secret-key cryptographic algorithms use a variable-length buffer.

  • Алгоритмы шифрования с открытым ключом нельзя использовать для сцепления блоков данных в потоки тем же образом, как в алгоритмах шифрования с закрытым ключом, потому что можно шифровать только маленькие порции данных.Public-key algorithms cannot be used to chain data together into streams the way secret-key algorithms can, because only small amounts of data can be encrypted. Поэтому асимметричные операции не используют такую же потоковую модель, как симметричные операции.Therefore, asymmetric operations do not use the same streaming model as symmetric operations.

  • Шифрование с открытым ключом имеет намного большее пространство ключей (диапазон возможных значений ключа), чем шифрование с закрытым ключом.Public-key encryption has a much larger keyspace (range of possible values for the key) than secret-key encryption. Поэтому такое шифрование менее уязвимо к атакам полного перебора, когда проверяются все возможные значения ключа.Therefore, public-key encryption is less susceptible to exhaustive attacks that try every possible key.

  • Открытые ключи можно легко распространять, так как они не требуют особой защиты при условии, что существует некий способ установления подлинности источника.Public keys are easy to distribute because they do not have to be secured, provided that some way exists to verify the identity of the sender.

  • Некоторые алгоритмы шифрования с открытым ключом (такие как RSA и DSA, но не Диффи-Хелмана) можно использовать для создания цифровых подписей, служащих для подтверждения подлинности лица, от которого исходят данные.Some public-key algorithms (such as RSA and DSA, but not Diffie-Hellman) can be used to create digital signatures to verify the identity of the sender of data.

  • Алгоритмы шифрования с открытым ключом являются весьма медленными по сравнению с алгоритмами шифрования с закрытым ключом и не предназначены для шифрования больших объемов данных.Public-key algorithms are very slow compared with secret-key algorithms, and are not designed to encrypt large amounts of data. Использование шифрования с открытым ключом имеет смысл только при передаче очень малых массивов данных.Public-key algorithms are useful only for transferring very small amounts of data. Обычно шифрование с открытым ключом применяется для того, чтобы зашифровать ключ и вектор инициализации, которые будут использоваться при шифровании с закрытым ключом.Typically, public-key encryption is used to encrypt a key and IV to be used by a secret-key algorithm. После передачи ключа и вектора инициализации используется уже шифрование с закрытым ключом.After the key and IV are transferred, secret-key encryption is used for the remainder of the session.

Платформа .NET Framework предоставляет следующие классы, которые реализуют алгоритмы шифрования с открытым ключом:The .NET Framework provides the following classes that implement public-key encryption algorithms:

RSA допускает как шифрование, так и подписывание, в то время как DSA может использоваться только для подписывания, а алгоритм Диффи-Хелмана — только для создания ключей.RSA allows both encryption and signing, but DSA can be used only for signing, and Diffie-Hellman can be used only for key generation. В целом, алгоритмы с открытым ключом имеют более ограниченную сферу применения, чем алгоритмы с закрытым ключом.In general, public-key algorithms are more limited in their uses than private-key algorithms.

К началуBack to top

цифровые подписиDigital Signatures

Алгоритмы шифрования с открытым ключом также можно использовать для создания цифровых подписей.Public-key algorithms can also be used to form digital signatures. Цифровые подписи удостоверяют подлинность источника данных (если вы доверяете открытому ключу источника) и защищают целостность данных.Digital signatures authenticate the identity of a sender (if you trust the sender's public key) and help protect the integrity of data. С помощью открытого ключа, созданного Анной, получатель отправленных ею данных может проверить, что их источником действительно является Анна, сравнив цифровую подпись полученных данных с открытым ключом Анны.Using a public key generated by Alice, the recipient of Alice's data can verify that Alice sent it by comparing the digital signature to Alice's data and Alice's public key.

Чтобы использовать шифрование с открытым ключом для создания цифровой подписи сообщения, Анна сначала применяет к этому сообщению хэш-алгоритм, который создает хэш сообщения.To use public-key cryptography to digitally sign a message, Alice first applies a hash algorithm to the message to create a message digest. Хэш сообщения является компактным и уникальным представлением данных.The message digest is a compact and unique representation of data. Для создания своей личной цифровой подписи Анна шифрует хэш сообщения с помощью своего закрытого ключа.Alice then encrypts the message digest with her private key to create her personal signature. При получении сообщения и цифровой подписи Виктор расшифровывает подпись с помощью открытого ключа Анны, восстанавливая хэш сообщения, а затем хэширует сообщение с помощью того же алгоритма, который использовала Анна.Upon receiving the message and signature, Bob decrypts the signature using Alice's public key to recover the message digest and hashes the message using the same hash algorithm that Alice used. Если вычисленный Виктором хэш в точности совпадает с хэшем, полученным от Анны, Виктор может быть уверен в том, что сообщение пришло действительно от владельца закрытого ключа и что данные в нем не были изменены.If the message digest that Bob computes exactly matches the message digest received from Alice, Bob is assured that the message came from the possessor of the private key and that the data has not been modified. Если Виктор уверен, что именно Анна владеет закрытым ключом, он удостоверяется в том, что сообщение пришло от нее.If Bob trusts that Alice is the possessor of the private key, he knows that the message came from Alice.

Примечание

Цифровая подпись может быть проверена любым лицом, потому что открытый ключ отправителя является общедоступным и обычно включается в формат цифровой подписи.A signature can be verified by anyone because the sender's public key is common knowledge and is typically included in the digital signature format. Рассматриваемый метод не обеспечивает секретности сообщения; для обеспечения секретности его следует еще и зашифровать.This method does not retain the secrecy of the message; for the message to be secret, it must also be encrypted.

Платформа .NET Framework предоставляет следующие классы, реализующие алгоритмы создания цифровой подписи:The .NET Framework provides the following classes that implement digital signature algorithms:

К началуBack to top

Хэш-значенияHash Values

Хэш-алгоритмы преобразуют двоичные последовательности произвольной длины в двоичные последовательности фиксированного меньшего размера, известные как хэш-значения.Hash algorithms map binary values of an arbitrary length to smaller binary values of a fixed length, known as hash values. Хэш-значение является числовым представлением порции данных.A hash value is a numerical representation of a piece of data. Если в хэшированном абзаце текста изменяется хотя бы одна буква, результат хэширования также меняется.If you hash a paragraph of plaintext and change even one letter of the paragraph, a subsequent hash will produce a different value. Если хэш является криптостойким, его значение значительно изменится.If the hash is cryptographically strong, its value will change significantly. Например, если изменяется один бит сообщения, результат выполнения криптостойкой хэш-функции может отличаться на 50 %.For example, if a single bit of a message is changed, a strong hash function may produce an output that differs by 50 percent. Несколько входных значений могут преобразовываться в один хэш-код.Many input values may hash to the same output value. Однако в вычислительном плане немыслимо найти два разных входных набора данных, результаты хэширования которых полностью совпадают.However, it is computationally infeasible to find two distinct inputs that hash to the same value.

Две стороны (Анна и Виктор) могут использовать хэш-функцию для проверки целостности сообщений.Two parties (Alice and Bob) could use a hash function to ensure message integrity. Им нужно выбрать хэш-алгоритм для подписывания сообщений.They would select a hash algorithm to sign their messages. Анна будет писать сообщение, а затем создавать его хэш с помощью выбранного алгоритма.Alice would write a message, and then create a hash of that message by using the selected algorithm. Затем стороны могут применять один из указанных ниже вариантов дальнейших действий.They would then follow one of the following methods:

  • Анна отправляет Виктору сообщение с открытым текстом и хэш сообщения (цифровую подпись).Alice sends the plaintext message and the hashed message (digital signature) to Bob. Виктор получает сообщение, применяет к нему хэш-алгоритм и сравнивает свое значение хэша со значением, полученным от Анны.Bob receives and hashes the message and compares his hash value to the hash value that he received from Alice. Если хэш-значения совпадают, значит, данные не изменялись.If the hash values are identical, the message was not altered. Если хэш-значения не совпадают, значит, данные изменялись после создания.If the values are not identical, the message was altered after Alice wrote it.

    К сожалению, этот способ не позволяет установить подлинность отправителя.Unfortunately, this method does not establish the authenticity of the sender. Любой человек может выдавать себя за Анну и отправлять сообщения Виктору.Anyone can impersonate Alice and send a message to Bob. Для этого достаточно подписывать сообщения с помощью такого же хэш-алгоритма, и Виктор сможет лишь проверить, соответствует ли сообщение подписи.They can use the same hash algorithm to sign their message, and all Bob can determine is that the message matches its signature. Это одна из форм атаки «злоумышленник в середине».This is one form of a man-in-the-middle attack. Дополнительные сведения см. в разделе пример защищенного обмена данными криптографии следующего поколения (CNG).For more information, see Cryptography Next Generation (CNG) Secure Communication Example.

  • Анна отправляет Виктору сообщение с открытым текстом по незащищенному открытому каналу.Alice sends the plaintext message to Bob over a nonsecure public channel. По защищенному закрытому каналу она оправляет Виктору хэш сообщения.She sends the hashed message to Bob over a secure private channel. Виктор получает сообщение с открытым текстом, хэширует его и сравнивает хэш со значением, полученным по закрытому каналу.Bob receives the plaintext message, hashes it, and compares the hash to the privately exchanged hash. Если хэши совпадают, Виктор может сделать два вывода:If the hashes match, Bob knows two things:

    • сообщение не было изменено;The message was not altered.

    • отправитель сообщения подлинный (Анна).The sender of the message (Alice) is authentic.

    Для того чтобы такая система работала, Анна должна скрывать оригинальное хэш-значение от всех, кроме Виктора.For this system to work, Alice must hide her original hash value from all parties except Bob.

  • Анна по незащищенному открытому каналу отправляет Виктору сообщение в виде открытого текста, а хэш сообщения помещает на свой общедоступный веб-сайт.Alice sends the plaintext message to Bob over a nonsecure public channel and places the hashed message on her publicly viewable Web site.

    Такой подход позволяет защититься от изменения хэша третьей стороной.This method prevents message tampering by preventing anyone from modifying the hash value. Хотя сообщение и его хэш могут видеть все, изменить хэш может только Анна.Although the message and its hash can be read by anyone, the hash value can be changed only by Alice. Злоумышленнику, который хочет выдать себя за Анну, потребуется доступ к её веб-сайту.An attacker who wants to impersonate Alice would require access to Alice's Web site.

Ни один из описанных выше способов не защищает Анну от чтения ее сообщений третьими лицами, так как сообщения передаются в виде открытого текста.None of the previous methods will prevent someone from reading Alice's messages, because they are transmitted in plaintext. Для обеспечения полной защиты обычно требуется использовать цифровые подписи и шифрование.Full security typically requires digital signatures (message signing) and encryption.

Платформа .NET Framework предоставляет следующие классы, реализующие алгоритмы хэширования:The .NET Framework provides the following classes that implement hashing algorithms:

Примечание

Недостатки алгоритма MD5 были выявлены еще в 1996 году, и вместо него был рекомендован алгоритм SHA-1.MD5 design flaws were discovered in 1996, and SHA-1 was recommended instead. В 2004 году были обнаружены дополнительные уязвимости, и в настоящее время алгоритм MD5 уже не считается безопасным.In 2004, additional flaws were discovered, and the MD5 algorithm is no longer considered secure. Алгоритм SHA-1 также был признан ненадежным, и вместо него рекомендуется использовать SHA-2.The SHA-1 algorithm has also been found to be insecure, and SHA-2 is now recommended instead.

К началуBack to top

генерация случайных чиселRandom Number Generation

Генерация случайных чисел является неотъемлемой частью многих криптографических операций.Random number generation is integral to many cryptographic operations. Например, криптографические ключи должны выбираться настолько случайно, насколько это возможно, чтобы было фактически невозможно воспроизвести их значения.For example, cryptographic keys need to be as random as possible so that it is infeasible to reproduce them. Криптографические генераторы случайных чисел должны генерировать результат, который нельзя предсказать вычислительными методами с вероятностью хотя бы 50 %.Cryptographic random number generators must generate output that is computationally infeasible to predict with a probability that is better than one half. Поэтому все методы предсказания очередного случайного бита не должны быть точнее, чем простое угадывание.Therefore, any method of predicting the next output bit must not perform better than random guessing. Классы в .NET Framework используют генераторы случайных чисел для создания криптографических ключей.The classes in the .NET Framework use random number generators to generate cryptographic keys.

Класс RNGCryptoServiceProvider является реализацией алгоритма генерации случайных чисел.The RNGCryptoServiceProvider class is an implementation of a random number generator algorithm.

К началуBack to top

Манифесты ClickOnceClickOnce Manifests

В .NET Framework 3.5, перечисленные ниже криптографические классы позволяют проверки и получения сведений о подписях манифестов для приложений, развернутых с помощью технологии ClickOnce:In the .NET Framework 3.5, the following cryptography classes let you obtain and verify information about manifest signatures for applications that are deployed using ClickOnce technology:

Кроме того, перечисленные ниже классы предоставляют сведения о конкретных подписях.In addition, the following classes provide specific signature information:

К началуBack to top

Поддержка пакета Suite BSuite B Support

.NET Framework 3.5 поддерживает набора Suite B алгоритмов шифрования, опубликованных агентством национальной безопасности (NSA).The .NET Framework 3.5 supports the Suite B set of cryptographic algorithms published by the National Security Agency (NSA). Дополнительные сведения о шифровании по стандарту Suite B см. в документе NSA Suite B Cryptography Fact Sheet.For more information about Suite B, see the NSA Suite B Cryptography Fact Sheet.

В набор входят перечисленные ниже алгоритмы.The following algorithms are included:

  • Алгоритм AES с размером ключа для шифрования 128, 192 и 256 битов.Advanced Encryption Standard (AES) algorithm with key sizes of 128, 192, , and 256 bits for encryption.

  • Алгоритмы SHA-1, SHA-256, SHA-384 и SHA-512 для хеширования.Secure Hash Algorithms SHA-1, SHA-256, SHA-384, and SHA-512 for hashing. (Последние три обычно объединяются и известны как SHA-2.)(The last three are generally grouped together and referred to as SHA-2.)

  • Алгоритм цифровой подписи ECDSA, использующий кривые в 256, 384 и 521 бит для подписи.Elliptic Curve Digital Signature Algorithm (ECDSA), using curves of 256-bit, 384-bit, and 521-bit prime moduli for signing. В документации NSA приводится определение этих кривых, которые называются в ней P-256, P-384 и P-521.The NSA documentation specifically defines these curves, and calls them P-256, P-384, and P-521. Этот алгоритм предоставляется в классе ECDsaCng .This algorithm is provided by the ECDsaCng class. Он позволяет подписывать данные закрытым ключом и проверять подпись открытым ключом.It enables you to sign with a private key and verify the signature with a public key.

  • Алгоритм ECDH, использующий кривые в 256, 384 и 521 бит для обмена ключами и секретного соглашения.Elliptic Curve Diffie-Hellman (ECDH) algorithm, using curves of 256-bit, 384-bit, and 521-bit prime moduli for the key exchange and secret agreement. Этот алгоритм предоставляется в классе ECDiffieHellmanCng .This algorithm is provided by the ECDiffieHellmanCng class.

Оболочки управляемого кода для сертифицированных Федеральным стандартом обработки информации (FIPS) реализаций AES, SHA-256, SHA-384 и SHA-512 доступны в новых классах AesCryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProviderи SHA512CryptoServiceProvider .Managed code wrappers for the Federal Information Processing Standard (FIPS) certified implementations of the AES, SHA-256, SHA-384, and SHA-512 implementations are available in the new AesCryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProvider, and SHA512CryptoServiceProvider classes.

К началуBack to top

Классы криптографии следующего поколения (CNG)Cryptography Next Generation (CNG) Classes

Классы криптографии следующего поколения (CNG) предоставляют управляемую оболочку для собственных функций CNG.The Cryptography Next Generation (CNG) classes provide a managed wrapper around the native CNG functions. (CNG является заменой CryptoAPI.) В имена этих классов входит подстрока Cng.(CNG is the replacement for CryptoAPI.) These classes have "Cng" as part of their names. Центральным в группе классов оболочек CNG является класс контейнера ключей CngKey , который абстрагирует хранение и использование ключей CNG.Central to the CNG wrapper classes is the CngKey key container class, which abstracts the storage and use of CNG keys. Этот класс позволяет безопасно хранить пару ключей или открытый ключ и ссылаться на него, используя простое строковое имя.This class lets you store a key pair or a public key securely and refer to it by using a simple string name. Класс цифровых подписей ECDsaCng и класс шифрования ECDiffieHellmanCng на основе эллиптических кривых используют объекты CngKey .The elliptic curve-based ECDsaCng signature class and the ECDiffieHellmanCng encryption class can use CngKey objects.

Класс CngKey используется для множества дополнительных операций, включая открытие, создание, удаление и экспорт ключей.The CngKey class is used for a variety of additional operations, including opening, creating, deleting, and exporting keys. Он также предоставляет доступ к базовому дескриптору ключа, используемому при непосредственном вызове собственных функций.It also provides access to the underlying key handle to use when calling native functions directly.

.NET Framework 3.5 также включает множество вспомогательных классов CNG, например следующие:The .NET Framework 3.5 also includes a variety of supporting CNG classes, such as the following:

  • CngProvider поддерживает поставщика хранилища ключей.CngProvider maintains a key storage provider.

  • CngAlgorithm поддерживает алгоритм CNG.CngAlgorithm maintains a CNG algorithm.

  • CngProperty поддерживает часто используемые свойства ключей.CngProperty maintains frequently used key properties.

К началуBack to top

ЗаголовокTitle ОписаниеDescription
Модель криптографииCryptography Model Описывается реализация криптографических функций в библиотеке базовых классов.Describes how cryptography is implemented in the base class library.
Пошаговое руководство: Создание криптографического приложенияWalkthrough: Creating a Cryptographic Application Демонстрируется решение основных задач шифрования и расшифровки.Demonstrates basic encryption and decryption tasks.
Настройка криптографических классовConfiguring Cryptography Classes Описываются способы сопоставления названий алгоритмов с криптографическими классами и сопоставления идентификаторов объектов с криптографическим алгоритмом.Describes how to map algorithm names to cryptographic classes and map object identifiers to a cryptographic algorithm.