Я пытаюсь зашифровать / расшифровать файл с помощью XOR.У меня есть следующая процедура шифрования / дешифрования, где каждый байт xor'd, и результат вычитается из значения байта, который находится в предыдущем месте.Представление ASM выглядит следующим образом:
crypt:
mov dl, [eax+ecx] ; read byte
xor dl, 0C5h ; xor it with oxC5
sub dl, [eax+ecx-1] ; sub the previous byte
mov [eax+ecx], dl ; save the new byte
dec eax ; decrement pointer
test eax, eax
jg short crypt ;
Вот так должна выглядеть моя процедура шифрования, я пытаюсь перенести этот C / C ++.Мой код выглядит следующим образом:
#include <stdio.h>
unsigned int xorkey = 0xC5;
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf("usage: encoder input output\n");
return -1;
}
FILE *in = fopen(argv[1], "rb");
if(in == NULL)
{
printf("failed to open: %s", argv[2]);
return -1;
}
FILE *out = fopen(argv[2], "wb");
if(out == NULL)
{
fclose(in);
printf("failed to open '%s' for writing.",argv[2]);
return -1;
}
int count;
char buffer[1024];
while(count = fread(buffer, 1, 1024, in))
{
int i;
int end = count;
for(i = 0;i < end; ++i)
{
((unsigned int *)buffer)[i] ^= xorkey;
}
if(fwrite(buffer, 1, count, out) != count)
{
fclose(in);
fclose(out);
printf("fwrite() error\n");
return -1;
}
}
fclose(in);
fclose(out);
return 0;
}
Я не могу понять, как сделать вычитание байтов в C ++.Сама процедура XOR выглядит правильно, правда? Обратите внимание, что я также пытаюсь зашифровать файл, начиная с конца файла и до его начала. Есть идеи?
Спасибо!