c - 我以前从未见过加密。这个 C 加密片段有什么作用?

标签 c encryption

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

我尽了最大努力,但所有代码对我来说都是全新的,我不知道它做了什么。我最终放弃了它,因为我还有其他事情要做。不过,我还是很有兴趣去了解一下,只是为了知识而已。任何人都可以帮助我了解更多有关此类编程的信息或它的具体作用吗?

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

这是进行实际加密的部分;据我所知,使用 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;
}

最佳答案

基本上,这所做的是 - 换个更好的术语 - 混淆输入。

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

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

如果这不是家庭作业,请将其丢弃。不要试图从中学习。这段代码没有任何正确或好的地方。

关于c - 我以前从未见过加密。这个 C 加密片段有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10729839/

相关文章:

java - 使用 BouncyCaSTLe 轻量级 API 进行 OpenPGP 加密

c# - 在 C# 中将字符串打印到字节指针

C++ 为什么不提供整数的系统最大大小?

python - 在 Go 中解密在 Python 中以 CFB 模式使用 AES 加密的内容

java - 有没有办法简化我的代码?

Java AES 加密得到不同的结果

检查双端队列实现中的无效指针

c - OpenSSL的AES_ctr128_encrypt()的参数详情

c - C 中未声明的标识符错误

javascript - 制作一个 javascript HMAC token