Ir ao conteúdo
  • Cadastre-se

C++ Estudo do sistema de proteção criptográfica em sistemas operacionais MS Windows.


Posts recomendados

A tarefa é esta: Exibe a lista de provedores de criptografia instalados na tela. Escreva um teste da velocidade de criptografia do provedor de criptografia da Microsoft subjacente.

Acontece que sempre ele apresenta certos erros que não consigo entender o porque!

#include <iostream> 

#include <ctime> 

#include <tchar.h>  

#include <stdio.h> 

#include <windows.h> 

#include <wincrypt.h> 

#include <combaseapi.h> 



#pragma comment(lib, "advapi32.lib") 



using namespace std; 

#define KEYLENGTH 0x00800000  

#define ENCRYPT_ALGORITHM CALG_RC4  

#define ENCRYPT_BLOCK_SIZE 8 



HANDLE hSourceFile = INVALID_HANDLE_VALUE; // data handle 

HANDLE hKeyFile = INVALID_HANDLE_VALUE; // key handle 

HANDLE hDestinationFile = INVALID_HANDLE_VALUE; // write handle 



HCRYPTPROV hCryptProv = NULL; // cryptoprovide descriptor 



HCRYPTKEY hKey = NULL; // key descriptor 

HCRYPTKEY hXchgKey = NULL; 



PBYTE pbBuffer = NULL; // file buffer 



DWORD dwBlockLen; 

DWORD dwBufferLen; 

DWORD dwCount; 



PBYTE pbKeyBlob = NULL; 

DWORD dwKeyBlobLen; 



clock_t t; // timer 



int main() { 



DWORD size; 

DWORD type; 

DWORD index=0; 

char* name; 



cout << "1. List cryptoproviders: " << endl; 

while( CryptEnumProviders(index, 0, 0, &type, 0, &size) ) 

{ 

name = new char[size]; 

CryptEnumProviders(index, 0, 0, &type, name, &size); 

printf("  %d   %d %s'n", index + 1, type, name); 

index++; 

delete[] name; 

} 



cout << endl << endl << "2. Speed encription test: " << endl; 



// file opening 

hSourceFile = CreateFile("input.txt", FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

if (INVALID_HANDLE_VALUE == hSourceFile){  

printf("ERROR opening input file 'n"); 

system("Pause"); 

return 0; 

} 



hDestinationFile = CreateFile("output.txt", FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

if (INVALID_HANDLE_VALUE == hDestinationFile) { 

printf("Erorr open output file 'n"); 

system("Pause"); 

return 0; 

} 



hKeyFile = CreateFile( "key.txt" , FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

if (INVALID_HANDLE_VALUE == hKeyFile) { 

printf("Erorr open key file 'n 'n"); 

system("Pause"); 

return 0; 

} 





//dwBufferLen = GetFileSize(hSourceFile, NULL); 

//pbBuffer = (BYTE *)malloc(dwBufferLen); 

//ReadFile(hSourceFile, pbBuffer, dwBufferLen, &dwCount, NULL); 





t = clock(); 

//---------------------------------------------------------------------------------- // 



// Initialization of cryptoprovider 

cout << "  Create  provider" << endl; 

if (!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0)) { 

printf("    Provider is not initialized............ERROR!'n"); 

cout <<"  " << GetLastError() << endl; 

system("Pause"); 

return 0; 

} else { 

printf("    Provider is initialized...................Ok'n'n"); 

}  

//---------------------------------------------------------------------------------- // 





printf("    Key BLOB has been written to the file.....Ok 'n"); 

} 



bool fEOF = FALSE; 

do { 

// Read up to dwBlockLen bytes from the source file.  

if (!ReadFile(hSourceFile, pbBuffer, dwBlockLen, &dwCount, NULL)) { 

printf("Error reading plaintext!'n"); 

break; 

} 

if (dwCount < dwBlockLen) { fEOF = TRUE; } 



// Encrypt data.  

if (!CryptEncrypt(hKey, NULL, fEOF, 0, pbBuffer, &dwCount, dwBufferLen)) { 

printf("Error during CryptEncrypt. 'n"); 

break; 

} 



// Write the encrypted data to the destination file. 

if (!WriteFile(hDestinationFile, pbBuffer, dwCount, &dwCount, NULL)) { 

printf("Error writing ciphertext.'n"); 

break; 

} 



} 

while (!fEOF); 







float sizeFile = GetFileSize(hSourceFile, NULL); 



cout << "  Test speed:" << endl; 



cout << " File 'input.txt'" << endl; 

cout << " Size File " << sizeFile / 1024.0 / 1024.0 << " MBytes" << endl << endl; 





t = clock() - t; 

cout << " Encryption time " << ((float)t) / CLOCKS_PER_SEC << " seconds" << endl; 

cout << " Encryption speed " << sizeFile / ((float)t / CLOCKS_PER_SEC) / 1024.0 / 1024.0 << " MByte/s" << endl << endl; 



//printf("It took me %d clicks (%f seconds).'n", t, ((float)t) / CLOCKS_PER_SEC); 

//printf("Speed: %f Mb/s 'n", sizeFile / ((float)t / CLOCKS_PER_SEC) / 1024.0 / 1024.0); 





if (pbKeyBlob) { free(pbKeyBlob); } 

if (pbBuffer) { free(pbBuffer); } 



if (hKeyFile) { CloseHandle(hKeyFile); } 

if (hSourceFile) { CloseHandle(hSourceFile); } 

if (hDestinationFile) { CloseHandle(hDestinationFile); } 





// Release the session key. 

if (hKey) { 

if (!(CryptDestroyKey(hKey))) { 

printf("Error during CryptDestroyKey!'n"); 

cout << "  " << GetLastError() << endl; 

system("Pause"); 

return 0; 

} 

} 

// Release the provider handle.  

if (hCryptProv) { 

if (!(CryptReleaseContext(hCryptProv, 0))) { 

printf("Error during CryptReleaseContext!'n"); 

cout << "  " << GetLastError() << endl; 

system("Pause"); 

return 0; 

} 

} 





system("Pause"); 

return 0; 

}

 

  • Curtir 1
Link para o post
Compartilhar em outros sites

@Honório Lucas Parece que você pegou esse código da documentação do Windows, onde tinha lá um exemplo de como criptografar um arquivo, e mudou algumas coisas.

Isso explica o motivo dos comentários serem todos em inglês :D

 

Bem, Imagino que vai ser difícil te ajudarem, tendo em vista que o código nem sequer é seu... Se quiser, mostre aí o que conseguiu fazer por conta própria, que aí nós te ajudamos no que você precisar.

Abraço.

  • Curtir 2
Link para o post
Compartilhar em outros sites
printf("    Key BLOB has been written to the file.....Ok 'n"); 

//} remova essa chave



bool fEOF = FALSE; 

do { 

Remova essa chave "}"

 

Nas linhas em que aparecem os erros, acrescente um "A" no final da função. Exemplo:

//hKeyFile = CreateFile( "key.txt" , FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); troque por
hKeyFile = CreateFileA( "key.txt" , FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

 

Obs.: você está misturando c com c++. No lugar de printf use cout.

  • Curtir 2
  • Amei 1
Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Aprenda a ler resistores e capacitores

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!