C# - Шифрование byte[] сертификатом
Источник
// Зашифровываем сообщение для каждого получателя, // используя соответствующие открытые ключи получателей. // Для зашифрования используем объект класса EnvelopedCms. static byte[] EncryptMsg( Byte[] msg, X509Certificate2Collection recipientCerts) { // Помещаем сообщение в объект ContentInfo // Это требуется для создания объекта EnvelopedCms. ContentInfo contentInfo = new ContentInfo(msg); // Создаем объект EnvelopedCms, передавая ему // только что созданный объект ContentInfo. // Используем идентификацию получателя (SubjectIdentifierType) // по умолчанию (IssuerAndSerialNumber). // Не устанавливаем алгоритм зашифрования тела сообщения: // ContentEncryptionAlgorithm устанавливается в // RSA_DES_EDE3_CBC, несмотря на это, при зашифровании // сообщения в адрес получателя с ГОСТ сертификатом, // будет использован алгоритм GOST 28147-89. EnvelopedCms envelopedCms = new EnvelopedCms(contentInfo); // Создаем объект CmsRecipientCollection, который // идентифицирует получателей зашифрованного сообщения. CmsRecipientCollection recips = new CmsRecipientCollection( SubjectIdentifierType.IssuerAndSerialNumber, recipientCerts); Console.WriteLine( "{0}Зашифровываем данные для нескольких получателей " + "с именами:", Environment.NewLine); foreach (CmsRecipient recip in recips) { Console.WriteLine("\t" + recip.Certificate.SubjectName.Name); } // Зашифровываем сообщение на коллекцию получателей. envelopedCms.Encrypt(recips); Console.WriteLine("Выполнено."); // Закодированное EnvelopedCms сообщение содержит // зашифрованный текст сообщения и информацию // о каждом получателе данного сообщения. return envelopedCms.Encode(); } // Расшифрование закодированного EnvelopedCms сообщения // для одного из получателей. static Byte[] DecryptMsg(byte[] encodedEnvelopedCms) { // Создаем объект для декодирования и расшифрования. EnvelopedCms envelopedCms = new EnvelopedCms(); // Декодируем сообщение. envelopedCms.Decode(encodedEnvelopedCms); // Расшифровываем сообщение. // Сообщение будет расшифровано для того получателя, // чей секретный ключ будет найден первым. // Для расшифрования сообщения на конкретного // получателя можно использовать код подобный следующему: // envelopedCms.Decrypt(envelopedCms.RecipientInfos[0]); // который расшифровывает сообщение для первого // получателя. Console.Write("Расшифрование ... "); envelopedCms.Decrypt(); Console.WriteLine("Выполнено."); // После вызова метода Decrypt в свойстве ContentInfo // содержится расшифрованное сообщение. return envelopedCms.ContentInfo.Content; }
Комментарии