Шифрование строковых данных с помощью CAPICOM.EnvelopedData
Шифрование строковых данных. Менеджер криптографии.
Просмотр криптопровайдеров ОС Windows. Инициализация менеджера криптографии.
Шифрование строковых данных с помощью CAPICOM.EncryptedData
Для получения необходимых утилит для работы с тестовыми сертификатами необходимо установить Visual Studio Express, ибо других способов получения этих утилит я не нашел. Перечень необходимых утилит:
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
Во время создания сертификата утилита 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
На выходе получим файл 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
Файл 1centerprise.pfx готов и можно приступить к установке сертификата в хранилище. Запускаем двойным кликом файл pfx и с помощью мастера импорта сертификатов производим установку. Жмем далее, далее и сертификат должен импортироваться в хранилище текущего пользователя в раздел Личное.
На самом деле, если не требуется наличие файла обмена личной информацией, то "вшить" в файл сертификата с открытым ключом секретный ключ и автоматически установить в хранилище сертификатов можно на этапе создания сертификата, используя утилиту 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 - Текущий пользователь).
Полное описание используемых утилит читайте на сайте msdn.microsoft.com
Шифровать и дешифровать будем с помощью библиотеки CAPICOM. Эта библиотека содержит объект EnvelopedData, который шифрует/дешифрует некую информацию по аналоги с объектом МенеджерКриптографии платформы 1С, то есть, шифрование выполняется для определенного круга получателей. Только получатели из указанного списка смогут расшифровать данные, используя свои закрытые ключи. Формат зашифрованных данных - PKCS#7.
Функция шифрования:
Ищется сертификат получателя по отпечатку, которому будет доступно расшифрование, создается объект EnvelopedData, задаются настройки шифрования и вызовом метода Encrypt производится шифрование данных, который возвращаются в кодировке Base64 формата PKCS#7.
Функция расшифрования:
Создается объект EnvelopedData и вызывается метод Decrypt. Если в хранилище сертификатов не будет установлен сертификат, указанные при шифровании, вызов метода завершится ошибкой, иначе, система запросит пароль к контейнеру закрытого ключа и произведет дешифрацию.
Обработку можно скачать по этой ссылке.
Как устанавливается библиотека CAPICOM и почему не стоит ею злоупотреблять описано в статье Вычисление хэш-сумм MD, SHA при помощи CAPICOM.
Просмотр криптопровайдеров ОС Windows. Инициализация менеджера криптографии.
Шифрование строковых данных с помощью CAPICOM.EncryptedData
Создание тестового сертификата
Для получения необходимых утилит для работы с тестовыми сертификатами необходимо установить Visual Studio Express, ибо других способов получения этих утилит я не нашел. Перечень необходимых утилит:
- makecert - средство создания сертификатов;
- cert2spc - средство проверки сертификата издателя программного обеспечения;
- pvk2pfx - средство создания файлов обмена личной информации.
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 |
С помощью утилиты cert2spc.exe создадим сертификат SPC, который будет содержать сертификат X.509, в нашем случае это 1centerprise.cer:
Cert2Spc.exe C:\test_cert\1centerprise.cer C:\test_cert\1centerprise.spc
![]() |
2. Создание сертификата SPC на основании X.509 |
pvk2pfx.exe -pvk C:\test_cert\1centerprise.pvk -spc C:\test_cert\1centerprise.spc -pfx C:\test_cert\1centerprise.pfx -pi 12345678 -f
![]() |
3. Создание файла обмена личной информации |
![]() |
4. Сертификат, установленный в хранилище сертификатов |
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. Создание сертификата с установкой в хранилище |
Реализация алгоритма шифрования/дешифрования
Шифровать и дешифровать будем с помощью библиотеки 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. Пример работы обработки |
Комментарии
Отправить комментарий