C中的简单字符串密码(常见问题困难)

时间:2013-03-14 03:47:18

标签: c pointers const encryption

大家好,我已经创建了一个简单的小密码函数,可以获取指向字符串的指针,然后将每个字节更改为相应的加密字符,如果通过函数运行它,它将把文本转回纯文本。 / p>

我的问题是,我想将此函数与const char *p = "...";声明的变量一起使用,但这根本不可能,因为它们在运行时被加载到内存中并且是不可写的。

这是我的功能。

char *Cipher(char *str)
{
    char *p = str;

    while(*p)
    {
        if(*p >= ' ' && *p <= 'O')
        {
            *p = ((*p + 48) % 127);
        }
        else if(*p >= 'P' && *p <= '~')
        {
            *p = ((*p - 48) % 127);
        }

        p++;
    }
    return str;
}

它只需要一个指向字符串的指针,然后替换所有字符并将指针返回给字符串(这样我就可以在其他函数中使用它,例如printf或任何接受char*作为参数的函数)。

现在我知道为了使用这些const char*指针,我将不得不将它们复制到本地内存中以修改它们的函数,但是如何返回指向新编码或解码字符串的指针我可以将它传递给其他功能。 (最终的目标是将它包含在一个简单的聊天程序中,我想称之为send(sock, Cipher(PRE_HEADER), strlen(PRE_HEADER));),我也认为我这样做的方式不是线程安全的,所以万一我决定使用带有线程的应用程序,我必须做出哪些更改?

我也接受其他替代代码用于简单的字符串替换密码。

任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:0)

你将不得不使用

strncpy( str, All.c_str(), sizeof( str ) );

在某个帮助函数中或在您调用

之前
send(sock, Cipher(PRE_HEADER), strlen(PRE_HEADER));

答案 1 :(得分:0)

您可以尝试将变量声明为char数组,而不是char指针,la:

char p[] = "...";

你将获得与以前几乎相同的效果 - 你可以将p传递给一个函数,它会很好地衰减到一个指针 - 但不是存储在只读存储器中,p将被存储在声明它的位置(在函数内的堆栈中,或者如果你在程序的数据段中使它成为静态的)。

答案 2 :(得分:0)

您可以使用Cipher复制strdup函数中的字符串并对其进行处理,并返回新字符串的指针。

类似的东西:

char *Cipher(char *str)
{
    char *new_string = strdup(str);
    char *p = new_string;

    while(*p)
    {
        if(*p >= ' ' && *p <= 'O')
        {
            *p = ((*p + 48) % 127);
        }
        else if(*p >= 'P' && *p <= '~')
        {
            *p = ((*p - 48) % 127);
        }

        p++;
    }
    /* return new_string not p */
    return new_string;
}

此外,您必须更改以下呼叫者代码才能在strlen功能中使用新字符串。但是,如果您确实知道传递给Cipher的字符串长度总是与返回字符串相同,那么您仍然可以使用strlen(PRE_HEADER)

str = Cipher(PRE_HEADER);
send(sock, str, strlen(str));