Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 37

Функция получения значения хэш-объекта возвращает непонятные символы

22.03.2022, 19:44. Показов 1517. Ответов 7

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, не могу понять почему CryptGetHashParam возвращает в буфер какое то странное значение. Например для текста "Some text 1", размер хэша возвращается "/x14", при получении в буфер через нее же идентификатора алгоритма, так же в буфере непонятные символы.
Я не силен, как в программировании, так и в криптографии, так что тупые, на ваш взгляд варианты, тоже могут помочь, не стесняйтесь

Если вдруг надо, то задание было - хешировать данные с помощью алгоритма SHA в файле, к которому пусть указывает пользователь. Вывести хеш и идентификатор алгоритма, получив их, как параметры хэша (через CryptGetHashParam)

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <windows.h>
#include <wincrypt.h>
 
using namespace std;
 
static HCRYPTPROV cryptoProvider;
static HCRYPTHASH hashObject, hashObjectForSize, hashObjectForAlgID;
 
int main()
{
    CryptAcquireContext(&cryptoProvider, NULL, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT);
    CryptCreateHash(cryptoProvider, CALG_SHA, 0, 0, &hashObject);
 
    string path, data;
    cout << "enter path\n";
    cin >> path;
 
    BYTE* buffer0 = new BYTE;
    BYTE* buffer1 = new BYTE;
    BYTE* buffer2 = new BYTE;
 
    ifstream in(path);
    if (in.is_open()) 
    {
        getline(in, data);
    }
    
    for (int i = 0; i < data.size(); i++)
    {
        buffer0[i] = data[i];
    }
 
    if (CryptHashData(hashObject, buffer0, 0, CRYPT_USERDATA))
    {
        CryptDuplicateHash(hashObject, NULL, 0, &hashObjectForSize);
        CryptDuplicateHash(hashObject, NULL, 0, &hashObjectForAlgID);
 
        DWORD SizeOfBuffer = 30;
        if (CryptGetHashParam(hashObjectForSize, HP_HASHSIZE, buffer0, &SizeOfBuffer, 0)) {
            cout << "\nSize of hash: ";
            for (int i = 0; i < SizeOfBuffer; i++)
            {
                cout << buffer0[i];
            }
        }
 
        SizeOfBuffer = 30;
        if (CryptGetHashParam(hashObjectForAlgID, HP_ALGID, buffer1, &SizeOfBuffer, 0)) {
            cout << "\nAlg ID: ";
            for (int i = 0; i < SizeOfBuffer; i++)
            {
                cout << buffer1[i];
            }
        }
 
        SizeOfBuffer = 30;
        if (CryptGetHashParam(hashObject, HP_HASHVAL, buffer2, &SizeOfBuffer, 0)) {
            cout << "\nHash value: \n";
            for (int i = 0; i < SizeOfBuffer; i++)
            {
                cout << buffer2[i];
            }
        }
 
        CryptDestroyHash(hashObject);
        CryptDestroyHash(hashObjectForSize);
        CryptDestroyHash(hashObjectForAlgID);
 
        CryptReleaseContext(cryptoProvider, 0);
 
    }
    else return 0;
}
P.s. И да, да, я знаю что мог использовать один массив байт для всего, а не создавать 3, я хотел в конце добавить очищение памяти, но студия чет ругалась и я не стал париться и забивать этим голову
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2022, 19:44
Ответы с готовыми решениями:

Функция получения строки с сервера: к строке добавляются лишние символы
вот эти символы ¤¤¤¤лллллллл■ю■ю■ Не понимаюю что делать( Вот состав файла : &lt;?php echo 'http://v929a1.bget.ru/Sum.exe'; ?&gt; ...

Непонятные символы. Из файла читаются непонятные символы
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; struct magazines ...

Непонятные символы. Из файлв читаются непонятные символы
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; struct magazines ...

7
фрилансер
 Аватар для Алексей1153
6466 / 5680 / 1131
Регистрация: 11.10.2019
Сообщений: 15,126
22.03.2022, 20:38
Цитата Сообщение от TongueLizard Посмотреть сообщение
BYTE* buffer0 = new BYTE;
создаёшь экземпляр класса BYTE

Цитата Сообщение от TongueLizard Посмотреть сообщение
buffer0[i]
а обращаешься как к массиву. Приехали

Добавлено через 38 секунд
Цитата Сообщение от TongueLizard Посмотреть сообщение
я хотел в конце добавить очищение памяти
так используй вектор
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 37
22.03.2022, 20:44  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а обращаешься как к массиву. Приехали
А разве я создал не массив байт?

И вообще, то есть проблема в этом? или что?
Почему он передает в него какую то ересь?
Я на точке останова смотрел, еще до вывода, в буфере уже некорректные значения
0
фрилансер
 Аватар для Алексей1153
6466 / 5680 / 1131
Регистрация: 11.10.2019
Сообщений: 15,126
22.03.2022, 20:47
TongueLizard, массив создаётся так

C++
1
BYTE* buffer0 = new BYTE[размер]/*{инициализация}*/;
а вектор так
C++
1
std::vector<BYTE> buffer0(размер);
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 37
23.03.2022, 00:16  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
массив создаётся так
А динамический массив?
Можно использовать массив байт?
И я же сказал, что он и читает непонятные символы, про вывод речи не идет
Мне надо понять почему он в буфер изначально ерунду передает
0
фрилансер
 Аватар для Алексей1153
6466 / 5680 / 1131
Регистрация: 11.10.2019
Сообщений: 15,126
23.03.2022, 07:00
Цитата Сообщение от TongueLizard Посмотреть сообщение
А динамический массив
это он и есть

Цитата Сообщение от TongueLizard Посмотреть сообщение
Мне надо понять почему он в буфер изначально ерунду передает
неопределённое поведение из-за ошибки
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 37
23.03.2022, 17:18  [ТС]
Так, получилось вывести нормальное значение хеша, где то подсмотрел вывод буфера с hashval как
C++
1
cout << hex << int(buffer2[i]);
получилось что-то такое
Миниатюры
Функция получения значения хэш-объекта возвращает непонятные символы  
0
0 / 0 / 0
Регистрация: 23.12.2018
Сообщений: 37
23.03.2022, 17:19  [ТС]
Но размер хеша и алгоритм все равно выводит непонятно, их тоже надо как-то преобразовать наверное при выводе
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.03.2022, 17:19
Помогаю со студенческими работами здесь

функция получения значения от сервера
Доброго времени суток...Сразу оговорюсь в с# я тугой..Я больше понимаю в делфи, но и там не получилось выполнить задачу....Попросил знакого...

Функция не возвращает значения
Вот и она: function start_container($mch) { $active = null; do { $mrc = curl_multi_exec($mch,...

Функция на хостинге для получения значения option выдает undefined
А на локальном все работает, выдает правильное значение. В чем может быть ошибка?

Функция не возвращает значения структуры
Привет, всем! Подскажите, как записать такой кусок программы в виде функции в отдельном файле // Загрузить Параметры из файла ...

Функция Не Возвращает Значения Notesdocument
Добрый день всем, не могу заставить Lotus работать, первый раз с таким сталкиваюсь. Функция не возвращает переменной, Recompile All...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru