generateKey cpp 函数

generateKey cpp function

你好,我的一个函数 generateKey() 有问题 returns char*。 它生成密钥正常但是当我打印它时我可以看到一些奇怪的东西。

char* aesStartup::generateKey()
{
    const char alphanum[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char newKey[32];
    srand(time(0));
    for (int i = 0; i < 32; i++)
        newKey[i] = alphanum[rand() % 62];
    cout << newKey;
    return newKey;
}

输出:u6gWj8dBHxJhEztsHXfE5V3HSvZ2zVNb╠╠╠╠╠╠╠╠0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

有人可以帮助我吗?

您有两个严重问题:

  1. 首先你好像忘记了C++中的字符串真的叫做null-terminated字符串

    要使字符数组成为“字符串”,它需要以 '[=10=]' 字符结尾。这也意味着一个 32 个字符的字符串需要有 33 个元素。

  2. 第二个问题是你return一个指向本地数据的指针。

    一旦函数generateKey returns,所有局部变量的生命周期结束,指向它们的指针将失效。

您可以非常轻松地解决这两个问题:停止对字符串使用字符数组,并开始对所有字符串使用 C++ 标准 std::string class。


另一方面,您应该只在您的程序中调用 srand 一次。与 C 兼容函数 srandrand.

相比,C++ 在生成随机数方面具有更好的 functions and classes

您的字符末尾缺少 [=10=] (NUL) 字符。在 newKey[31] 需要 [=12=]。否则你打印的比你想要的多。

在您的示例中,[=12=] 在末尾的 alphanum 内,位置 63。因此程序读取所有内存,直到它“看到”[=12=]

要么你切换到使用 std::string 来为你处理这个问题,要么你需要确保你所有的 char 数组都是空终止的,方法是:

  • 使它们比您的预期输出大一:char newKey[33];

AND

  • 在末尾插入'[=19=]'newKey[32] = '[=20=]';.