如何在Crypto ++中返回字节值?

时间:2011-10-31 13:20:11

标签: c++ return aes crypto++

我正在使用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时,向我显示似乎要返回的警告。 但是当在最后返回键时,有关无效转换的奇怪错误。

为什么会这样?

我该如何解决这个问题?


编辑:好吧。现在我有这两个功能。但是第一个效果很好,返回了64个字符的aes键。 (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;
}

第二个错误在哪里?

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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);