c - C/C++ 中的简单 XOR 加密例程

标签 c encryption xor

我正在尝试使用 XOR 加密/解密文件。我有以下加密/解密例程,其中每个字节都进行异或运算,结果减去位于先前位置的字节的值。 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 例程本身看起来是正确的,不是吗? 请注意,我也在尝试从文件末尾开始加密文件。有什么想法吗?

谢谢!

最佳答案

下面是用 C 语言编写汇编语言函数的方法。我将变量名与寄存器名保持一致,这样您就可以看到各个部分是如何匹配的。

void do_xor_crypt(char *buffer, int count) {
    char *ecx = buffer;
    int eax = count - 1;
    if (eax > 0) {
        do {
            char dl = ecx[eax];
            dl ^= 0xC5;
            dl -= ecx[eax-1];
            ecx[eax] = dl;
            eax--;
        } while (eax > 0);
    }
}

请注意,我已检查以确保 eax 大于零(意味着 count 为 2 或更多),以便循环可以减去某些内容。您可以将此代码集成到您的阅读循环中,例如:

while (count = fread(buffer, 1, 1024, in))
{
    do_xor_crypt(buffer, count);
    if (fwrite(buffer, 1, count, out) != count)
    {
        // ...
    }
}

关于c - C/C++ 中的简单 XOR 加密例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5013343/

相关文章:

c - 有没有办法用更短的方式编写检测点是否属于区域的条件?

c - 排列数组中的数字

从 C 中的 3D 指针/数组调用 2D 指针/数组

C++读取大量文件的一小部分

java - 将 int 转换为 String,然后使用 XOR 对其进行加密

CRC8算法说明

c# - 在 C# .net 中查找字符串的校验和

php - 如何从 Node.Js 中的 phpseclib 解密 AES 密码

json - 存储和检索 RSA 加密 key

c - 与字符执行 XOR 字节比较