Статус: Новичок
Группы: Участники
Зарегистрирован: 10.08.2010(UTC) Сообщений: 4
|
Добрый день, уважаемые товарищи... Являюсь начинающим... Вопрос возник следующий: Создаю программку, которая просто шифрует строку и тут же ее расшифровывает и выводит (своеобразнные "Hello, world" для CryptoAPI) Код:
...
int _tmain()
{
HCRYPTPROV hProv;
HCRYPTKEY hSesKey;
DWORD dwFlags=0;
if(!CryptAcquireContext(&hProv,NULL,NULL,1,CRYPT_VERIFYCONTEXT)) //Получение хэндела криптопровайдера
if(!CryptGenKey(hProv,CALG_RC4,dwFlags,&hSesKey)) //Генерация сессионого ключа
{
}
else
{
cout"<<"hSesKey"<<"endl;
}
char string[]="qwertyuiofsdakjfhkjasdfhlkjasdhflkjadhiuertyieruhyfdkjsghfkdjp[]"; //Сообщение для шифрования
DWORD count=strlen(string);
if(!CryptEncrypt(hSesKey,0,true,0,(BYTE *)string,&count,strlen(string))) //Шифрование и вывод результата
{
std::cout"<<"Error CryptEncrypt"<<"GetLastError()"<<"std::endl;
}
else
{
std::cout"<<"string"<<"std::endl;
}
count=strlen(string);
if(!CryptDecrypt(hSesKey,0,true,0,(BYTE *)string,&count)) //Дешифрование и вывод результата
{
std::cout"<<"Error CryptEncrypt;
}
else
{
std::cout"<<"string"<<"std::endl;;
}
int a;
std::cin>>a;
return 0;
}
"
В этом случае работает все нормально и в консоли я получаю следующее (ключ, шифро-текст, тест): "1396112 юб╝&Єр>^‼☼А)d┌╤↑y(rz"м%ШK:▬zЎ♂╡Б▲♫┬<ч)XФc╝ЛgР↑╓→Kх↕i8¶↔х_)Мщ▀▬ qwertyuiofsdakjfhkjasdfhlkjasdhflkjadhiuertyieruhyfdkjsghfkdjp[]" Непонятки проявляются когда я пытаюсь тот же самый код использовать с провайдером КриптоПро, то есть: 1. Меняю в фунркции CryptAcquireContext тип провайдера с 1 на 75 2. В функции CryptGenKey() параметр ALD_ID меняю с CALG_RC4 на 26142 В результате в раскодированной строке получается не исходная строка, а какая-то лажа местами с элементами исходной строки. Кроме того, шифро-текст получается разный при одном и том же ключе шифрования. Вообщем и в целом бред! Прошу направить на путь истинный, дабы спасти душу свою от скитанья во тьме кромешной.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,377 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 32 раз Поблагодарили: 706 раз в 614 постах
|
нужно задавать/указывать вектор-инициализации (KP_IV) |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.08.2010(UTC) Сообщений: 4
|
Задаю вектор иницилизации для сгенерированного ключа if(CryptSetKeyParam(hSesKey,KP_IV,pbRandomData,0)) { printf("New initialization vector is set.\n"); } else { printf("The new IV was not set."); } выдает: New initialization vector is set, но тем не менее не правильно шифрует/дешифрует
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,377 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 32 раз Поблагодарили: 706 раз в 614 постах
|
перед расшифрованием тоже? |
|
1 пользователь поблагодарил Максим Коллегин за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.08.2010(UTC) Сообщений: 4
|
Добавил тот же самый код вектора-иницилизации при дешифрованиии и действительно сработало... Большое спасибо! maxdm А не подскажете ссылочку, где можно почитать инфу про этот вектор-иницилизации, ключ, и их взаимодействие с функциями CryptEncrypt/CryptDerypt?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close