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 ...

Foi útil?

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 chars 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:

  1. Antes de criptografá -lo
  2. Depois de criptografá -lo, mas antes de escrevê -lo no disco
  3. Depois de ler no disco, mas antes de descriptografá -lo
  4. 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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top