我无法弄清楚。 它使用密钥进行加密,更改密钥后,输出将完全不同。天才。 但是,我有使用的密钥,我只是不知道如何解密。 因此,如果有人可以为这种加密方法起一个名字,并且/或者告诉我如何解密使用它加密的字符串,那将不胜感激。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <arpa/inet.h>
static uint32_t table_key = 0xdedefbaf; // here is the key
void *x(void *, int);
int main(int argc, char **args)
{
void *data;
int len, i;
if (argc != 3)
{
printf("Usage: %s <string> <data>\n", args[0]);
return 0;
}
if (strcmp(args[1], "string") == 0)
{
data = args[2];
len = strlen(args[2]) + 1;
}
else
{
printf("Unknown data type `%s`!\n", args[1]);
return -1;
}
printf("XOR'ing %d bytes of data...\n", len);
data = x(data, len);
for (i = 0; i < len; i++)
printf("\\x%02X", ((unsigned char *)data)[i]);
printf("\n");
}
void *x(void *_buf, int len)
{
unsigned char *buf = (char *)_buf, *out = malloc(len);
int i;
uint8_t k1 = table_key & 0xff,
k2 = (table_key >> 8) & 0xff,
k3 = (table_key >> 16) & 0xff,
k4 = (table_key >> 24) & 0xff;
for (i = 0; i < len; i++)
{
char tmp = buf[i] ^ k1;
tmp ^= k2;
tmp ^= k3;
tmp ^= k4;
out[i] = tmp;
}
return out;
}
答案 0 :(得分:0)
这是一种对称加密,它只是将输入字符串的每个字节与密钥的四个字节进行异或。要解密它,您需要将输出作为输入运行。
示例:
./sotest string "dies ist ein test"
XOR'ing 18 bytes of data...
\x30\x3D\x31\x27\x74\x3D\x27\x20\x74\x31\x3D\x3A\x74\x20\x31\x27\x20\x54
如果用echo -e
转换字节的十六进制表示,则会得到
echo -e "\x30\x3D\x31\x27\x74\x3D\x27\x20\x74\x31\x3D\x3A\x74\x20\x31\x27\x20\x54"
0=1't=' t1=:t 1' T
通过程序运行并获取
./sotest string "0=1't=' t1=:t 1' T"
XOR'ing 19 bytes of data...
\x64\x69\x65\x73\x20\x69\x73\x74\x20\x65\x69\x6E\x20\x74\x65\x73\x74\x00\x54
(我们现在还有一个字节,我们发现了一个错误。)
使用该输入运行echo -e
会导致
echo -e "\x64\x69\x65\x73\x20\x69\x73\x74\x20\x65\x69\x6E\x20\x74\x65\x73\x74\x00\x54"
dies ist ein testT
Das NUL字节\x00
结束于C字符串,但这不是C字符串,因此尾随T
。