Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline code8525  
#1 Оставлено : 2 июня 2021 г. 12:33:58(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Добрый день,

есть код на JS, как сделать тоже самое на Net? или через командную строку csptest

Цитата:

var oHashedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.HashedData");
yield oHashedData.propset_Algorithm(101); //CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256
yield oHashedData.SetHashValue("E0438626A6EBA03330B01A85571CA69E3B019A4E801374D6B04089C2A105DB2F");
var oRawSignature = yield cadesplugin.CreateObjectAsync("CAdESCOM.RawSignature");
var sSignedMessage = yield oRawSignature.SignHash(oHashedData, oCertificate);


на выходе строка 128 символов

Отредактировано пользователем 2 июня 2021 г. 12:37:14(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#2 Оставлено : 2 июня 2021 г. 18:20:32(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
Добрый день!
.Net:
Код:
            byte[] data = File.ReadAllBytes(fileName);
            
            // Создаем объект для хэширования.
            Gost3411_2012_256CryptoServiceProvider gost3411 = new Gost3411_2012_256CryptoServiceProvider();
            // Вычисляем хэш от всех прочитанных данных.
            byte[] hashValue = gost3411.ComputeHash(data);
            gost3411.Clear();

            X509Certificate2 signerCert = GetSignerCert("test2012");
            Console.WriteLine("Сертификат: {0}",signerCert.Subject);
            // первый способ
            Gost2012_256SignatureFormatter gost = new Gost2012_256SignatureFormatter();
            gost.SetKey(signerCert.PrivateKey);
            byte[] sign = gost.CreateSignature(hashValue);

            File.WriteAllBytes(sigFileName1,sign.Reverse().ToArray());

            // второй способ
            Gost3410_2012_256CryptoServiceProvider cert_key = signerCert.PrivateKey as Gost3410_2012_256CryptoServiceProvider;
            sign = cert_key.CreateSignature(hashValue);
            File.WriteAllBytes(sigFileName2, sign);

пойбайтово надо переворачивать (.Reverse().ToArray()) для совместимости с CSP.

Отредактировано пользователем 2 июня 2021 г. 18:28:51(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
code8525 оставлено 02.07.2021(UTC)
Offline code8525  
#3 Оставлено : 2 июля 2021 г. 16:36:04(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Автор: Санчир Момолдаев Перейти к цитате
Добрый день!
.Net:
пойбайтово надо переворачивать (.Reverse().ToArray()) для совместимости с CSP.


Спасибо! Получилось только hash читал по другому

Код:

          byte[] hashValue = Enumerable.Range(0, hash.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hash.Substring(x, 2), 16))
                             .ToArray();


А можете ещё сориентировать, как добавить атрибут к подписи? Код на JS

Код:
        var oHashedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');
        yield oHashedData.propset_DataEncoding(1); //CADESCOM_CONTENT_ENCODING_TYPE.​BASE64_TO_BINARY
        yield oHashedData.propset_Algorithm(101); //CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256
        yield oHashedData.SetHashValue(sHashValue);

        var oSigningTimeAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
        yield oSigningTimeAttr.propset_Name(0);
        yield oSigningTimeAttr.propset_Value(ConvertDate(new Date()));

        var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
        yield oSigner.propset_Certificate(oCertificate);
        yield oSigner.propset_CheckCertificate(true);
        yield oSigner.propset_Options(1); //CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN 
        var oAuthAttrs = yield oSigner.AuthenticatedAttributes2;
        yield oAuthAttrs.Add(oSigningTimeAttr);

        var oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
        var sSignedMessage = yield oSignedData.SignHash(oHashedData, oSigner, 1);

Offline Санчир Момолдаев  
#4 Оставлено : 4 июля 2021 г. 6:55:07(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
вы какую подпись хотите получить?
в raw подписи нет аттрибутов.
и какой аттрибут хотите добавить.

зачем такая операция с hashValue? какая длина получилась?
Техническую поддержку оказываем тут
Наша база знаний
Offline code8525  
#5 Оставлено : 4 июля 2021 г. 7:51:36(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Автор: Санчир Момолдаев Перейти к цитате
вы какую подпись хотите получить?
в raw подписи нет аттрибутов.

Обычную открепленную подпись

Автор: Санчир Момолдаев Перейти к цитате
и какой аттрибут хотите добавить.

CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0



Код:

        public static string SignData(string hash, string inn)
        {

            byte[] hashValue = Enumerable.Range(0, hash.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hash.Substring(x, 2), 16))
                             .ToArray();

            X509Certificate2 signerCert = GetSignerCert(inn);

            Gost3410_2012_256 privateKey = signerCert.PrivateKey as Gost3410_2012_256;

            ContentInfo contentInfo = new ContentInfo(hashValue);
            SignedCms signedCms = new SignedCms(contentInfo, true);
            CmsSigner cmsSigner = new CmsSigner(SubjectIdentifierType.Unknown, signerCert);

            cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));
            cmsSigner.IncludeOption = X509IncludeOption.WholeChain;
            signedCms.ComputeSignature(cmsSigner);
            byte[] sign = signedCms.Encode();

            string hex = BitConverter.ToString(sign).Replace("-", string.Empty);

            return hex;

        }


