Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DES - проблема с расшифровкой CryptDecryp() 
:(
    Опции темы
JenyaB
Дата 5.12.2009, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.11.2009

Репутация: нет
Всего: нет



Здравствуйте!!!

Работаю с CryptoAPI. Написала шифрование данных из файла по алгоритму DES - шифрует что-то, теперь вот расшифровать надо.
Проблема в том, что расшифровываю по блочно - по 8 байт, первый блок из 8 байт расшифровывает, а потом возвращает пустой - нулями вроде бы как забивает его. Не могу понять в чем проблема. Перечитала все, что только нашла, 2й день бьюсь над этим. Буду безумно благодарна всем откликнувшимся.
Прилагаю ниже код для шифровки и расшифровки.
Прошу не сильно ругаться на стиль программирования и на другие недоработки, тут некоторые частные случаи не учтены пока)

Шифрование:

Код

    //открываем файл, содержащий данные для кодирования
    printf("Введите имя файла, содержащего данные для кодирования:\n");
    scanf("%s",&fsourceRSA);
    hSourceRSA=fopen(&fsourceRSA,"rb");

    //открываем файл, в который запишем закодированные данные 
    printf("Введите имя файла, в который будут записаны зашифрованные данные:\n");
    scanf("%s",&fcryptRSA);
    hCryptRSA=fopen(&fcryptRSA,"wb");
    

     DWORD k=0;
     fsize=0;
    while(!feof(hSourceRSA))
     {
      fread(buf+k,sizeof(BYTE),1,hSourceRSA);
      fsize++;
        k++;
     }
    
   fseek(hSourceRSA, 0L, SEEK_SET);
     fsize=fsize-1;//размер в байтах данных для кодирования
     k=0; size=0;
     ZeroMemory(buf, fsize+1); //обнулили ее
    if((fsize>8))//if
   {// Encrypt
    while((fsize-size>8))//while
    {
       ZeroMemory(buf, count); //обнулили ее
       for(int c=0;c<8;c++)
        {
          fread(buf+k,sizeof(BYTE),1,hSourceRSA);
          size++;
            k++;
        }
       datalen=8;
       bRes = CryptEncrypt( hKey,  
                        0,          // no hash
                        FALSE,       // "final" flag
                        0,          // reserved
                        (BYTE*)buf,  // buffer with data
                        &datalen,   // return size for ciphered text
                        datalen );
       if( !bRes ) 
         {
           printf ( "CryptEncrypt (encryption) failed: %s\n", 
           GetSysMessage(GetLastError()) );
           ErrorExit( 1 );
         }
       fwrite(buf,sizeof(BYTE),datalen,hCryptRSA);
       ZeroMemory(buf, datalen); //обнулили ее
    }//end while 
   }//end if

 //последний блок

  k=0;
  fsize=fsize-size;
  while(!feof(hSourceRSA))
     {
      fread(bufc+k,sizeof(BYTE),1,hSourceRSA);
        k++;
     }
  k--;
  bufc[k]=0;

  pcr=bufc;
  datalen1=k+8;
  len=k;
  bRes = CryptEncrypt( hKey,  
                       0,          // no hash
                       TRUE,       // "final" flag
                       0,          // reserved
                       NULL,  // buffer with data
                       &datalen1,   // return size for ciphered text
                       0 );
  if( !bRes ) 
      {
        printf ( "CryptEncrypt (encryption) FINAL 1 failed: %s\n", 
        GetSysMessage(GetLastError()) );
        ErrorExit( 1 );
      }
  pbuf = (char*)malloc(datalen1+8);
  memcpy (pbuf, pcr, len);//копируем исходные данные в буфер куда ве

  bRes = CryptEncrypt( hKey,  
                       0,          // no hash
                       TRUE,       // "final" flag
                       0,          // reserved
                       (BYTE*)pbuf,  // buffer with data
                       &len,   // return size for ciphered text
                       datalen1+8 );
  if( !bRes ) 
      {
        printf ( "CryptEncrypt (encryption) FINAL 2 failed: %s\n", 
        GetSysMessage(GetLastError()) );
        ErrorExit( 1 );
      }

  fwrite(pbuf,sizeof(BYTE),len,hCryptRSA);     
  //ZeroMemory(pbuf,datalen1+8); //обнулили ее
free(pbuf);
     fclose(hSourceRSA);    
    fclose(hCryptRSA);

  des_decode();
    printf("Шифрование прошло успешно\n");
    printf("Для возврата в передыдущее меню нажмите ESC\n");
    getch();
    CryptDestroyKey(hKey);
    CryptDestroyKey(hPublicKey);  




Расшифровка:

