Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

CryptoAPI DES проблема с дешифровкой

1.9K
25 января 2008 года
WWTLF
35 / / 16.06.2003
Код:
HCRYPTPROV hProv=0;//дескриптор криптопровайдера
HCRYPTKEY hKey; //дескриптор ключа
char Buf[] = "11111111";
char Buf2[]= "22222222";
DWORD Len,Len1,Len2;
int _tmain(int argc, _TCHAR* argv[])
{


    if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,0))
        if ((unsigned)GetLastError()==NTE_BAD_KEY_STATE)
            CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,CRYPT_NEWKEYSET);

    if (!CryptGenKey(hProv, CALG_DES,
    CRYPT_ENCRYPT | CRYPT_DECRYPT, &hKey))
    {
   
    return 0;
    }

    //CryptDestroyHash(hHash);
   
    Len = strlen(Buf);
    printf("Err %d \n Len:%d \nPlain text:%s \n",GetLastError(),Len,Buf);
    printf("Err %d \n Len:%d \nPlain text:%s \n------------------\n",GetLastError(),Len,Buf2);
   
    CryptEncrypt(hKey,0,0,0,(BYTE*)Buf,&Len,strlen(Buf));
    printf("Err %d \n Len:%d \nCipher text:%s \n",GetLastError(),Len,Buf);
    Len2 = strlen(Buf2);
    CryptEncrypt(hKey,0,0,0,(BYTE*)Buf2,&Len2,strlen(Buf2));
    printf("Err %d \n Len2:%d \nCipher text:%s \n------------------\n",GetLastError(),Len2,Buf2);

   
    CryptDecrypt(hKey,0,0,0,(BYTE*)Buf,&Len);
    CryptDecrypt(hKey,0,0,0,(BYTE*)Buf2,&Len2);

    printf("Err %d \n Len:%d \nPlain text:%s \n",GetLastError(),Len,Buf);
    printf("Err %d \n Len2:%d \nPlain text:%s \n------------------\n",GetLastError(),Len2,Buf2);

    //CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,(BYTE *)kkk,&Len);
    getch();
    return 0;

}


Есть такой небольшой код, шифрование происходит нормально, но при дешифровке первый блок Buf не восстанавливается... При попытке указать последний блок Buf2 финальным вообще каша получается в памяти и ошибка либо -27878234987 или 234. Помогите разобраться. Спасибо.
9.7K
13 февраля 2008 года
oltzowwa
105 / / 15.02.2007
Для того чтобы скомпилировался твой код, подключила wincrypt.h..что ещё надо?:o Даже проверить варианты не могу(.
По прочитанному мною материалу вроде всё так, должно работать....Только память в конце не освобождается)...

P.S. Я основывалась на статьях
http://linux-admin.net.ru/content/892
http://www.rsdn.ru/article/crypto/usingcryptoapi.xml#E5IAE
1.9K
13 февраля 2008 года
WWTLF
35 / / 16.06.2003
Да основное только wincrypt.h . Вспомогательное conio.h для getch();
stdio.h для printf...
9.7K
14 февраля 2008 года
oltzowwa
105 / / 15.02.2007
Странно, я сверху твоего кода добавила:
 
Код:
#include <stdio.h>
#include <tchar.h>
#include <wincrypt.h>
#include <conio.h>


Может среда не та? я компилирую в студии 2005, ты тоже?

Я посмотрела описание функции шифрования:
 
Код:
BOOL CryptEncrypt
 (
  HCRYPTKEY  hKey,          //[In] Handle to the encryption key.
  HCRYPTHASH hHash,        //[In] Handle to a hash object.
  BOOL       Final,              //[In] TRUE if this is the last section to encrypt.
  DWORD      dwFlags,        //[In] Can be CRYPT_OAEP.
  BYTE*      pbData,          //[In/Out] Data to be encrypted. Contains encrypted data after call.
  DWORD*     pdwDataLen, //[In/Out] Length of the data to encrypt. Contains the length of the encrypted data after call.  
  DWORD      dwBufLen      //[In] Length of the input pbData buffer.
 )


У тебя параметер Final равен 0 и в первом и во втором случае, т.е. шифруемый блок не последний. Если попробовать один блок зашифровать и указать Final=1? И ещё проверь что возвращает функция true или false (т.е успешное выполнение шифрования или нет).

Также параметер Final есть в дешифровке, он у тебя в обоих случаях равен 0 (для двух блоков для дешифровки следует указать для первого блока 0 для второго 1). Также проверь возвращаемое значение функции CryptDecrypt.

Я основываюсь на источниках
http://source.winehq.org/WineAPI/CryptEncrypt.html
http://msdn2.microsoft.com/en-us/library/aa379913(VS.85).aspx
9.7K
14 февраля 2008 года
oltzowwa
105 / / 15.02.2007
Создала консольный проект с MFC подключила библиотеку:
 
Код:
#pragma comment(lib,"Advapi32.lib")
#include <stdio.h>
#include <tchar.h>
#include <wincrypt.h>
#include <conio.h>


Комилируется с 5 предупреждениями и на генерации ключа выдаёт 87 ошибку(
1.9K
14 февраля 2008 года
WWTLF
35 / / 16.06.2003
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <windows.h>
#include <wincrypt.h>
#include <malloc.h>

вот
консольное приложение
все запускается спокойно

насчет тру и фалс еще не проверял
а на счет финальный не финальный блок как только я не пробовал...
9.7K
15 февраля 2008 года
oltzowwa
105 / / 15.02.2007
После каждого вызова функции проставила:
_ftprintf(stderr, TEXT("Error number %d\n------------\n"), GetLastError());

и после вызова
 
Код:
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,0))
        if ((unsigned)GetLastError()==NTE_BAD_KEY_STATE)
            CryptAcquireContext(&hProv, NULL, NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET);

возникает системная ошибка 87 (т.е The parameter is incorrect.). Выяснила, что PROV_RSA_FULL не поддерживает DES. Если использовать DES, то лучше брать PROV_DH_SCHANNEL или PROV_MS_EXCHANGE.

Если взять PROV_DH_SCHANNEL, то возникает ошибка 87. А если взять PROV_MS_EXCHANGE, то возникает системная ошибка 127 ( The specified procedure could not be found.) Почему не может быть найдена??? не пойму...
Ладно..я игнорирую эту ошибку. После кодирования блока возникает ошибка:0x80090004 (Bad length.), а после декодирования возникает 0x80090005(Bad data.)

:mad: просто ума не приложу что делать...
9.7K
29 марта 2008 года
oltzowwa
105 / / 15.02.2007
Не работает приведённный код потому, что:
1) не выделена достаточная память для Buf[] и Buf2[], т.к. функция CryptEncrypt в Buf[] и Buf2[] возвращает зашифрованный текст( а он большего размера)

2) CryptEncrypt(hKey,0,0,0,(BYTE*)Buf,&Len,strlen(Buf)); - &Len,strlen(Buf) - эти значения не верные для кодирования.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог