Mirai使用哪种加密类型?

时间:2018-08-19 01:10:15

标签: c encryption

我无法弄清楚。 它使用密钥进行加密,更改密钥后,输出将完全不同。天才。 但是,我有使用的密钥,我只是不知道如何解密。 因此,如果有人可以为这种加密方法起一个名字,并且/或者告诉我如何解密使用它加密的字符串,那将不胜感激。

    #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;
    }

1 个答案:

答案 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