06.10.2004 11:10:15Поточное шифрование Ответов: 23
Dim
Пытаюсь разобратсья с поточным шифрованием. Вопрос такой чего надо записывать в структуре 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);
}
вроде как расшифровывает, но мне кажется что я неправ.
 
Ответы:
06.10.2004 16:40:21dim
Неужели некто не занимался поточным шифрованием
06.10.2004 17:50:00Александр
размер контента (размер файла) или -1, когда размер данных не определён. В МСДН же всё написано :=)
06.10.2004 18:12:41dim
Если ставлю общий размер то при расшифровки выдает ошибку. И вот еще одна бида callback функция возвращает данные длиною 1024 байта, как сделать чтоб длина была больше
07.10.2004 12:30:06Александр
В Callback функцию нужно передавать дескриптор файла, указатель на данные, размер данных и признак конца файла. При шифровании шифрованные блоки записываются в файл.
07.10.2004 14:12:27dim
Я не понял, а как передовать в callback функцию параметры, насколько я знаю она их только принимает. А CryptMsgUpdate в качистве данных принимает указатель на цепочку байт и ее длину. Может есть еще какието параметры или функции.
07.10.2004 14:38:43Александр
каждый раз во время выполнени функции CryptMsgUpdate() она вызывает callback функцию с параметрами, а в ней должна быть реализована запись в файл.
07.10.2004 15:22:05Dim
Это я знаю. Как я уже писал callback функция выдает по 1024 байт. К примеру в CryptMsgUpdate я пиредаю 5Mb, а потом кучу раз срабатывает callback функция выдавая по 1024 байт, хочится чтоб выдола одним махом все 5Mb.
07.10.2004 16:20:05Александр
Если у вас стоит:
callback f(void *pvArg,BYTE *mem_tbs,DWORD mem_len,BOOL fFinal)
{
write(pvarg, pbData, cbData);
if (fFinal)
close(pvarg);
}
то у вас функция и запишет объём равный mem_len. Я незнаю что тут непонятного.
07.10.2004 16:22:01Александр
Сори ошибся!
Если у вас стоит:
callback f(void *pvArg,BYTE *mem_tbs,DWORD mem_len,BOOL fFinal)
{
write(pvarg, mem_tbs, mem_len);
if (fFinal)
close(pvarg);
}
то у вас функция и запишет объём равный mem_len. Я незнаю что тут непонятного.
07.10.2004 16:46:24Dim
Да, я недописал что речь идет о рашифровки. И все равно выдает по 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)
{
чегото делаю с данными
}
07.10.2004 16:47:23Dim
Пардон речь идет о зашифровки
07.10.2004 17:19:24Александр
Зачем вы ставите 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;
}

07.10.2004 17:22:00Александр
в CryptMsgOpenToEncode(); забыл в конце &StreamInfo);
07.10.2004 18:49:31Dim
В callback функции я беру адрес и длину блока данных и передаю дальше другой функции, а если точнее то вообще в другое приложение написанному на другом языке. Я читал MSDN но с английским у меня очень плохо, что должно быть в StreamInfo.pvArg, я так понимаю это какой нибуть параметр который потом передается в callback функцию. Если это так то всеравно 1024 байт.
08.10.2004 10:30:35Александр
В MSDN ничего конкренного про этот параметр нет (например, я через него передаю дескриптор файла). И как у вас callback функция возвращает значения? Но если вы передаёте данные в другую функцию, то эта функция и должна заниматься записью данных (или их возвратом). Здаётся мне, что callback функция здесь вообще не при чё :=)
08.10.2004 11:02:51Dim
Ну какже непричем. Если именно она получет данные (BYTE *mem_tbs,DWORD mem_len), а по том я сними уже чегото делаю. Так вот DWORD mem_len всегда равен 1024 байт, и как может повлиять на эту длину дальнейшие действия, я не пойму.
08.10.2004 11:10:01Александр
Ну я тогда тоже ничего не понимаю. Какую длинну вы передаёте в CryptMsgUpdate() та и передаётся в callback функцию. Щас я ещё у себя проверю.
08.10.2004 11:14:24Dim
Ха. Вот об этом я и толкую что в CryptMsgUpdate я передаю длину 5Mb, а callback функцию передается по 1024 байт. Тоесть выполнив один раз CryptMsgUpdate выполняется несколько раз callback функция получая по 1024 байта
08.10.2004 11:19:47Александр
Вы были правы. Эта зараза действительно передаёт размер блока 1024. Это очень плохо. Но почему она так делает не понятно? Видимо ваш вопрос останется без ответа (если, конечно, товарищи из КриптоПро чего-нибудь не посоветуют).
25.12.2007 9:12:49Волков
Вопрос остается открытым как поменять размер блока передаваемого в callback функцию, у меня он равен 2048 байт.
25.12.2007 10:48:51Юрий
А зачем менять этот размер?
25.12.2007 10:55:30Волков
Ну так ради интереса.
25.12.2007 11:23:55Юрий
Ради интереса могу порекомендовать написать собственную реализацию все функций типа CryptMsg. Честное слово - ничего сложного. По ASN.1 куча документации на русском, кстати говоря.