-
Notifications
You must be signed in to change notification settings - Fork 42
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Как расшифровать текст при помощи алгоритма ассиметричного ключа #51
Comments
Здравствуйте! Полагаю, что вам подойдёт этот пример. Основную роль играют |
Я пробовал реализовать этот пример. Дело в том, что я отправляю открытый ключ в Контур, и они возвращают мне строку, которую я должен расшифровать с помощью закрытой части сертификата. var encryptedStr = "здесь_длинная_полученная_строка";
var encryptedBytes = Convert.FromBase64String(encryptedStr);
var encryptedStream = new MemoryStream(encryptedBytes);
var privateKeyAlgorithm = (GostAsymmetricAlgorithm)cert.GetPrivateKeyAlgorithm();
var deformatter = privateKeyAlgorithm.CreateKeyExchangeDeformatter();
using (var receiverSessionKey = deformatter.DecryptKeyExchangeAlgorithm(encryptedBytes))
{
var decryptedString = receiverSessionKey.ToString();
} Но на строке using код падает в ошибки: В чём тут может быть проблема? |
Вам нужно внимательней посмотреть на указанный пример. Метод Помимо зашифрованных данных вы должны как-то получить вектор инициализации и зашифрованный симметричный ключ. На основе ассиметричного алгоритма вы расшифруете симметричный ключ, а потом уже симметричным ключом расшифруете данные. Обычно это делается так. |
Я просто подумал, что есть вариант как-то выдернуть часть реализации расшифровки сообщения. Если я правильно понимаю, то речь идёт о расшифровке сообщения, зашифрованного открытым ключом сертификата. А значит его можно расшифровать закрытым ключом сертификата. |
Да, действительно, RSA имеет методы |
@IverCold Если вопрос решен, предлагаю поделиться решением и закрыть задачу. :) |
@AlexMAS Я лучше приложу инструкцию Контура, которую они мне дали. Нужно получить Access Token. Его можно получить по логину-паролю (как мы делаем сейчас), а можно по сертификату (так должно быть безопаснее). Чтобы получить токен по сертификату расшифровать случайный контент, который присылает Контур. Сам же инструкция вот здесь: |
Ну, я не настолько хорош, чтобы предложить решение в рамках вашей библиотеки = ) |
Спасибо за обратную связь! :) Понятно, то есть вам не удалось выполнить аутентификацию по сертификату. А можете прикрепить файл с base64 этого |
@IverCold Здравствуйте! У вас нет примера |
И снова здравствуйте! Я приношу извинения за пропажу на столь длительный срок. Но порой такова жизнь -_- В прикреплённом архиве открытый сертификат, его 64base версия и то сообщение, которое нужно расшифровать и отправить обратно в Контур. Может быть есть какая-то возможность выделить методы Encrypt()/Decrypt() как в RSA, про что мы говорили выше. |
Здравствуйте! Я попробую повторить то, что есть в RSA. |
В общем, выяснилось следующее. Как я и предполагал, CryptoPro CSP поддерживает шифрование произвольных блоков данных только на симметричных ключах. Подозреваю, что и с VipNet CSP ситуация аналогична, но мне не удалось проверить - нет технической возможности. Кстати, недавно была добавлена поддержка алгоритмов Магма и Кузнечик. Возможно, шифрование вышеуказанных данных было с участием этих новых алгоритмов. Любые попытки использовать асимметричные ключи CryptoPro CSP для шифрования приводят к ошибкам. Криптопровайдер явно говорит: Судя по тому, что мне удалось найти на форумах, есть какие-то серьезные сложности в реализации шифрования произвольных объемов данных с помощью асимметричных алгоритмов ГОСТ. Или сама философия шифрования по ГОСТ этого не предусматривает, не могу сказать. CryptoPro CSP поддерживает только подпись хэшей фиксированных размеров, то есть реализует только возможность цифровой подписи. Что же касается шифрования произвольных объемов данных, то в этом случае используются сессионные симметричные ключи. Алгоритм обмена примерно такой. Отправляющая сторона:
Получающая сторона:
Я посмотрел ваше зашифрованное base64-сообщение. Могу сказать, что это сообщение в каком-то странном и неизвестном мне формате. В бинарном представлении сообщение имеет странноватый размер - 970 байт. Это точно не ASN.1 формат. Самое интересное, что часть данных в этом сообщение представлена в открытом виде. Например, в явном виде представлен email сервиса сертификации. По совокумности данных я бы сказал, что это какой-то кастомный формат сообщения, но это не точно. Возможно, какое-то подобие JWT, раз в контексте документации к сервису речь идет об OpenId Connect. Однако я пересмотрел документацию и не нашел описание формата этого зашифрованного сообщения. Попробуйте связаться с разработчиками или еще с кем-то. Пусть они вам расскажут, как декодировать это сообщение. Сделав это, вы там должны обнаружить зашифрованные данные и зашифрованный симметричный ключ. А далее процесс расшифровки сделать просто. Я думаю, что как-то так должно быть. |
@IverCold Дадите обратную связь, если что-то получится или не получится? ;) |
Да, я как раз сегодня передал информацию нашему "связному" в Контуре. Может быть он сможет прояснить ситуацию. |
Возвращаюсь с результатом. Всё оказалось неожиданно просто. Хватило встроенного класса EnvelopedCms из пространства имён System.Security.Cryptography.Pkcs; public static byte[] Decrypt(byte[] encryptedContent, X509Certificate2 cert)
{
var envelopedCms = new EnvelopedCms();
envelopedCms.Decode(encryptedContent);
envelopedCms.Decrypt(new X509Certificate2Collection(cert));
return envelopedCms.ContentInfo.Content;
} Я даже ради любопытства проверил Encrypt - шифрование и дешифровка сообщения отработали. Интересно просто как это так? Он обращается к криптопровайдеру, определив алгоритм из сертификата? |
Круто! Рад, что у вас всё получилось. Я тогда закрываю эту задачу. Если будут вопросы, обращайтесь.
Тут как раз всё вышло так, как я и предполагал. Я почему-то не подумал про |
Добрый день! Я не смог найти в примерах возможности расшифровки текста ассиметричным ключом. Как это можно сделать?
The text was updated successfully, but these errors were encountered: