我以前从未见过加密。这个C加密代码段做什么?

I've never seen encryption before. What does this C encryption snippet do?

几周前,我收到了一些代码,作为我感兴趣的加密工作应用程序的一部分。他们给我发了一个代码,基本上想看看我是否理解它,是否可以改进它。

我尽了最大努力,但所有的代码对我来说都是全新的,我不知道它做了什么。我最终放弃了这项事业,因为我还有其他事情要做。然而,我仍然对学习它很感兴趣,只是为了知识。有人能帮我了解更多关于这种编程的知识吗?或者具体来说,这有什么作用?

我会尽量把它剪下来给你留下印象。

这是执行实际加密的部分;从我可以了解到的情况来看,使用XOR加密。这是正确的吗?我还认为输入_2和输入_1被错误地切换。

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef int int32;
typedef char int8;

void change_it(int8 *output, int8 *input_1, const int8 *input_2, int32 length)
{
    int32 i = 0;

    for(i=0; i<length; i++)
    {
        output[i] = (int8)(input_1[i] ^ input_2[i]);
    }
    return;
}

在这里,他们重载了一个itoa,使字符串变成十进制或十六进制数字,尽管我不确定是为了什么目的。

1
2
3
4
5
6
7
8
9
10
11
void itoa( int32 num, int8  *alpha, int32 radix )
{
    if( radix == 10 )
    {
        sprintf(alpha,"%i", num);
    }
    else if( radix == 16 )
    {
        sprintf(alpha,"%X", num);
    }
}

这是main调用的主运行函数。它做了一些奇怪的位操作,然后调用change-it 4次。这是最令我头疼的部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int8 *modify_it(int32 modifier, const int8  *input_1, int32 length)
{
    int8  leading[3];
    int32 i_leading;
    int8 * temp_string = NULL;
    int8 * ret;
    int32 i = 0;

    itoa(modifier/2, leading, 10);
    i_leading = atoi(leading);

    temp_string = (int8 *) malloc(8);
    ret = (int8 *) malloc(length);
    memset(temp_string, 0, 8);
    temp_string[0] = 0;

    if( (modifier+1)%2 == 0 ) {
        temp_string[0] = (int8)((i_leading<<4) + 8);
    }
    else {
        temp_string[0] = (int8)(i_leading<<4);
    }

    for(i=0; i<(length>>3); i++)
    {
        change_it(ret+i*8, temp_string, input_1+i*8, 8);
    }
    free(temp_string);

    return ret;
}

最后,但绝不是最不重要的,启动它的主要功能。

1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char **argv) {

    int8 data[32];
    memset(data, 0x0A, sizeof(data));

    int8 *resp = modify_it(0xFF, data, sizeof(data));

    free(resp);
    system("PAUSE");
    return 0;
}


基本上,它的作用是——为了更好的术语——模糊输入。

这是一个非常不专业的尝试,在安全和存储数据方面都会非常失败。

有很多错误,比如清除一个数组(在使用calloc分配的过程中可能已经完成了),然后通过"手动"清除其中的一部分来"确保"它再次被清除。这有太多,太多的问题了,这让我既想吐又想笑。

如果这不是家庭作业,把它扔掉。不要试图从中学习。这段代码没有正确或好的地方。


在许多层面上,对代码进行批判。

  • 它没有任何输入或输出,因此函数也可能不存在。
  • 添加输出时,要加密的数据是固定的(32新行)。
  • "加密"是用一种很弱的机制完成的(XOR Encryption Done Right比ROT-13强,但不是很多。
  • "key"是基于传入modify_it()函数的0xFF的单个固定字节。加上7个零字节。
  • 带有0的XOR不隐藏任何内容,因此代码只改变每个8中的1个字节。
  • 它使用最基本的ECB(电子码本)模式,独立加密每个8字节块,而不是任何更复杂的方案(CBC等)。
  • 代码不演示解密。
  • 代码并不能证明解密加密的材料会留下原始的材料。
  • 它不会错误地检查诸如malloc()之类的调用。
  • 当把127格式化为leading时,缓冲区溢出。
  • 严重的加密代码一旦完成就需要覆盖密钥。
  • 等。

    总之,"忽略此代码"建议是合理的。但是,发送给您的公司可能完全意识到它是垃圾。他们想看看你会遇到什么问题,你会如何分析它,如果你提供了补救措施,你会提供什么补救措施。

    把它当作一段简单的坏C代码;这样分析它。如果你有足够的知识去做的话,一定要密切关注一些事情,但是即使你对加密不太了解,也有很多事情需要批评。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Before:
    0x0000: 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A   ................
    0x0010: 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A   ................
    After:
    0x0000: F2 0A 0A 0A 0A 0A 0A 0A F2 0A 0A 0A 0A 0A 0A 0A   ................
    0x0010: F2 0A 0A 0A 0A 0A 0A 0A F2 0A 0A 0A 0A 0A 0A 0A   ................
    Decrypt:
    0x0000: 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A   ................
    0x0010: 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A   ................