powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Цифровая подпись. Хнык хнык :(
25 сообщений из 79, страница 1 из 4
Цифровая подпись. Хнык хнык :(
    #38773335
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Помогите плиз. Я совсем на нуле по знаниям, насчет различных методов хэширования и цифровой подписи. А стоит задача написать прогу, которая сможет подписать файл по заданному сертификату.

Но первичная задача - это проверить подпись !
Для этого мне предоставили файл с текстом и файл с цифровой подписью.
В системе установлен сертификат, которым создавалась подпись. Имеется файл, который нужно подписать (важна ли кодировка файла ?).

Нашел довольно много ссылок в интернете, но не могу заставить их работать. Голова просто кругом идет. Приватный ключ, Публичный ключ...

Код: c#
1.
2.
3.
4.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSAParameters RSAKeyInfo = new RSAParameters();
RSAKeyInfo.Modulus = m_public.Modulus;
RSAKeyInfo.Exponent = m_public.Exponent;



Просто взрыв мозга ! Подскажите пожалуйста, как же нужно ?

После двух дней гуглинга, написал такой код, который не работает (ну надо же...):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
X509Store certStore = new X509Store(StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);

var signature = File.ReadAllBytes("Test.ecp"); 
var data = File.ReadAllBytes("Test.txt");

var x509 = certStore.Certificates[4];  // Нужный мне сертификат 4ый
         
// Вот тут огромные сомнения... не знаю точно, как нужно !!
var rsa = x509.PublicKey.Key as RSACryptoServiceProvider;     
string sha1Oid = CryptoConfig.MapNameToOID("SHA1");
string md5Oid = CryptoConfig.MapNameToOID("MD5");            

    try
    {
        bool sha1Valid = rsa.VerifyData(data, md5Oid, signature);    // false
    }
    catch (Exception )
    {}

    try
    {
        bool md5Valid = rsa.VerifyHash(data, md5Oid, signature);   // false
    }
    catch (Exception)       
    { }



На очереди попытка написать код, с использованием RSAPKCS1SignatureFormatter...Скорее всего тоже ничего не выйдет (сложно собирать ядерный реактор не зная ядерной физики и не имея схем/инструкций).

Друзья. Помогите плиз.
Наверняка существуют простые функции, которые просто берут набор байтов (или файл на диске), сертификат из хранилища - и на выходе создают подпись (и проверяют ее)...
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773364
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РостигайДля этого мне предоставили файл с текстом и файл с цифровой подписью.
А вам сообщили, с помощью какого алгоритма была создана ЭЦП? И вы уверены, что сертификат, который у вас в системе, точно подходит для проверки подписи?
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773398
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773404
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Я видел как эта строка кодируется сторонней утилитой, так, что знаю каким алгоритмом.

Использовалось:
Криптопровайдер: "Microsoft base Cryptographic Provider v1.0"
Алгоритм: "CALG_SHA (322772)"
Хранилище сертификатов: "My = Личные".

Только не понял, как мне тоже передавать "Microsoft base Cryptographic Provider v1.0".


Я вроде тоже использую SHA:

Код: c#
1.
bool sha1Valid = rsa.VerifyData(data, sha1Oid, signature);    // false



ps. В коде выше оказывается опечатка... Там написано
Код: c#
1.
bool sha1Valid = rsa.VerifyData(data, md5Oid, signature);    // false



Но сейчас заменил на правильную.... Результа все равно false.
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773407
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Извиняюсь. Ваш вопрос поставил меня в тупик.
Что означает "вы уверены, что сертификат, который у вас в системе, точно подходит для проверки подписи" ?

Разве операция проверки подписи по сертификату не с каждым сертификатом работает ?
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773412
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РостигайArm79,

Извиняюсь. Ваш вопрос поставил меня в тупик.
Что означает "вы уверены, что сертификат, который у вас в системе, точно подходит для проверки подписи" ?

Разве операция проверки подписи по сертификату не с каждым сертификатом работает ?
Разумеется, не с каждым. Всегда есть пара ключ/сертификат (грубо). И сертификат от чужого ключа никак не подойдет.
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773424
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Но ведь я же использую сертификат, которым подписывали.
Подписывание производилось на моей машине сторонней утилитиной, сертификатом, который я тоже использую.

Код: c#
1.
var x509 = certStore.Certificates[4];


Я просто под отладчиком в списке его нашел по имени. Над юзабельностью буду думать потом, сейчас нужно чтобы хотя бы основа заработала.
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773435
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, понятно, сертификат тот же. Теперь какой точно алгоритм ЭЦП - SHA?
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773453
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Я тут написал код уже, по приведенной Вами ссылке (спасибо).

Столкнулся с проблемой. Подписал хэш и сохранил полученные байты в файл. Выяснилась проблема - файл с подписью, который выдала сторонняя утилита - он размером 1,7 Кб. А моя полученная подпись лишь 20 байт.


Сейчас проверю метод, проверяющий подпись по приведенной Вами ссылке.


Отвечая на последний вопрос - ну да, SHA, код 322772. Я находил ссылку с кодами шифров, код 322772 - соотвестветствует SHA_1
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773455
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. очевидно, что утилита записывает в файл ЭЦП и зашифрованные данные сразу. Поэтому просто похоже проблематично сравнить, что C# код выдал ту же ЭЦП, что и та утилита...

Сейчас Протестирую проверку ЭЦП. Может подтвердит - и то хорошо бы было.
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773460
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РостигайА моя полученная подпись лишь 20 байт
20 нереально. у sha-1 длина подписи 160 байт.

а 1,7 кб, ну не знаю. Если исходный файл = длина подписанного - (160-260) байт, значит добавлена только подпись. Если размер отличается больше, вероятно, в подпись добавлен еще и проверочный сертификат
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773467
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не вышло.

Проверка подписи не прошла:

valid = csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), signature);

