В процессе разработки часто возникает задача обмена зашифрованными данными между 1С и внешними системами (сайтами, мобильными приложениями, государственными сервисами). Одной из наиболее частых ошибок является путаница между понятиями хеширования (например, SHA-256) и шифрования (например, AES-256). Рассмотрим подробнее, как правильно идентифицировать алгоритм и реализовать расшифровку данных в среде 1С.
Прежде чем приступать к написанию кода, проанализируем ситуацию, описанную в обсуждении. Автор изначально искал способ «расшифровать» строку SHA-256. Важно понимать, что SHA-256 (Secure Hash Algorithm 2) — это функция хеширования. Она превращает любой объем данных в уникальную строку фиксированной длины (хеш). Это «дорога в одну сторону»: из хеша невозможно восстановить исходную строку, так как при генерации информация необратимо теряется. Хеширование используется для проверки целостности данных или хранения паролей.
Если же перед нами стоит задача именно расшифровки (получения исходного текста при наличии ключа), то речь идет об алгоритмах симметричного шифрования, таких как AES (Advanced Encryption Standard). В частности, в современных системах часто используется режим AES-256 CBC.
Для успешного восстановления данных нам понадобятся три составляющие:
Поскольку встроенный МенеджерКриптографии в 1С не всегда предоставляет гибкие настройки для режима CBC и специфических дополнений без внешних криптопровайдеров, разберем наиболее надежный способ — использование возможностей .NET через COM-соединение. Этот метод работает на платформе Windows и не требует установки сторонних библиотек.
Рассмотрим пример функции, которая принимает зашифрованные данные, ключ и вектор инициализации:
Функция РасшифроватьAES256(СтрокаBase64, КлючДвоичныеДанные, ВекторИнициализации)
// Подключаем объект для работы с криптографией .NET
Аес = Новый COMОбъект("System.Security.Cryptography.RijndaelManaged");
Аес.KeySize = 256;
Аес.BlockSize = 128;
Аес.Mode = 1; // 1 соответствует режиму CBC
Аес.Padding = 3; // 3 соответствует PKCS7
// Устанавливаем ключ и IV
Аес.Key = КлючДвоичныеДанные.ПолучитьБуфер();
Аес.IV = ВекторИнициализации.ПолучитьБуфер();
// Создаем дешифратор
Дешифратор = Аес.CreateDecryptor();
// Преобразуем входящую строку Base64 в массив байтов
ВходныеБайты = Base64Значение(СтрокаBase64);
// Выполняем преобразование
РезультатБайты = Дешифратор.TransformFinalBlock(ВходныеБайты.ПолучитьБуфер(), 0, ВходныеБайты.Размер());
// Превращаем результат в строку (предполагая кодировку UTF-8)
Возврат ПолучитьСтрокуИзДвоичныхДанных(РезультатБайты, КодировкаТекста.UTF8);
КонецФункции
Выясним еще один эффективный способ, который часто применяют программисты 1С, чтобы избежать регистрации COM-компонент. Это вызов скрипта PowerShell. Данный метод удобен тем, что позволяет выполнить расшифровку одной командой через ЗапуститьПриложение.
Проанализируем алгоритм действий:
System.Security.Cryptography.Aes.Пример командной строки для PowerShell может выглядеть следующим образом:
$aes = [System.Security.Cryptography.Aes]::Create()
$aes.Mode = [System.Security.Cryptography.CipherMode]::CBC
$aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7
$aes.Key = [System.Convert]::FromBase64String("Ваш_Ключ_Base64")
$aes.IV = [System.Convert]::FromBase64String("Ваш_IV_Base64")
$decryptor = $aes.CreateDecryptor()
$allBytes = [System.IO.File]::ReadAllBytes("путь_к_файлу_с_шифром")
$result = $decryptor.TransformFinalBlock($allBytes, 0, $allBytes.Length)
[System.IO.File]::WriteAllBytes("путь_к_результату", $result)
Как было упомянуто в сообщении, ключом часто является «хешированное значение». Посмотрим, как подготовить такой ключ в 1С версии 8.3.10 и выше. Нам нужно получить двоичные данные из строки-ключа с помощью алгоритма SHA-256.
Хеширование = Новый ХешированиеДанных(АлгоритмХеширования.SHA256);
Хеширование.Добавить(КлючеваяСтрока);
КлючДляAES = Хеширование.ХешСумма; // Это и будет массив из 32 байт для AES-256
Разберем ситуацию, когда после расшифровки вместо текста вы видите «кракозябры». Шифрование работает на уровне байтов, а не символов. Поэтому крайне важно:
UTF-8 без метки BOM.ПолучитьСтрокуИзДвоичныхДанных(..., КодировкаТекста.UTF8).Таким образом, для решения задачи автора необходимо отказаться от идеи «дешифровки SHA-256» и реализовать полноценный алгоритм AES-256 CBC, обеспечив корректную передачу 32-байтного ключа (полученного через хеш) и 16-байтного вектора инициализации (IV).