【问题标题】:I've never seen encryption before. What does this C encryption snippet do?我以前从未见过加密。这个 C 加密片段有什么作用?
【发布时间】:2016-10-22 11:31:58
【问题描述】:

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

我尽了最大努力,但所有代码对我来说都是全新的,我不知道它做了什么。我最终放弃了它,因为我还有其他事情要做。但是,我仍然对学习它非常感兴趣,只是为了知识。任何人都可以帮助我了解更多关于这种类型的编程或具体的用途吗?

我会尽量减少它并给出我的印象。

这是进行实际加密的部分;据我所知,使用 XOR 加密。这个对吗?我也认为 input_2 和 input_1 被错误地切换了。

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 以将字符串转换为十进制或十六进制数字,尽管我不确定其用途。

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 次。这是最让我难过的部分。

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

最后但同样重要的是,启动它的主要功能。

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

【问题讨论】:

    标签: c encryption


    【解决方案1】:

    它的作用基本上是——为了更好的术语——混淆输入。

    这是一个非常业余的尝试,在保护和存储数据方面会非常失败。

    有许多错误,例如清除数组(可以在分配期间使用 calloc 完成),然后通过“手动”清除其中的一部分来“确保”再次清除它。这有太多太多的问题,让我既想吐又想笑。

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

    【讨论】:

    • 感谢您提供富有洞察力的意见。你有什么建议我谷歌了解更多关于这样做的正确方法?
    • 创建自己的加密算法是一件困难的事情。密码学家多年来一直在学习他们所做的事情背后的数学,他们以团队的形式设计事物,然后他们的算法被数十名其他密码学家分析。然后它变成了它们是垃圾,被扔掉了。我并不是要劝阻你,但是现在,从源代码中学到的东西并不多。相反,除了如何完成加密之外,您还应该在 google 上搜索加密是如何受到攻击的 - 数学上的。
    • 当您了解了历史上的加密方法以及该加密是如何被破解的,并遵循该历史,您将开始获得更清晰的画面。所以,我想我能指出的最好的地方是加密的历史。如果您有兴趣自己学习并理解它们,那么实现古代替代密码和您遇到的其他东西是一个值得练习的练习。
    【解决方案2】:

    有很多级别可以批评代码。

    1. 它没有任何输入或输出,因此功能可能不存在。
    2. 添加输出时,要加密的数据是固定的(32 个换行符)。
    3. “加密”是通过一种微弱的机制完成的(正确完成的 XOR 加密比 ROT-13 强,但强不了多少。
    4. 'key' 是基于 0xFF 传递给 modify_it() 函数的单个固定字节 加上 7 个零字节。
    5. 与 0 的 XOR 不会隐藏任何内容,因此代码仅更改每个 8 中的 1 个字节。
    6. 它使用最简陋的ECB(电子密码本)模式,独立加密每个8字节块,而不是任何更复杂的方案(CBC等)。
    7. 代码不演示解密。
    8. 该代码并未证明解密加密材料会留下原始材料。
    9. 不会对malloc()等调用进行错误检查。
    10. 127 格式化为leading 时出现缓冲区溢出。
    11. 严重的加密代码在完成后需要覆盖密钥。

    等等

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

    将其视为一段简单的糟糕 C 代码;如此分析。如果您有足够的知识,请密切关注加密事物,但即使对加密知之甚少,也有很多要批评的地方。

    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   ................
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多