Правильно я нагуглил?
Offline Санчир Момолдаев  
#6 Оставлено : 4 июля 2021 г. 8:16:51(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
на windows данный аттрибут добавляется автоматически начиная с csp4.0
Техническую поддержку оказываем тут
Наша база знаний
Offline code8525  
#7 Оставлено : 5 июля 2021 г. 15:20:50(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Автор: Санчир Момолдаев Перейти к цитате
на windows данный аттрибут добавляется автоматически начиная с csp4.0


вы можете мне весь код перевести на Net ?

Код:
        
        var oHashedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');
        yield oHashedData.propset_DataEncoding(1); //CADESCOM_CONTENT_ENCODING_TYPE.​BASE64_TO_BINARY
        yield oHashedData.propset_Algorithm(101); //CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256
        yield oHashedData.SetHashValue(sHashValue);

        var oSigningTimeAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
        yield oSigningTimeAttr.propset_Name(0);//CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME 
        yield oSigningTimeAttr.propset_Value(ConvertDate(new Date()));

        var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
        yield oSigner.propset_Certificate(oCertificate);
        yield oSigner.propset_CheckCertificate(true);
        yield oSigner.propset_Options(1); //CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN 
        var oAuthAttrs = yield oSigner.AuthenticatedAttributes2;
        yield oAuthAttrs.Add(oSigningTimeAttr);

        var oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
        var sSignedMessage = yield oSignedData.SignHash(oHashedData, oSigner, 1);
Offline Санчир Момолдаев  
#8 Оставлено : 5 июля 2021 г. 22:19:04(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
какая конечная цель?
подпись по хэшу нет в SignedCMS
С# на Windows можно использовать Com интерфейс CadesCom так что код будет идентичен
Техническую поддержку оказываем тут
Наша база знаний
Offline code8525  
#9 Оставлено : 6 июля 2021 г. 5:32:08(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Автор: Санчир Момолдаев Перейти к цитате
какая конечная цель?
подпись по хэшу нет в SignedCMS
С# на Windows можно использовать Com интерфейс CadesCom так что код будет идентичен


мне нужно подписать строку
Offline Санчир Момолдаев  
#10 Оставлено : 6 июля 2021 г. 7:10:30(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
тогда думаю подойдет обычная подпись через SignedCms
Код:
ContentInfo contentInfo = new ContentInfo(dataToSign);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(certificate);
signedCms.ComputeSignature(cmsSigner);
Byte[] signatureResult = signedCms.Encode();
Техническую поддержку оказываем тут
Наша база знаний
Offline code8525  
#11 Оставлено : 8 июля 2021 г. 15:40:19(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Автор: Санчир Момолдаев Перейти к цитате
тогда думаю подойдет обычная подпись через 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, через JS проходит, видимо дело в преобразованиях

уточню мне нужно подписать сообщение вида:

Цитата:
{"destination":"nmcades","requestid":44,"objid":14,"method":"SetHashValue","params":[{"type":"string","value":"D23B36DE601FEB70D77FEB9D5252CE380C2024A20B47561497E50751547D1705"}]}


