Новичок
Профиль
Группа: Участник
Сообщений: 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);
|
|