Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Разница в подписи через SignedCms и Gost3410_2012_256CryptoServiceProvider
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.05.2021(UTC) Сообщений: 5 Откуда: Москва Сказал(а) «Спасибо»: 2 раз
|
Я перехожу с .net framework на .net core 3.1 и хочу перейти с подписи через SignedCms на подпись через Gost3410_2012_256CryptoServiceProvider:
В .net framework с пользовался SignedCms: ContentInfo contentInfo = new ContentInfo(dataToSign); SignedCms signedCms = new SignedCms(contentInfo, true); CmsSigner cmsSigner = new CmsSigner(certificate); signedCms.ComputeSignature(cmsSigner); Byte[] signatureResult = signedCms.Encode();
В .net core я хочу перейти на Gost3410_2012_256CryptoServiceProvider: var gostSk = certificate.ProviateKey as Gost3410_2012_256CryptoServiceProvider; Byte[] signatureResult = gostSk.SignData(dataToSign, HashAlgorithmName.Gost3411_2012_256);
signatureResult сильно отличаются. Результат подписи строки (поставил * вместо символов для маскировки :) ) «************************************************» Для .net core (в base64): vBRtgmH/QRvlgirghXRWHqB9+r2qwrgGo9XSWRvBELbfNbILWpb0I4sDBJydIvmUNaI8bOErX0dgXuTa4Wamlw== Для .net framework (в base64): MIIVTgYJKoZIhvcNAQcCoIIVPzCCFTsCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCCEW4wggegMIIHTaADAgECAgoXcDh9AAAAAAQFMAoGCCqFAwcBAQMCMIIBJDEeMBwGCSqGSIb3DQEJARYPZGl0QG1pbnN2eWF6LnJ1MQswCQYDVQQGEwJSVTEYMBYGA1UECAwPNzcg0JzQvtGB0LrQstCwMRkwFwYDVQQHDBDQsy4g0JzQvtGB0LrQstCwMS4wLAYDVQQJDCXRg9C70LjRhtCwINCi0LLQtdGA0YHQutCw0Y8sINC00L7QvCA3MSwwKgYDVQQKDCPQnNC40L3QutC
Можете подсказать, что такое добавляет signedCms.Encode(), что результат такой длинный? Как добиться такого же в Gost3410_2012_256CryptoServiceProvider?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Здравствуйте.
signedCms - делает CMS (подпись, сертификат(ы), атрибуты и т.п), а Gost3410_2012_256CryptoServiceProvider - возвращает подпись. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.05.2021(UTC) Сообщений: 5 Откуда: Москва Сказал(а) «Спасибо»: 2 раз
|
Про CMS понял. А есть ли вариант сначала подписать Gost3410_2012_256CryptoServiceProvider, а затем добавить сертификат(ы), атрибуты и т.п., чтобы получить тот же результат? Моя цель - использовать файл pfx, и не использовать хранилище сертификатов windows + ключи на флешке/в реестре.
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,193 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 274 раз в 254 постах
|
Автор: mnsasha Про CMS понял. А есть ли вариант сначала подписать Gost3410_2012_256CryptoServiceProvider, а затем добавить сертификат(ы), атрибуты и т.п., чтобы получить тот же результат? Моя цель - использовать файл pfx, и не использовать хранилище сертификатов windows + ключи на флешке/в реестре. Добрый день! Код: byte[] pfx = File.ReadAllBytes("../../../gost-pass-1.pfx");
X509Certificate2 cert = new X509Certificate2(pfx, "1", X509KeyStorageFlags.CspNoPersistKeySet);
Gost3410_2012_256 privateKey = cert.PrivateKey as Gost3410_2012_256;
byte[] msg = File.ReadAllBytes("../../../data.txt");
bool detached = false;
ContentInfo contentInfo = new ContentInfo(msg);
SignedCms signedCms = new SignedCms(contentInfo, detached);
CmsSigner cmsSigner = new CmsSigner(SubjectIdentifierType.Unknown,cert,privateKey);
cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));
cmsSigner.IncludeOption = X509IncludeOption.WholeChain;
signedCms.ComputeSignature(cmsSigner);
byte[] sign = signedCms.Encode();
File.WriteAllBytes("../../../core_sign.sig", sign);
Console.WriteLine("sign saved: core_sign.sig");
Отредактировано пользователем 16 июня 2021 г. 2:40:28(UTC)
| Причина: Не указана |
|
1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.05.2021(UTC) Сообщений: 5 Откуда: Москва Сказал(а) «Спасибо»: 2 раз
|
Попробовал ваш код. Но тут я столкнулся с тем, что X509KeyStorageFlags.CspNoPersistKeySet определен в библиотеке, которая подключается по инструкции, описанной вот здесь: https://github.com/Crypt...b/master/docs/Windows.mdТ.е. у меня в файле проекте прописан путь: ..\corefx\artifacts\bin\runtime\netcoreapp-Windows_NT-Debug-x64\System.Security.Cryptography.Pkcs.dll При этом типы ContentInfo, SignedCms, CmsSigner в этой библиотеке почему-то найти не удается. Что я не делаю не так? И еще вопрос. Я пробовал брать сертификат из виндовс-хранилища и использовать на .net core 3.1 вот так (этот код работал на .net framework): ContentInfo contentInfo = new ContentInfo(dataToSign); SignedCms signedCms = new SignedCms(contentInfo, true); CmsSigner cmsSigner = new CmsSigner(certificate); signedCms.ComputeSignature(cmsSigner); Byte[] signatureResult = signedCms.Encode(); Я получаю Could not determine signature algorithm for the signer certificate. на строке signedCms.ComputeSignature(cmsSigner); Тут типы ContentInfo, SignedCms, CmsSigner взяты из стандартной библиотеки .nuget\packages\system.security.cryptography.pkcs\5.0.1\ref\netcoreapp3.0\System.Security.Cryptography.Pkcs.dll Крипто про обновлено до версии 5. Вопрос: мне в .net core 3.1 для работы этого примера в любом случае надо следовать инструкции https://github.com/Crypt...b/master/docs/Windows.md ?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,193 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 274 раз в 254 постах
|
использую Rider на Linux я подключаю так: Код:<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>cms_pfx</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.3.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.Algorithms\netcoreapp-Unix-Debug\System.Security.Cryptography.Algorithms.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Csp, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.Csp\netcoreapp-Unix-Debug\System.Security.Cryptography.Csp.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Pkcs, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.Pkcs\netcoreapp-Unix-Debug\System.Security.Cryptography.Pkcs.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.Primitives\netcoreapp-Debug\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\..\..\..\..\opt\dotnet\corefx\artifacts\bin\System.Security.Cryptography.X509Certificates\netcoreapp-Unix-Debug\System.Security.Cryptography.X509Certificates.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="BouncyCastle.NetCore" Version="1.8.8" />
</ItemGroup>
</Project>
сделайте по подобию |
|
1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.05.2021(UTC) Сообщений: 5 Откуда: Москва Сказал(а) «Спасибо»: 2 раз
|
После подключения библиотек следующий код заработал! Спасибо! ContentInfo contentInfo = new ContentInfo(dataToSign); SignedCms signedCms = new SignedCms(contentInfo, true); CmsSigner cmsSigner = new CmsSigner(certificate); signedCms.ComputeSignature(cmsSigner); Byte[] signatureResult = signedCms.Encode(); Буду пробовать использовать сертификат из файла pfx. Отредактировано пользователем 5 июня 2021 г. 23:38:17(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 20.05.2021(UTC) Сообщений: 5 Откуда: Москва Сказал(а) «Спасибо»: 2 раз
|
Код с использованием pfx файла для подписи работает! Спасибо большое за подсказку, выручили!
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро .NET
»
Разница в подписи через SignedCms и Gost3410_2012_256CryptoServiceProvider
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close