在C中剪切字符串的字符

时间:2013-02-07 08:32:15

标签: c string cut

这是一些代码。

#include <stdio.h>

int main()
{
    char npass[] = "$1$bUZXMjKz$08Ps4NPTfj6ZNkoqrsP/D.";
    char salt [12];
    int i;
    for (i = 0; i < 12; i++)
    {
            npass[i+3] = salt[i];
            i++;
    }
    salt[12] = '\0';
    puts(salt);
    return 0;
}

基本上, npass md5crypt结果(密码是admin)。为了验证这一点,我需要将盐与结果分开。

我的理解是C中的字符串实际上是一个char array,其中包含所有字母(最后都是'\0')。我使用for循环来剪切前三个字符,但我想因为ASLR,我得到的结果总是随机的。实际上,没有 ASLR,我总是得到相同的随机结果。

2 个答案:

答案 0 :(得分:4)

当然你得到“随机”数据,你将分配给哈希而不是盐。你想要反过来:

salt[i] = npass[i+3];

或者你可以跳过循环并执行:

memcpy(salt, npass + 3, sizeof(salt) - 1);
salt[sizeof(salt) - 1] = '\0';

答案 1 :(得分:0)

由于已经指出了所有错误,以及一些美学修正,你应该得到这样的结论:

#include <stdio.h>
#include <string.h>

#define SALT_N 12

int main()
{
    const char npass[] = "$1$bUZXMjKz$08Ps4NPTfj6ZNkoqrsP/D.";
    char salt [SALT_N+1];

    memcpy(salt, npass, SALT_N);
    salt[SALT_N] = '\0';
    puts(salt);
    return 0;
}