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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dorogo  
#1 Оставлено : 25 сентября 2018 г. 11:58:17(UTC)
dorogo

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

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
Здравствуйте.

По примеру из MSDN получилось подписывать/проверять присоединенные/отсоединенные подписи простых текстовых файлов (Программа на С).

Далее пробую аналогично подписать pdf файл: считываю посимвольно содержимое файла (fopen("filename", "rb") и fgetc) и передаю в CryptSignMessage. И вот тут возникает проблема: в считанных данных присутствуют в различных местах символ конца строки ('\0'), соответственно, когда я передаю считанные данные в CryptSignMessage, обрабатываются и подписываются данные, только до первого вхождения символа конца строки.
Пробовал считывать данные в массив строк - при нахождении '\0' пишем в массив и начинаем считывать другую строку, и передавать в CryptSignMessage уже массив строк и соответствующий массив длин строк, а основании документации. Однако получил такой же результат.

Подскажите, пожалуйста, правильно ли подписывать pdf файл способом через разбитие на массив строк и подписи этого массива? или я в корне неправильно мыслю и алгоритм совсем другой?

И еще один вопрос: в качестве эксперимента была попытка подписать большой текстовый файл - однако длина строки для считывания (и в дальнейшем передачи в CryptSignMessage) ограничена, что приводит к ошибке. В данном случае надо разбивать на массив строк и подписывать массив? Если да, то массив тоже имеет ограничение по размеру, соответственно очень большой файл нет возможности подписать?

Во всех примерах и темах, которые нашел, подписываются либо просто строки либо маленькие текстовые файлы.
Offline Андрей Писарев  
#2 Оставлено : 25 сентября 2018 г. 12:20:39(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Здравствуйте.

Какие символы и строки?

Читать и передавать как байты (массив)
Техническую поддержку оказываем тут
Наша база знаний
Offline dorogo  
#3 Оставлено : 25 сентября 2018 г. 13:11:56(UTC)
dorogo

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

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
Код:

    FILE *mf;
    // Переменная, в которую поочередно будут помещаться считываемые байты
    int sym;
    // Открытие фала с режимом доступа «только чтение» и привязка к нему
    // потока данных
    printf("opening file: ");
    mf = fopen("filename", "rb");
    fseek(mf, 0, SEEK_END);
    long len = ftell(mf);
    fseek(mf, 0, SEEK_SET);

    char s1[len];
    char s2[len];
    int q = 0;
    BYTE * arrStr[len];
    int strIndex = 0;
    
    printf("Start reading file\n");
    while (1) {
        // Чтение одного байта из файла
        sym = fgetc(mf);
        //Проверка на конец файла или ошибку чтения
        if (sym == EOF) {
            // Проверяем что именно произошло: кончился файл
            // или это ошибка чтения
            if (feof(mf) != 0) {
                //Если файл закончился, выводим сообщение о завершении чтения
                //и выходим из бесконечного цикла
                printf("\nend\n");
                char* sc = strcpy(malloc(q), s1);
                arrStr[strIndex] = sc;
                q = 0;
                break;
            } else {
                //Если при чтении произошла ошибка, выводим сообщение об
                // ошибке и выходим из бесконечного цикла
                printf("\nerror\n");
                break;
            }
        }
        //Если файл не закончился, и не было ошибки чтения
        //выводим код считанного символа на экран
        s2[q] = sym;
        s1[q++] = sym;
        if (sym == '\0') {
            char* sc = strcpy(malloc(q), s1);
            arrStr[strIndex] = sc;
            q = 0;
            strIndex++;
            continue;
        }
    }


Так я читаю данные из файла.
Здесь в s2 считываются все данные до конца файла, включая символы конца строки '\0' (данный вариант был изначально в примере и для простого текстового файла работает на ура. Однако, как я писал выше, при считывании pdf файла - появляются в середине символы '\0', за счет чего CryptSignMessage подписывает данные только до первого вхождения '\0').

в s1 считываются данные до первого вхождения '\0' и полученная строка записывается в массив arrStr, после чего в s1 начинает считываться следующая строка.
далее на основе полученного массива "arrStr" составляется массив размеров - "MessageSizeArray" и передается в CryptSignMessage.

Код:

    if (CryptSignMessage(
            &SigParams,
            FALSE,
            1,
            arrStr,
            MessageSizeArray,
            NULL,
            &cbSignedMessageBlob)) {
        printf(TEXT("%d bytes needed for the encoded BLOB.\n"), cbSignedMessageBlob);
    } else {
        HandleError(TEXT("Getting signed BLOB size failed"));
        goto exit_SignMessage;
    }
    // Allocate memory for the signed BLOB.
    if (!(pbSignedMessageBlob = (BYTE*) malloc(cbSignedMessageBlob))) {
        HandleError(TEXT("Memory allocation error while signing."));
        goto exit_SignMessage;
    }
    // Get the signed message BLOB.
    if (CryptSignMessage(
            &SigParams,
            FALSE,
            1,
            arrStr,
            MessageSizeArray,
            pbSignedMessageBlob,
            &cbSignedMessageBlob)) {
        printf(TEXT("The message was signed successfully. \n"));
        // pbSignedMessageBlob now contains the signed BLOB.
        fReturn = TRUE;
    } else {
        HandleError(TEXT("Error getting signed BLOB"));
        goto exit_SignMessage;
    }


Однако, CryptSignMessage опять же подписывает только одну строку байтов. (и эта подпись проверяется и своей программой и криптоАрм-ом, но подписывается лишь часть файла).

Пока пробую сделать присоединенную подпись , но в конечном итоге необходима отсоединенная.

p.s. я видимо спутал, строки символов со строками байтов.
но, насколько я понимаю, считываются пустые байты (null) и при передачи набор байтов с пустыми по середине в CryptSignMessage, CryptSignMessage работает с ними как со строкой - соответственно для подписи использует данные от начала до первого пустого байта.
Offline dorogo  
#4 Оставлено : 25 сентября 2018 г. 14:39:22(UTC)
dorogo

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

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
Решил проблему с подписью pdf файла.
Неправильно побайтово считывал.

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