Problema de criptografia de arquivo binário
Pergunta
Estou tendo um problema ao criptografar alguns dados no arquivo. Estou usando o simples xor para isso. digamos que eu tenho esta estrutura:
struct MyFile{
char fileName[128];
int account;
float balance;};
Salvar isso como um arquivo binário está funcionando corretamente, mas quando eu uso o XOR para criptografar o nome do arquivo na estrutura e salvar a estrutura em HD, lendo a estrutura e descriptografar o nome do arquivo não está mostrando os caracteres corretamente. Estou usando essa função simples para a finalidade de criptografia/descriptografia.
static void Codec(const char *key,int keySize,char* in,char *result,int length)
{
for(int i=0;i<length;i++)
result[i]=in[i]^key[i%keySize];
}
Observe que, quando criptografar o nome do arquivo e descriptografar -o diretamente na memória, o resultado está certo. O que estou perdendo, por que ele está sendo alterado quando salvo no disco rígido. Por favor, responda o mais rápido possível e o TNX ...
Solução
Observe que você precisa abrir os arquivos no modo binário ("rb"/"wb" em vez de "r"/"w" para fopen
). As implementações do Windows C em particular têm problemas em relação \n
<->\r\n
conversão.
Também é uma boa ideia usar unsigned char
s para operações aritméticas e bitwewwward; Qualquer coisa, exceto o complemento de 8 bits Two, os chars assinados podem causar problemas (o que, concedido, a maioria das implementações usa e pode não causar nenhum problema com a criptografia simétrica XOR, mas ainda é bom ter cuidado.)
Outras dicas
Primeiro, determine se os dados estão realmente sendo alterados quando são gravados no disco. Faça com que seu programa imprima a string nesses quatro lugares:
- Antes de criptografá -lo
- Depois de criptografá -lo, mas antes de escrevê -lo no disco
- Depois de ler no disco, mas antes de descriptografá -lo
- Depois de descriptografá -lo
Os resultados são os #2 e #3 iguais? Nesse caso, o arquivo não está sendo alterado durante a transferência para o disco e a volta.
Se #2 e #3 forem diferentes, tente escrever a corda não criptografada no disco e lendo -a de volta. Isso funciona com sucesso?
Escreva apenas uma única estrutura em um arquivo e examine o conteúdo do arquivo em um editor hexadecimal. Como é o arquivo enquanto está no disco?
Publique seu código de gravação em disco e leitura de disco, parte do problema pode estar lá.
Você deve abrir o arquivo no modo binário. Se você usa CI/O (como eu normalmente faço), isso significa
FILE *input_file = fopen(input_file_name, "rb");
FILE *output_file = fopen(output_file_name, "wb");
Se você foi levado a usar fluxos C ++, isso significa
std::ifstream input_file(input_file_name, ios::in | ios::binary);
std::ofstream output_file(output_file_name, ios::out | ios::binary);