Код


    printf("‚ўҐ¤ЁвҐ Ё¬п д ©«  б § иЁда®ў ­­л¬Ё ¤ ­­л¬Ё, Є®в®алҐ ­ ¤® а биЁда®ў вм:\n");
    scanf("%s",&fcryptRSA_d);
    hSourceRSA=fopen(&fcryptRSA_d,"rb");
      
    //®вЄалў Ґ¬ д ©« ¤«п § ЇЁбЁ а биЁда®ў ­­ле ¤ ­­ле
    printf("‚ўҐ¤ЁвҐ Ё¬п д ©«  ¤«п § ЇЁбЁ а биЁда®ў ­­ле ¤ ­­ле:\n");
    scanf("%s",&fdecryptRSA_d);
    hdecryptDES=fopen(&fdecryptRSA_d,"wb");
      
      
      k=0;
      fsize=0;
    while(!feof(hSourceRSA))
     {
      fread(buf+k,sizeof(BYTE),1,hSourceRSA);
      fsize++;
        k++;
     }
   
    fseek(hSourceRSA, 0L, SEEK_SET);
     fsize=fsize-1;//а §¬Ґа ў Ў ©в е ¤ ­­ле ¤«п Є®¤Ёа®ў ­Ёп
int kk=0;
     k=0; size=0; 
     //ZeroMemory(buf, fsize+1); //®Ў­г«Ё«Ё ҐҐ
     pf = (char*)malloc(fsize);
        pb = (char*)malloc(8+8);
    if((fsize>8))//if
   {// Decrypt
    while((fsize-size>8))//while
    {
     pb = (char*)malloc(8+8);
     for(int c=0;c<8;c++)
        {
          //fread(buf+k,sizeof(BYTE),1,hSourceRSA);
          //fread(pb+c,sizeof(BYTE),1,hSourceRSA);
          memcpy (pb+c, buf+kk, 1);
          size++;
            kk++;
        }
       //pb[8]=0;
       datalen=8;

       
       bRes = CryptDecrypt( hNewKey,  
                        0,          // no hash
                        TRUE,    //final" flag
                        0,          // reserved
                        (BYTE*)pb,// buffer with data
                        &datalen);   // return size for deciphered text
       if( !bRes ) 
         {
           printf ( "CryptDecrypt (decryption) failed: %s\n", 
           GetSysMessage(GetLastError()) );
           ErrorExit( 1 );
         }
       for(int c1=0;c1<datalen;c1++)
        {
          //fread(buf+k,sizeof(BYTE),1,hSourceRSA);
          memcpy (pf+k, pb+c1, 1);
            k++;
        }
        free(pb);
       //fwrite(pb,sizeof(BYTE),datalen,hdecryptDES);
       //ZeroMemory(buf, datalen); //®Ў­г«Ё«Ё ҐҐ
    }//end while 
   }//end if 
         
//последний блок
  k=0;                         
  fsize=fsize-size;
  ZeroMemory(bufc,fsize+1);
  while(!feof(hSourceRSA))
     {
      fread(bufc+k,sizeof(BYTE),1,hSourceRSA);
        k++;
     }
  k--;  
  bufc[k]=0;
  pcr=bufc;
  datalen1=k;
  datalen1=fsize;


  bRes = CryptDecrypt( hNewKey, //Є«оз ¤«п а биЁда®ўЄЁ
                        0,  //еҐи ­Ґ ­г¦Ґ­
                        TRUE,//дЁ­ «м­л© Ў«®Є (г ­ б ­Ґ Ў«®з­л©  «Ј®аЁв¬)
                        0,    //д« ЈЁ
                        (BYTE*)bufc,//ббл«Є  ­  ¬ ббЁў, ᮤҐа¦ йЁ© ¤ ­­лҐ ¤«п а биЁда®ўЄЁ
                        &datalen1 ); //¤«Ё­  нв®Ј® ¬ ббЁў 

  if( !bRes ) 
      {
        printf ( "CryptDecrypt (decryption) FINAL 1 failed: %s\n", 
        GetSysMessage(GetLastError()) );
        ErrorExit( 1 );
      }

  
  fwrite(/*pbuf*/bufc,sizeof(BYTE),datalen1,hdecryptDES);
  //ZeroMemory(buff,datalen1+8); //®Ў­г«Ё«Ё ҐҐ
  //ZeroMemory(pcr,len); //®Ў­г«Ё«Ё ҐҐ

     fclose(hSourceRSA);    
  fclose(hdecryptDES);
  

PM MAIL   Вверх
xvr
Дата 7.12.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



А где настройка криптопровайдера, получение ключа и пр?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.