Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
Добрый день! .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)
| Причина: Не указана |
|
 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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);
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
вы какую подпись хотите получить? в raw подписи нет аттрибутов. и какой аттрибут хотите добавить.
зачем такая операция с hashValue? какая длина получилась? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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;
}
Правильно я нагуглил?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
на windows данный аттрибут добавляется автоматически начиная с csp4.0 |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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);
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
какая конечная цель? подпись по хэшу нет в SignedCMS С# на Windows можно использовать Com интерфейс CadesCom так что код будет идентичен |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.02.2021(UTC) Сообщений: 11
Сказал(а) «Спасибо»: 1 раз
|
Автор: Санчир Момолдаев  какая конечная цель? подпись по хэшу нет в SignedCMS С# на Windows можно использовать Com интерфейс CadesCom так что код будет идентичен мне нужно подписать строку
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
тогда думаю подойдет обычная подпись через SignedCms Код:ContentInfo contentInfo = new ContentInfo(dataToSign);
SignedCms signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(certificate);
signedCms.ComputeSignature(cmsSigner);
Byte[] signatureResult = signedCms.Encode();
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 11,142   Сказал «Спасибо»: 425 раз Поблагодарили: 1718 раз в 1324 постах
|
Здравствуйте. Цитата: уточню мне нужно подписать сообщение вида:
Цитата: {"destination":"nmcades","requestid":44,"objid":14,"method":"SetHashValue","params":[{"type":"string","value":"D23B36DE601FEB70D77FEB9D5252CE380C2024A20B47561497E50751547D1705"}]}
поставляю D23B36DE601FEB70D77FEB9D5252CE380C2024A20B47561497E50751547D1705 в функцию JS (указано выше) подпись проходит.
Вы путаете интерфейсы и возможности. Подписать строку (файл\набор байтов) = внутри класса вычисляется хеш и он подписывается. В signedCms необходимо передавать исходные байты (сообщение\документ\файл = набор байтов), а не полученный от них хеш (D23B36DE601FEB70D77FEB9D5252CE380C2024A20B47561497E50751547D1705). |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 11,142   Сказал «Спасибо»: 425 раз Поблагодарили: 1718 раз в 1324 постах
|
Путь через SetHashValue - позволяет не передавать исходный документ на вход функции подписания (высокоуровневой). Например, на сервере 10Мб и есть вычисленный хеш - тогда на клиенте через SetHashValue инициализируется он и получаем ЭП, без скачивания 10Мб. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 11,142   Сказал «Спасибо»: 425 раз Поблагодарили: 1718 раз в 1324 постах
|
Автор: code8525 
тут подписывается хеш документа, как мне сделать тоже самое на NET ? Подключить и использовать COM-интерфейс CAdESCOM.dll. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.02.2021(UTC) Сообщений: 11
Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей *  Автор: code8525 
тут подписывается хеш документа, как мне сделать тоже самое на NET ? Подключить и использовать COM-интерфейс CAdESCOM.dll. Спасибо, понятно.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 889  Сказал(а) «Спасибо»: 74 раз Поблагодарили: 191 раз в 186 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 11,142   Сказал «Спасибо»: 425 раз Поблагодарили: 1718 раз в 1324 постах
|
Автор: 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 |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close