Очевидно, потому, что я передаю туда:
var signature = File.ReadAllBytes("Test.ecp");

А файл Test.ecp размером 1,7 Кб. Метод VerifyHash скорее всего ожидает только подпись.

Как бы отделить подпись от зашифрованного текста из файла ?
Либо - какими методами нужно мне пользоваться, чтобы тоже получить склеееный текст с подписью ? Сори, нет знаний по этой теме - а запутатся очень легко в куче разных классов и их методах.

Может RSAPKCS1SignatureFormatter как-то поможет ?
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773468
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РостигайVerifyHashVerifyData
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773475
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm7920 нереально. у sha-1 длина подписи 160 байт.



Код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 RSACryptoServiceProvider csp = (RSACryptoServiceProvider)x509.PrivateKey;            
 // Hash the data
 SHA1Managed sha1 = new SHA1Managed();
 //UnicodeEncoding encoding = new UnicodeEncoding();
 //byte[] data1 = encoding.GetBytes(text);
 byte[] hash = sha1.ComputeHash(data);

 var signedHash = csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));




signedHash - размер массива (и файла на диске, после сохранения) - 128 байт....
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773480
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РостигайArm7920 нереально. у sha-1 длина подписи 160 байт.



Код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 RSACryptoServiceProvider csp = (RSACryptoServiceProvider)x509.PrivateKey;            
 // Hash the data
 SHA1Managed sha1 = new SHA1Managed();
 //UnicodeEncoding encoding = new UnicodeEncoding();
 //byte[] data1 = encoding.GetBytes(text);
 byte[] hash = sha1.ComputeHash(data);

 var signedHash = csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));





signedHash - размер массива (и файла на диске, после сохранения) - 128 байт....

