我正在使用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())
答案 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);