Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Gustavo Andretto

C++ criptografar arquivo binário

Recommended Posts

Olá pessoal, estou criando um joguinho 2D em C++ que possui dois arquivos de configuração em binário.

Gostaria de aprender como criptografar os arquivos, preciso que seja rápido para descriptografar mas ao mesmo tempo, que deixe bem embaralhado para impossibilitar a leitura através de um editor hexadecimal. Agradeço desde já quem puder me ajudar. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se estiver em binário, é meio complicado pois tudo se resume a 0's e 1's, porém você pode criar um algorítimo, ou buscar algum online, que criptografe o texto do arquivo e crie um arquivo no output, e você pode implementar a função de descriptografar diretamente no jogo, assim você só deixa o arquivo criptografado anteriormente pelo algorítimo, nos arquivos do jogo, e ao abrir o jogo, ele já vai descriptografar e armazenar as informações.

 

Esse algorítimo que criptografa, você pode criar como um programa separado do jogo, como uma tool para desenvolvimento, ai toda vez que for editar os arquivos do jogo você so usa para criptografar os arquivos e descriptografa-los, sem precisar alterar o codigo do jogo.

 

Exemplo de criptografia: Você pode criar usar um alfabeto ANSI, e um que represente os codigos (considerando que contem a mesma quantidade de elementos que o alfabeto ansi), ai a parte da senha para descriptografar pode ser usado como jump, para um calculo qualquer, que faça embaralhar o uso dos codigos(os que representam uma letra ansi), exemplo:

 

Palavra a ser criptografada:  agua

ANSI:         a b c d e f g h  i  j  k l m n o p q r s  t  u v x w y z

CODIGOS: y r  s L  t 0 b Y x n v o g  m a r d c k w e z 1 2 3 4

 

Se criptografar a palavra: agua sem uma senha seria:

ybey

Isso é inseguro, pois se alguém estivesse usando o alfabeto ANSI e CÓDIGO, traduziria rapidinho, porém se usarmos uma senha que possa criar um pulo no código, onde y poderia ser 1, sendo que só quem tivesse a senha poderia descriptografar corretamente, ajudaria a evitar isso. Vamos usar uma senha de 3 números, onde o calculo é usar pular a letra do código (como y) a cada um dos 3 numeros, exemplo

a senha é 123, vamos pular de 3 para 1, e o código já traduzido é ybey, o pulo do código seria:

y -> t   -> pulo de 3

b -> t   -> pulo de 2

e -> b  -> pulo de 1

y -> t  -> pulo de 3(começamos de novo)

 

Resultado da criptografia da palavra água:

agua -> ybey -> ttbt (senha 123)

 

 

P.S: Existem muitos métodos de criptografar, uns que envolvem muitos cálculos matemáticos, outros que usam a memoria, informações do computador, etc, porém dependendo do objetivo, você precisa ter certeza do trabalho que deseja, se for um projeto pequeno não ha necessidade de se preocupar tanto com criptografia, se possível sempre procure pesquisar cálculos, mesmo que simples, para uma criptografia que não seja árdua de fazer, e não leve a perca de dados.

 

Bom projeto.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@1freakday  Obrigado por responder!

Depois de algumas horas panguando, consegui fazer um código que cifra e decifra.

Porém, só consigo encriptar texto, preciso encriptar um vetor de estrutura e salvar em um arquivo,

 

Código para cifrar;

void Enc(unsigned char* Source, int Size, int Key)
{
	int i;
	for (i = 0; i < Size; i++) 		// Para cada elemento do ponteiro é feito uma 
		Source[i] += (Key * (i + 1));	// atribuição por adição com o resultado a expressão.
}	

Código para decifrar;

void Dec(unsigned char* Source, int Size, int Key)
{
	int i;
	for (i = 0; i < Size; i++)
		Source[i] -= (Key * (i + 1)); // Para decifrar basta aplicar a operação inversa usada pra encriptar.
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Interessante o uso de operadores bit a bit, pena que o calculo é simples porém valido.Pelo que eu percebi, você usa apenas um inteiro para a chave, tenta usar um vetor, que representa uma quantidade maior de inteiros e a criptografia fica mais difícil de 'quebrar'.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@1freakday Opa obrigado pela dica, acabei de implementa-la no código.

 

Quanto a:

Citação

Porém, só consigo encriptar texto, preciso encriptar um vetor de estrutura e salvar em um arquivo

 

eu consegui resolver fazendo um memcpy da struct para um vetor de char.

 

Segue abaixo o código completo:

#include <iostream>
#include <fstream>

#define QTD 32

typedef struct
{
	char Test[16];
	int Value;
	int Secret;
}test_t;

using namespace std;

unsigned char EncDec_Key[32] = { 0x10, 0xD5, 0xCD, 0x0E, 0x4C, 0x4D, 0x31, 0xE1, 0x8A, 0x6F, 0xC6, 0x75, 0x7B, 0x2C, 0xD9, 0xDD,
								  0xB6, 0xAA, 0x3F, 0x42, 0xDE, 0xDB, 0x2D, 0xB2, 0x36, 0xCC, 0xDE, 0xFC, 0x84, 0x78, 0x2D, 0x32 };

void EncDec(char* Source, int Size)
{ 					
	int i, j;
	for (i = 0; i < Size; i++)
	{
		for (j = 0; j < sizeof(EncDec_Key); j++) 
			*Source ^= (EncDec_Key[j] * (i + 1)); // Para cada elemento do ponteiro, é feito uma atribuição XOR com o resultado da expressão;				
		Source++; // Incrementa para apontar para o próximo elemento do ponteiro;
	}
}

void preencher(test_t* tst)
{
	for (int i = 0; i < QTD; i++)
	{
		strcpy_s(tst->Test, "Teste");
		tst->Secret = 2016;
		tst->Value = 22;
		tst++;
	}
}

int main()
{
	test_t Test[QTD];
	test_t Test_Dec[QTD];

	char* buffer = new char[sizeof(Test)];

	memset(Test, 0, sizeof(Test));
	memset(Test_Dec, 0, sizeof(Test));
	memset(buffer, 0, sizeof(Test));

	// Grava um valor qualquer em Test;
	preencher(Test);

	// Copia todos os dados de Test para buffer;
	memcpy_s(buffer, sizeof(Test), Test, sizeof(Test));

	// Cifra os dados em buffer;
	EncDec(buffer, sizeof(Test));

	// Grava em um arquivo os dados de buffer;
	ofstream ofile;
	ofile.open("Teste.bin", ios::binary);
	ofile.write((const char*)buffer, sizeof(Test));
	ofile.close();

	// Abre para leitura e grava os dados em buffer
	ifstream ifile;
	ifile.open("Teste.bin", ios::binary);
	ifile.read(buffer, sizeof(Test));
	ifile.close();

	// Decifra os dados em buffer
	EncDec(buffer, sizeof(Test));

	// Copia todos dados de buffer para Test_Dec;
	memcpy_s(Test_Dec, sizeof(Test), buffer, sizeof(Test));
	delete[] buffer;

	// Grava em um arquivo os dados de Test_Dec;
	ofile.open("Teste_Dec.bin", ios::binary);
	ofile.write((const char*)Test_Dec, sizeof(Test));
	ofile.close();

	return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×