Сорри, это я ошибся. Не 160 байт, а 160 бит, то есть 20 байт.
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773486
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79РостигайVerifyHashVerifyData



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    // Get public key
    RSACryptoServiceProvider csp = (RSACryptoServiceProvider)x509.PublicKey.Key;

    // Hash the text, the text is the expected command by the client application.
    // Remember hased data cannot be unhash. It is irreversable
    SHA1Managed sha1 = new SHA1Managed();
    byte[] hash = sha1.ComputeHash(data);

    // Verify the signature with the hash
    valid =  csp.VerifyData(hash, CryptoConfig.MapNameToOID("SHA1"), signature);   // false



Вот жеж блин :(



PS !!! Есть сомнения в сторонней утилите !!
Подскажите - есть ли сторонняя известная программа, которая подписывает цифровой подписью ? Я бы ее лучше скачал и ей бы рассчитал подпись...
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773496
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Моя задача написать библиотечку, которая будет подписывать файлы (ну и проверять подпись).

Выдали какую-то левую прогу (тоже самописную !), объявив ее эталоном.... Возможно я зря сверяюсь с ней !

Есть ли публичная программа, с которой можно сверится ?
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773499
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть возможность выложить сюда сертификат и подписанный файл? Тестовый какой-нибудь?
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773534
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Спасибо большое !
Я отправил на почту, указанную в Вашем профиле. Просто файл с рабочими данными.
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773616
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Дошло ли письмо ? )
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773622
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, дошло. Что-то вы ересь какую то гоните, простите уж. Ваш 3.ecp отнюдь не содержит подпись. Там какая то корявая base64 строка, которую стандартный convert.frombase64string не опознал, но онлайн декодер выдал маловразумительное. но в этом маловразумительном были куски текста типа: Created by http://www.fiddler2.com1, mail.google.com, и так далее. Это 100% не подпись.

вот код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
            X509Certificate2 certificate = new X509Certificate2("рабочий сертификат.pfx", "ваш пароль");
            RSACryptoServiceProvider provider = certificate.PrivateKey as RSACryptoServiceProvider;

            byte[] signData;

            using (var fs = new FileStream("3.FLD", FileMode.Open, FileAccess.Read))
            {
                signData = provider.SignData(fs, new SHA1CryptoServiceProvider());
                //File.WriteAllBytes("SignedData.bin", signData);
            }


            RSACryptoServiceProvider provider2 = certificate.PublicKey.Key as RSACryptoServiceProvider;
            using (var fs = new FileStream("3.FLD", FileMode.Open, FileAccess.Read))
            {
                bool verifyData = provider2.VerifyData(File.ReadAllBytes("3.FLD"), new SHA1CryptoServiceProvider(), signData);
                Console.WriteLine(verifyData);
            }

            Console.ReadKey();
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773633
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Я в шоке вообще :) Прога получается вообще не работает. Не понятно, что она вообще вычисляет.

Огромное спасибо за код ! Огромное :)
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773716
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Тот файл, что я таки выслал - подписан ВЕРНО !
Сам удивлен.

Проверил в бесплатной программе "КриптоАРМ" (поставил в триальном варианте полнофункционал).
Прога сообщила, что "Подписи математически корректны, но нет полного доверия к одному или нескольким сертификатам подписи"

Ну да. Сертификат конечно левый. Но вот подписалось все ок :)
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773729
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

Блин... КриптоАРМ выругался, что подпись, полученная по Вашему коду:

Код: c#
1.
2.
3.
4.
5.
6.
7.
    using (var fs = new FileStream("3.FLD", FileMode.Open, FileAccess.Read))
    {
        signData = provider.SignData(fs, new SHA1CryptoServiceProvider());
        //File.WriteAllBytes("SignedData.bin", signData);
    }

    File.WriteAllBytes("realSign.result", signData);



не является подписью.... Сами можете проверить...
...
Рейтинг: 0 / 0
Цифровая подпись. Хнык хнык :(
    #38773736
Ростигай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ох и хороша же прожка - КриптоАрм. Тут тебе и удобнейший выбор сертификата, которым подписывать, и ввод какой то доп инфы.

Вот, по сути, мне нужно сделать то, что умеет делать она
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 1 из 4
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Цифровая подпись. Хнык хнык :(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]