поставляю D23B36DE601FEB70D77FEB9D5252CE380C2024A20B47561497E50751547D1705 в функцию JS (указано выше) подпись проходит.
поставляю в функцию Net, через преобразования
Цитата:
byte[] message = Encoding.ASCII.GetBytes(postData.Message);


на выходе делаю преобразования обратное
Convert.ToBase64String(signedCms.Encode()) - подпись не верна!

Отредактировано пользователем 8 июля 2021 г. 15:44:07(UTC)  | Причина: Не указана

Offline Андрей *  
#12 Оставлено : 8 июля 2021 г. 15:55:41(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,577
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1595 раз в 1226 постах
Здравствуйте.
Цитата:

уточню мне нужно подписать сообщение вида:

Цитата:
{"destination":"nmcades","requestid":44,"objid":14,"method":"SetHashValue","params":[{"type":"string","value":"D23B36DE601FEB70D77FEB9D5252CE380C2024A20B47561497E50751547D1705"}]}


поставляю D23B36DE601FEB70D77FEB9D5252CE380C2024A20B47561497E50751547D1705 в функцию JS (указано выше) подпись проходит.


Вы путаете интерфейсы и возможности.

Подписать строку (файл\набор байтов) = внутри класса вычисляется хеш и он подписывается.


В signedCms необходимо передавать исходные байты (сообщение\документ\файл = набор байтов), а не полученный от них хеш (D23B36DE601FEB70D77FEB9D5252CE380C2024A20B47561497E50751547D1705).
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#13 Оставлено : 8 июля 2021 г. 15:58:49(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,577
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1595 раз в 1226 постах
Путь через SetHashValue - позволяет не передавать исходный документ на вход функции подписания (высокоуровневой).
Например, на сервере 10Мб и есть вычисленный хеш - тогда на клиенте через SetHashValue инициализируется он и получаем ЭП, без скачивания 10Мб.
Техническую поддержку оказываем тут
Наша база знаний
Offline code8525  
#14 Оставлено : 8 июля 2021 г. 16:06:48(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
Путь через SetHashValue - позволяет не передавать исходный документ на вход функции подписания (высокоуровневой).
Например, на сервере 10Мб и есть вычисленный хеш - тогда на клиенте через SetHashValue инициализируется он и получаем ЭП, без скачивания 10Мб.


спасибо за ответ, но я просил изначально перевести код JS в код Net.

JS
Цитата:

var oHashedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');
yield oHashedData.propset_DataEncoding(1); //CADESCOM_CONTENT_ENCODING_TYPE.​BASE64_TO_BINARY
yield oHashedData.propset_Algorithm(101); //CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256
yield oHashedData.SetHashValue(sHashValue);

var oSigningTimeAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
yield oSigningTimeAttr.propset_Name(0);//CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
yield oSigningTimeAttr.propset_Value(ConvertDate(new Date()));

var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
yield oSigner.propset_Certificate(oCertificate);
yield oSigner.propset_CheckCertificate(true);
yield oSigner.propset_Options(1); //CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN
var oAuthAttrs = yield oSigner.AuthenticatedAttributes2;
yield oAuthAttrs.Add(oSigningTimeAttr);

var oSignedData = yield cadesplugin.CreateObjectAsync('CAdESCOM.CadesSignedData');
var sSignedMessage = yield oSignedData.SignHash(oHashedData, oSigner, 1);


тут подписывается хеш документа, как мне сделать тоже самое на NET ?
Offline Андрей *  
#15 Оставлено : 8 июля 2021 г. 16:10:09(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,577
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1595 раз в 1226 постах
Автор: code8525 Перейти к цитате


тут подписывается хеш документа, как мне сделать тоже самое на NET ?


Подключить и использовать COM-интерфейс CAdESCOM.dll.


Техническую поддержку оказываем тут
Наша база знаний
Offline code8525  
#16 Оставлено : 8 июля 2021 г. 16:14:50(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
Автор: code8525 Перейти к цитате


тут подписывается хеш документа, как мне сделать тоже самое на NET ?


Подключить и использовать COM-интерфейс CAdESCOM.dll.




Спасибо, понятно.
Offline code8525  
#17 Оставлено : 9 июля 2021 г. 8:02:59(UTC)
code8525

