1

我正在使用 Crypto++ 使用 AES 加密字符串。好的,它工作正常,但现在我想创建一个返回作为键的字节值的函数。

byte AESBest::gen_key()
{
    AutoSeededRandomPool prng;

    // warning: address of local variable ‘key’ returned [enabled by default]
    byte key[AES::MAX_KEYLENGTH];

    prng.GenerateBlock(key, sizeof(key));

    //Error: invalid conversion from ‘byte {aka unsigned char}’ to ‘const byte* {aka const unsigned char*}’ [-fpermissive] }
    return key;
}

好。我无法归还钥匙,因为有些事情不清楚。当我设置byte key[AES::MAX_KEYLENGTH]eclipse 时,向我显示似乎返回的警告。但是最后返回键时,出现了关于无效转换的奇怪错误。

为什么会这样?

我怎么解决这个问题?


编辑:嗯。现在我有这两个功能。但是第一个效果很好,返回了 aes 键的 64 个字符。(gen_all)

第二个——我不知道为什么——只返回 4 个!为什么?(gen_part)

string AESBest::gen_all()
{
    AutoSeededRandomPool prng;
    byte key[AES::MAX_KEYLENGTH];
    prng.GenerateBlock(key, sizeof(key));

    string encoded;
    encoded.clear();
    StringSource(key, sizeof(key), true,
        new HexEncoder(
            new StringSink(encoded)
        )
    );
    return encoded;
}

和:

string AESBest::gen_part()
{
    AutoSeededRandomPool prng;
    std::vector<byte> key(AES::MAX_KEYLENGTH);
    prng.GenerateBlock(key.data(), key.size());

    string encoded;
    encoded.clear();
    StringSource(key.data(), sizeof(key.size()), true,
        new HexEncoder(
            new StringSink(encoded)
        )
    );

    return encoded;
}

第二个的bug在哪里?

编辑:没关系!错误在sizeof,所以 key.size() NO sizeof(key.size())

4

2 回答 2

3

您不能在 C++ 中返回原始数组(也不能将它们作为函数参数按值传递)。相反,使用std::vector<byte>

std::vector<byte> key(AES::MAX_KEYLENGTH);
prng.GenerateBlock(key.data(), key.size());
return key;

您必须相应地修改函数返回类型。使用key.data()or&key[0]获取指向底层数据数组的指针。

于 2011-10-31T13:24:01.460 回答
2
  • 警告原因:您正在返回一个指向本地数组的指针。这是错误的,因为退出函数后局部变量将被删除。

  • 错误原因:编译器期望您返回一个byte值,但您返回的是一个指针。

试试这个:

void AESBest::gen_key(byte *key, int size)
{
  AutoSeededRandomPool prng;
  prng.GenerateBlock(key, size);
}

并像下面这样称呼它:

byte key[AES::MAX_KEYLENGTH];
gen_key(key, AES::MAX_KEYLENGTH);
于 2011-10-31T13:25:07.603 回答