| ||||
| ||||
Пытаюсь разобратсья с поточным шифрованием. Вопрос такой чего надо записывать в структуре CMSG_STREAM_INFO.cbContent. И при дишифровки как правильно организовать это дело. Сейчас я сделал вот таким мокаром hMsg = CryptMsgOpenToDecode(TYPE_DER,CMSG_CRYPT_RELEASE_CONTEXT_FLAG ,0,hCryptProv,NULL,&StrimData); while(!priznak_konca) { ret=CryptMsgUpdate(hMsg,mem_tbs,mem_len,priznak_konca); if(!ret) чегото делаем если ошибка; CryptMsgControl(hMsg,0,choice_opt,&DecryptPara); } вроде как расшифровывает, но мне кажется что я неправ. | ||||
Ответы: | ||||
| ||||
Неужели некто не занимался поточным шифрованием | ||||
| ||||
размер контента (размер файла) или -1, когда размер данных не определён. В МСДН же всё написано :=) | ||||
| ||||
Если ставлю общий размер то при расшифровки выдает ошибку. И вот еще одна бида callback функция возвращает данные длиною 1024 байта, как сделать чтоб длина была больше | ||||
| ||||
В Callback функцию нужно передавать дескриптор файла, указатель на данные, размер данных и признак конца файла. При шифровании шифрованные блоки записываются в файл. | ||||
| ||||
Я не понял, а как передовать в callback функцию параметры, насколько я знаю она их только принимает. А CryptMsgUpdate в качистве данных принимает указатель на цепочку байт и ее длину. Может есть еще какието параметры или функции. | ||||
| ||||
каждый раз во время выполнени функции CryptMsgUpdate() она вызывает callback функцию с параметрами, а в ней должна быть реализована запись в файл. | ||||
| ||||
Это я знаю. Как я уже писал callback функция выдает по 1024 байт. К примеру в CryptMsgUpdate я пиредаю 5Mb, а потом кучу раз срабатывает callback функция выдавая по 1024 байт, хочится чтоб выдола одним махом все 5Mb. | ||||
| ||||
Если у вас стоит: callback f(void *pvArg,BYTE *mem_tbs,DWORD mem_len,BOOL fFinal) { write(pvarg, pbData, cbData); if (fFinal) close(pvarg); } то у вас функция и запишет объём равный mem_len. Я незнаю что тут непонятного. | ||||
| ||||
Сори ошибся! Если у вас стоит: callback f(void *pvArg,BYTE *mem_tbs,DWORD mem_len,BOOL fFinal) { write(pvarg, mem_tbs, mem_len); if (fFinal) close(pvarg); } то у вас функция и запишет объём равный mem_len. Я незнаю что тут непонятного. | ||||
| ||||
Да, я недописал что речь идет о рашифровки. И все равно выдает по 1024 байт. Вот примерный код: MSG_STREAM_INFO StrimData; memset(&StrimData, 0, sizeof(CMSG_STREAM_INFO)); StrimData.cbContent=(DWORD)memoLen; StrimData.pfnStreamOutput = CmsgStreamOutput; hMsg = CryptMsgOpenToEncode(TYPE_DER, CMSG_DETACHED_FLAG|CMSG_CRYPT_RELEASE_CONTEXT_FLAG, CMSG_ENVELOPED, &EnvelopedEncodeInfo, NULL, &StrimData); while(!priznak_konca) { CryptMsgUpdate(hMsg,mem_tbs,mem_len,priznak_konca); } callback функция BOOL CALLBACK CmsgStreamOutput(const void *pvArg,BYTE *mem_tbs,DWORD mem_len,BOOL fFinal) { чегото делаю с данными } | ||||
| ||||
Пардон речь идет о зашифровки | ||||
| ||||
Зачем вы ставите CMSG_DETACHED_FLAG это относится к подписи (отдельная подпись). Попробуйте так: StreamInfo.cbContent = (DWORD) -1; StreamInfo.pfnStreamOutput = CmsgStreamOutputCallback; StreamInfo.pvArg = (void*)outfile; hMsg = CryptMsgOpenToEncode(MAG_ENCODING_TYPE, 0, CMSG_ENVELOPED, &EnvelopedEncodeInfo, NULL, while(!eof(infile)) { bytes_read = read(infile, buffer, STREAM_BLOCK_SIZE); CryptMsgUpdate(hMsg, buffer, bytes_read, eof(infile))) } BOOL WINAPI CmsgStreamOutputCallback(const void* file, BYTE* buffer, DWORD size_buffer, BOOL final) { int infile = (int)file; write(infile, buffer, size_buffer); return true; } | ||||
| ||||
в CryptMsgOpenToEncode(); забыл в конце &StreamInfo); | ||||
| ||||
В callback функции я беру адрес и длину блока данных и передаю дальше другой функции, а если точнее то вообще в другое приложение написанному на другом языке. Я читал MSDN но с английским у меня очень плохо, что должно быть в StreamInfo.pvArg, я так понимаю это какой нибуть параметр который потом передается в callback функцию. Если это так то всеравно 1024 байт. | ||||
| ||||
В MSDN ничего конкренного про этот параметр нет (например, я через него передаю дескриптор файла). И как у вас callback функция возвращает значения? Но если вы передаёте данные в другую функцию, то эта функция и должна заниматься записью данных (или их возвратом). Здаётся мне, что callback функция здесь вообще не при чё :=) | ||||
| ||||
Ну какже непричем. Если именно она получет данные (BYTE *mem_tbs,DWORD mem_len), а по том я сними уже чегото делаю. Так вот DWORD mem_len всегда равен 1024 байт, и как может повлиять на эту длину дальнейшие действия, я не пойму. | ||||
| ||||
Ну я тогда тоже ничего не понимаю. Какую длинну вы передаёте в CryptMsgUpdate() та и передаётся в callback функцию. Щас я ещё у себя проверю. | ||||
| ||||
Ха. Вот об этом я и толкую что в CryptMsgUpdate я передаю длину 5Mb, а callback функцию передается по 1024 байт. Тоесть выполнив один раз CryptMsgUpdate выполняется несколько раз callback функция получая по 1024 байта | ||||
| ||||
Вы были правы. Эта зараза действительно передаёт размер блока 1024. Это очень плохо. Но почему она так делает не понятно? Видимо ваш вопрос останется без ответа (если, конечно, товарищи из КриптоПро чего-нибудь не посоветуют). | ||||
| ||||
Вопрос остается открытым как поменять размер блока передаваемого в callback функцию, у меня он равен 2048 байт. | ||||
| ||||
А зачем менять этот размер? | ||||
| ||||
Ну так ради интереса. | ||||
| ||||
Ради интереса могу порекомендовать написать собственную реализацию все функций типа CryptMsg. Честное слово - ничего сложного. По ASN.1 куча документации на русском, кстати говоря. | ||||