c++ - 声明相同类型的变量并重用它们

标签 c++ crypto++

我有以下情况,想知道是否有一个好的解决方案。

我正在使用Crypto++并声明以下内容:

if (_HashType == SHA1)
{
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf;
    pbkdf.DeriveKey(...)
}
else if (_HashType == SHA256)
{
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf;
    pbkdf.DeriveKey(...)
}
else if (_HashType == SHA384)
{
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA384> pbkdf;
    pbkdf.DeriveKey(...)
}
else if (_HashType == SHA512)
{
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA512> pbkdf;
    pbkdf.DeriveKey(...)
}

我想做的是这样的:

PKCS5_PBKDF2_HMAC<?> pbkdf;     
if (_HashType == SHA1)
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA1> pbkdf;
else if (_HashType == SHA256)
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA256> pbkdf;
else if (_HashType == SHA384)
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA384> pbkdf;
else if (_HashType == SHA512)
    PKCS5_PBKDF2_HMAC<CryptoPP::SHA512> pbkdf;

pbkdf.DeriveKey(...)    

有什么建议吗?

最佳答案

PKCS5_PBKDF2_HMAC<> 的公共(public)基类是 PasswordBasedKeyDerivationFunction ,所以你可以做的是:

PasswordBasedKeyDerivationFunction* pbkdf;     
if (_HashType == SHA1)
    pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA1>();
else if (_HashType == SHA256)
    pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA256>();
else if (_HashType == SHA384)
    pbkdf = new PKCS5_PBKDF2_HMAC<CryptoPP::SHA384>();
else if (_HashType == SHA512)
    pbkdf = PKCS5_PBKDF2_HMAC<CryptoPP::SHA512>();

pbkdf->DeriveKey(...)    

//...
delete pbkdf;

如果您使用的是C++11或更高版本,则可以使用智能指针,而不必担心内存管理:

std::unique_ptr<PasswordBasedKeyDerivationFunction> pbkdf;     

if (_HashType == SHA1)
    pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA1>());
else if (_HashType == SHA256)
    pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA256>());
else if (_HashType == SHA384)
    pbkdf.reset(new PKCS5_PBKDF2_HMAC<CryptoPP::SHA384>());
else if (_HashType == SHA512)
    pbkdf.reset(PKCS5_PBKDF2_HMAC<CryptoPP::SHA512>());

pbkdf->DeriveKey(...)

关于c++ - 声明相同类型的变量并重用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33242428/

相关文章:

c++ - RSA 签名大小不匹配

c++ - sizeof(值)与 sizeof(类型)?

c++ - 错误 C2039 : 'next' : is not a member of 'chain<T>' with [T=Person]

c++ - 24 位图像中有多少种颜色组合

c++ - 从 CORBA::Char* 到 CORBA::Char 的无效转换

c++ - Crypto++ DefaultEncryptor/DefaultDecryptor 方案

c++ - 使用 RSA key 时,rjindael.cpp、函数 AESNI_Enc_Block 崩溃

c++ - 从另一个进程重新启动一个进程

c++ - 使用 Qt 程序构建 crypto++ 时出现链接器错误

c++ - AES CTR 模式 - 使用 Crypto++ 加密\解密 - 我做得对吗?