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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline kazaza  
#1 Оставлено : 24 мая 2012 г. 20:08:30(UTC)
kazaza

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

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

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

Пытаемся реализовать проверку подписи, сформированной Browser plug-in, посредством Sharpei. Сама подпись отделенная, реализуется посредством примера из руководства:

Код:
function SignCreate(certSubjectName, dataToSign, g_bDetached) { //создание подписи
    var oStore = CreateObject("CAPICOM.Store");
    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, //открываем хранилище сертификатов
        CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

    var oCertificates = oStore.Certificates.Find( //ищем сертификат
        CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
    if (oCertificates.Count == 0) { //если сертификат не нашли
        alert("Certificate not found");
        return;
    }
    var oCertificate = oCertificates.Item(1); //нашли сертификат

    var oSigner = CreateObject("CAdESCOM.CPSigner");
    oSigner.Certificate = oCertificate;
    oSigner.TSAAddress = "http://cryptopro.ru/tsp/";

    var oSignedData = CreateObject("CAdESCOM.CadesSignedData");
    oSignedData.Content = dataToSign;

    try {
        var sSignedMessage = oSignedData.SignCades(oSigner, 1, g_bDetached); //создаем отделенную подпись	
    } catch (err) {
        alert("Failed to create signature. Error: " + GetErrorMessage(err));
        return;
    }
	
    oStore.Close();

    return sSignedMessage;
}


Созаднную подпись и исходный файл и файл подписи подсовываем приложению на C#, в котором с помощью Sharpei реализована проверка подписи (согласно примера в Sharpei):

Код:
//выбор сертификата отправителя
            //Формуруем коллекцию отображаемых сертификатов
            X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            X509Certificate2Collection collection =
                (X509Certificate2Collection)store.Certificates;

            X509Certificate2Collection scollection = null;
            X509Certificate2 found1 = null;
            AsymmetricAlgorithm asym = null;

            try
            {
                // Отображаем окно выбора сертификата
                scollection =
                    X509Certificate2UI.SelectFromCollection(collection,
                    "Выбор секретного ключа по сертификату",
                    "Выберите сертификат, соответствующий Вашему секретному ключу",
                    X509SelectionFlag.SingleSelection);

                // Выбран может быть только один сертификат
                found1 = scollection[0];
            }

            catch
            {
                MessageBox.Show("Установите Ваш сертификат на компьютер и запустите программу заново", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

                Application.Exit();
            }

            try
            {

                // Получаем секретный ключ соответствующий данному сертификату
                asym = found1.PrivateKey;
            }

            catch
            {
                MessageBox.Show("Вставьте, пожалуйста, токен с сертификатом в USB-порт компьютера и запустите программу заново", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

                Application.Exit();
            }

            ICspAsymmetricAlgorithm iasym = asym as ICspAsymmetricAlgorithm;
            CspKeyContainerInfo info = iasym.CspKeyContainerInfo;

            CspParameters par = new CspParameters(75, null, info.KeyContainerName);
            Gost3410CryptoServiceProvider srcContainer = new Gost3410CryptoServiceProvider(par);

            Gost3410Parameters srcPublicKeyParameters = new Gost3410Parameters();

            try
            {
                srcPublicKeyParameters = srcContainer.ExportParameters(false);
            }

            catch
            {
                MessageBox.Show("Вы ввели неправильный pin-код", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

                button1.Enabled = false;
                button2.Enabled = true;

                return;

            }

            GostSignatureFormatter GostFormatter = new GostSignatureFormatter(srcContainer);

            //Значение хеш
            FileStream fsh;
            HashAlgorithm myhash = HashAlgorithm.Create("GOST3411");
            using (fsh = new FileStream(MessageDirPath,
                FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                myhash.ComputeHash(fsh);
            }
            byte[] hashValue = myhash.Hash;
            fsh.Dispose();
            FileStream fileSt = new FileStream(HashPath, FileMode.OpenOrCreate,
               FileAccess.ReadWrite, FileShare.ReadWrite);
            fileSt.Write(hashValue, 0, hashValue.Length);
            fileSt.Dispose();
            myhash.Clear();

            //Подписываем хеш
            byte[] SignedHashValue = GostFormatter.CreateSignature(hashValue);
            FileStream fileStl = new FileStream(SignatureFilePath, FileMode.OpenOrCreate,
               FileAccess.ReadWrite, FileShare.ReadWrite);
            fileStl.Write(SignedHashValue, 0, SignedHashValue.Length);
            fileStl.Dispose();
            myhash.Clear();

            //File.Delete(MessageDirPath);
            File.Delete(HashPath);

            System.Diagnostics.Process.Start("explorer.exe", OutputDirPath);


Однако подпись, созданная в браузере, проверку не проходит. А если создать подпись не в браузере, а стандарными средствами Sharpei:

Код:
//разбираем сертификат отправителя
            X509Certificate2 cert = new X509Certificate2(Certificate);
                                                        
            //открытый ключ отправителя
            AsymmetricAlgorithm pk1 = cert.PublicKey.Key;
            
            //абсолютные пути к файлам с привязкой к текущей директории
            SignatureFilePath1 = textBox2.Text;
            WorkDirPath1 = Path.GetDirectoryName(SignatureFilePath1);
            EncryptedMessagePath1 = textBox1.Text;
            ZipDirPath1 = WorkDirPath1 + @"\message.zip";
            UnzipDirPath = WorkDirPath1 + @"\message";
            string Hash = WorkDirPath1 + @"\hash.txt";

            FileStream cryptedData1 = null;

            try
            {
                cryptedData1 = new FileStream(EncryptedMessagePath1, FileMode.Open);
            }
            catch
            {
                MessageBox.Show("Добавьте в папку с цифровой подписью исходный файл и запустите приложение заново", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);

                Application.Exit();
            }

            HashAlgorithm gostHashAlgorithm1 = HashAlgorithm.Create("GOST3411");
            gostHashAlgorithm1.ComputeHash(cryptedData1);
            byte[] hashValue1 = gostHashAlgorithm1.Hash;

            cryptedData1.Close();

            //работаем с файлом подписи
            byte[] signeddata12 = null;
            FileStream fshh12 = new FileStream(SignatureFilePath1, FileMode.Open);
            //переписываем содержимое в выходной поток
            int lengthl123 = (int)fshh12.Length;
            signeddata12 = new byte[lengthl123];
            fshh12.Read(signeddata12, 0, lengthl123);
            fshh12.Close();

            GostSignatureDeformatter deformater1 = new GostSignatureDeformatter(pk1);
            bool isSignatureCorrect12 = true;
            isSignatureCorrect12 = deformater1.VerifySignature(gostHashAlgorithm1, signeddata12);
            if (isSignatureCorrect12)
            {
                MessageBox.Show("Подпись верна.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("Подпись не верна. Расшифровка невозможна", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);               
            }


результат проверки положителен.

Как проверить Sharpei’ем подпись, созданную браузером?
Offline Новожилова Елена  
#2 Оставлено : 24 мая 2012 г. 21:45:30(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Проблема описана здесь: http://www.cryptopro.ru/...etsya-v-kriptoarmcryptcp

Процитирую алгоритм создания и проверки (для Sharpei все аналогично КриптоАРМ):

Цитата:
Для совместимости с КриптоАРМ рекомендуем перекодирование файла в BASE64 (только для создания подписи в плагине) и использование параметра CADESCOM_BASE64_TO_BINARY в качестве значения свойства CadesSignedData.ContentEncoding. Данный параметр должен быть указан до того, как будет присвоено или получено значение свойства Content.

Для проверки в КриптоАРМ исходный бинарный файл перекодировать не надо.

То есть:
1. Сначала перекодируете исходный файл в BASE64.
2. Указываете signedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY.
3. Заполняете signedData.Content = закодированный в BASE64 файл.
4. Подписываете.

Получаете подпись, где подписанные данные = содержимое исходного файла. Эта подпись должна проверяться в КриптоАРМ без какого-либо дополнительного перекодирования.


2. При проверке подписи в плагине оригинал документа нужно передавать в свойство Content.
Кодировка, в которой вы передаете оригинал документа, должна быть указана заранее.

Для бинарных файлов (см. п.1) алгоритм должен быть таким:

1. Указываете signedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY.
2. Заполняете signedData.Content = закодированный в BASE64 исходный файл.
3. Проверяете signedData.Verify …
Offline kazaza  
#3 Оставлено : 25 мая 2012 г. 11:54:58(UTC)
kazaza

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

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

Спасибо, сейчас попробуем.
Offline cybermerlin  
#4 Оставлено : 25 мая 2012 г. 16:25:06(UTC)
cybermerlin

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 3 раз в 3 постах
мне для javascript где взять значения
CADESCOM_BASE64_TO_BINARY
CADESCOM_STRING_TO_UCS2LE
???

в доках указано cadescom.h - но самого хэдера в дистрибе нет

Отредактировано пользователем 25 мая 2012 г. 16:28:25(UTC)  | Причина: Не указана

Offline cybermerlin  
#5 Оставлено : 25 мая 2012 г. 16:42:04(UTC)
cybermerlin

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 3 раз в 3 постах
пришлось студией пользоваться, чтобы посмотреть значения :(
Offline Новожилова Елена  
#6 Оставлено : 25 мая 2012 г. 18:27:16(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Offline kazaza  
#7 Оставлено : 28 мая 2012 г. 13:51:32(UTC)
kazaza

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

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

С помощью Total Commander закодировали файл в BASE64.
Подсунули этот файл в браузер с модифицированным кодом:

Код:
function SignCreate(certSubjectName, dataToSign, g_bDetached) { //создание подписи
    var oStore = CreateObject("CAPICOM.Store");
    oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, //открываем хранилище сертификатов
        CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

    var oCertificates = oStore.Certificates.Find( //ищем сертификат
        CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
    if (oCertificates.Count == 0) { //если сертификат не нашли
        alert("Certificate not found");
        return;
    }
    var oCertificate = oCertificates.Item(1); //нашли сертификат

    var oSigner = CreateObject("CAdESCOM.CPSigner");
    oSigner.Certificate = oCertificate;
    oSigner.TSAAddress = "http://cryptopro.ru/tsp/";

    var oSignedData = CreateObject("CAdESCOM.CadesSignedData");
    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY; //base64
    oSignedData.Content = dataToSign;

    try {
        var sSignedMessage = oSignedData.SignCades(oSigner, 1, g_bDetached); //создаем отделенную подпись	
    } catch (err) {
        alert("Failed to create signature. Error: " + GetErrorMessage(err));
        return;
    }
	
    oStore.Close();

    return sSignedMessage;
}

function Verify(sSignedMessage, dataToSign, g_bDetached) { //проверка подписи
    var oSignedData = CreateObject("CAdESCOM.CadesSignedData");
    if (g_bDetached) {
	    oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY; //base64
            oSignedData.Content = dataToSign;
            } else {
            alert("Signature is not detached");
        }
	try {
        oSignedData.VerifyCades(sSignedMessage, 1, g_bDetached);
    } catch (err) {
        alert("Failed to verify signature. Error: " + GetErrorMessage(err));
        return false;
    }

    return true;
}


В браузере с созданием и проверкой подписи всё хорошо, но вот при проверке в Sharpei снова подпись не верна.
Offline Новожилова Елена  
#8 Оставлено : 28 мая 2012 г. 16:12:13(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
В Sharpei файл передаете исходный для проверки? Не закодированный в BASE64?
Offline kazaza  
#9 Оставлено : 28 мая 2012 г. 16:15:51(UTC)
kazaza

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

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

Конечно, исходный.
Offline Новожилова Елена  
#10 Оставлено : 28 мая 2012 г. 16:25:11(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Можете выложить файл и подпись? В cryptcp подпись проверяется?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.