Шифрование строковых данных с помощью CAPICOM.EnvelopedData

Шифрование строковых данных. Менеджер криптографии.
Просмотр криптопровайдеров ОС Windows. Инициализация менеджера криптографии.
Шифрование строковых данных с помощью CAPICOM.EncryptedData

Создание тестового сертификата


Для получения необходимых утилит для работы с тестовыми сертификатами необходимо установить Visual Studio Express, ибо других способов получения этих утилит я не нашел. Перечень необходимых утилит:
  • makecert - средство создания сертификатов;
  • cert2spc - средство проверки сертификата издателя программного обеспечения;
  • pvk2pfx - средство создания файлов обмена личной информации.
Создадим самозаверяющий сертификат, который будет использоваться для шифрования, с указанием поддерживаемого криптопровайдера Microsoft Strong Cryptographic Provider с помощью утилиты makecert.exe:

makecert.exe -r -n "cn=1centerprise8.blogspot.com" -sp "Microsoft Strong Cryptographic Provider" -sky exchange -sv C:\test_cert\1centerprise.pvk C:\test_cert\1centerprise.cer

1. Создание самозаверяющего сертификата X.509
Во время создания сертификата утилита makecert.exe запросит ввод пароля на контейнер, который хранит закрытый ключ, в нашем случае, это файл с расширением pvk, вводим и запоминаем. На выходе получим два файла: 1centerprise.pvk и 1centerprise.cer.

С помощью утилиты cert2spc.exe создадим сертификат SPC, который будет содержать сертификат X.509, в нашем случае это 1centerprise.cer:

Cert2Spc.exe C:\test_cert\1centerprise.cer C:\test_cert\1centerprise.spc

2. Создание сертификата SPC на основании X.509
На выходе получим файл  1centerprise.spc. Далее с помощью утилиты pvk2pfx.exe требуется "сшить" вместе открытый ключ (находящийся в файле с расширением cer или spc) и секретный ключ (находящийся в файле с расширением pvk). В результате получается файл обмена личной информации с расширением pfx, содержащий оба ключа:

pvk2pfx.exe -pvk C:\test_cert\1centerprise.pvk -spc C:\test_cert\1centerprise.spc -pfx C:\test_cert\1centerprise.pfx -pi 12345678 -f

3. Создание файла обмена личной информации
Файл 1centerprise.pfx готов и можно приступить к установке сертификата в хранилище. Запускаем двойным кликом файл pfx и с помощью мастера импорта сертификатов производим установку. Жмем далее, далее и сертификат должен импортироваться в хранилище текущего пользователя в раздел Личное.
4. Сертификат, установленный в хранилище сертификатов
На самом деле, если не требуется наличие файла обмена личной информацией, то "вшить" в файл сертификата с открытым ключом секретный ключ  и автоматически установить в хранилище сертификатов можно на этапе создания сертификата, используя утилиту makecert.exe:

makecert.exe -r -pe -n "cn=1centerprise8.blogspot2.com" -sp "Microsoft Strong Cryptographic Provider" -sky exchange -ss My -sr CurrentUser

Параметр -pe помечает секретный ключ как эскпортируемый, это позволит включить секретный ключ в сертификат, параметр -ss задает имя хранилища сертификатов (My - Личное), параметр -sr задает местонахождение хранилища (CurrentUser - Текущий пользователь).

5. Создание сертификата с установкой в хранилище
Полное описание используемых утилит читайте на сайте msdn.microsoft.com

Реализация алгоритма шифрования/дешифрования


Шифровать и дешифровать будем с помощью библиотеки CAPICOM. Эта библиотека содержит объект EnvelopedData, который шифрует/дешифрует некую информацию по аналоги с объектом МенеджерКриптографии платформы 1С, то есть, шифрование выполняется для определенного круга получателей. Только получатели из указанного списка смогут расшифровать данные, используя свои закрытые ключи. Формат зашифрованных данных - PKCS#7.

Функция шифрования:
// Функция выполняет шифрование строковых данных.
//
// Параметры
//  СтроковыеДанные  - Строка - данные для шифрования;
//  Отпечаток  - Строка - отпечаток сертификата;
//
// Возвращаемое значение:
//   Строка   - зашифрованный данные закодированные в Base64.
//
&НаКлиенте
Функция ЗашифроватьСтроку(Знач СтроковыеДанные, Отпечаток)

// Константы.
ECAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM = 0;
CAPICOM_ENCRYPTION_ALGORITHM_RC4 = 1;
CAPICOM_ENCODE_BASE64 = 0;

CAPICOM_CURRENT_USER_STORE = 2;
CAPICOM_MY_STORE = "My";
CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;

// Ищем сертификат в хранилище текущего пользователя в разделе Личное по отпечатку.
Store = Новый COMОбъект("CAPICOM.Store");
Store.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
Сертификат = Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, Отпечаток).Item(1);

// Инициализируем объект EnvelopedData, задач длину ключа, алгоритм и данные для шифрования.
EnvelopedData = Новый COMОбъект("CAPICOM.EnvelopedData");
EnvelopedData.Algorithm.KeyLength = ECAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM;
EnvelopedData.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_RC4;
EnvelopedData.Recipients.Add(Сертификат); // Кто может расшифровать данные.
EnvelopedData.Content = СтроковыеДанные; // нет времени кодировать в UTF-8.

// Шифруем данные.
Возврат EnvelopedData.Encrypt(CAPICOM_ENCODE_BASE64);

КонецФункции // ЗашифроватьСтроку()


Ищется сертификат получателя по отпечатку, которому будет доступно расшифрование, создается объект EnvelopedData, задаются настройки шифрования и вызовом метода Encrypt производится шифрование данных, который возвращаются в кодировке Base64 формата PKCS#7.

Функция расшифрования:
// Функция выполняет расшифровку строковых данных.
//
// Параметры
//  ЗашифрованныеДанные  - Строка - зашифрованный данные закодированные в Base64;
//
// Возвращаемое значение:
//   Строка   - расшифрованные строковые данные.
//
&НаКлиенте
Функция РасшифроватьСтроку(Знач ЗашифрованныеДанные)

// Инициализируем объект EnvelopedData и выполняем дешифрацию.
EnvelopedData = Новый COMОбъект("CAPICOM.EnvelopedData");
EnvelopedData.Decrypt(ЗашифрованныеДанные);

Возврат EnvelopedData.Content;

КонецФункции // РасшифроватьСтроку()


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

Обработку можно скачать по этой ссылке.

6. Пример работы обработки
Как устанавливается библиотека CAPICOM и почему не стоит ею злоупотреблять описано в статье Вычисление хэш-сумм MD, SHA при помощи CAPICOM.

Комментарии