Статус: Участник

Группы: Участники
Зарегистрирован: 11.02.2021(UTC)
Сообщений: 11

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате

Подключить и использовать COM-интерфейс CAdESCOM.dll.


Разобрался как подключить библиотеку, возникла ошибка

Цитата:
System.InvalidCastException
HResult=0x80004002
Сообщение = Интерфейс не поддерживается
Источник = Interop.CAdESCOM
Трассировка стека:
в CAdESCOM.CadesSignedDataClass.SignHash(HashedData Hash, Object Signer, CADESCOM_CADES_TYPE CadesType, CAPICOM_ENCODING_TYPE EncodingType)
в ConsoleApp3.Program.Main(String[] args) в Program.cs:строка 44


Цитата:
var hash = "9CA6371A5F7EE6F76F8A74A305CACC78183402DEA1CDB13868551CA5A707CDF1";

byte[] hashValue = Enumerable.Range(0, hash.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hash.Substring(x, 2), 16))
.ToArray();

HashedData hashedData = new HashedDataClass();
hashedData.Algorithm = CAPICOM_HASH_ALGORITHM.CAPICOM_HASH_ALGORITHM_SHA_256;
hashedData.Hash(hashValue);

AttributeClass attribute = new AttributeClass();
attribute.Name = CAPICOM_ATTRIBUTE.CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
attribute.Value = DateTime.UtcNow;

SignerClass signer = new SignerClass();
signer.Certificate = cert;
signer.Options = CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
signer.AuthenticatedAttributes.Add(attribute);

CadesSignedData cadesSignedData = new CadesSignedDataClass();

var out1 = cadesSignedData.SignHash(
hashedData,
signer,
CADESCOM_CADES_TYPE.CADESCOM_CADES_BES,
CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64
);

Отредактировано пользователем 9 июля 2021 г. 10:16:52(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#18 Оставлено : 14 июля 2021 г. 4:58:01(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 758
Российская Федерация

Сказал(а) «Спасибо»: 68 раз
Поблагодарили: 158 раз в 154 постах
а какая версия библиотеки? установите плагин версии 2.0
Техническую поддержку оказываем тут
Наша база знаний
Offline anton26  
#19 Оставлено : 30 июля 2021 г. 15:31:44(UTC)
anton26

Статус: Участник

Группы: Участники
Зарегистрирован: 30.03.2021(UTC)
Сообщений: 13

Здравствуйте!

Мне необходимо подписывать текстовую строку присоединенной электронной подписью

Не могли бы вы пожалуйста в общих чертах описать последовательность вызова функций для создания присоединенной ЭП?

Правильная (отвечающая требованиям) подпись генерируется с помощью csptest со следующими атрибутами:

Цитата:
csptest -sfsign -sign -in "C:\temp\Test.txt" -out "C:\temp\Out.txt" -my "Значение атрибута CN" -base64 -add


В данный момент получилось сделать следующее:
https://bitbucket.org/pr...gn/src/master/Program.cs

Программа отрабатывает без ошибок, но выводимая подпись в разы короче, чем генерируемая csptest
Offline Андрей *  
#20 Оставлено : 30 июля 2021 г. 16:24:23(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 10,577
Мужчина
Российская Федерация

Сказал «Спасибо»: 388 раз
Поблагодарили: 1595 раз в 1226 постах
Автор: anton26 Перейти к цитате
Здравствуйте!

Мне необходимо подписывать текстовую строку присоединенной электронной подписью

Не могли бы вы пожалуйста в общих чертах описать последовательность вызова функций для создания присоединенной ЭП?

Правильная (отвечающая требованиям) подпись генерируется с помощью csptest со следующими атрибутами:

Цитата:
csptest -sfsign -sign -in "C:\temp\Test.txt" -out "C:\temp\Out.txt" -my "Значение атрибута CN" -base64 -add


В данный момент получилось сделать следующее:
https://bitbucket.org/pr...gn/src/master/Program.cs

Программа отрабатывает без ошибок, но выводимая подпись в разы короче, чем генерируемая csptest



Вы сделали RAW, а необходимо CMS.
Примеры есть в составе КриптоПРО.NET SDK




Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.