我在为crypto ++中的3键Triple DES分配新密钥时遇到问题。
我已经生成了一个新的密钥作为字符串,但是需要将其分配给SecByteBlock以便在Crypto ++中使用。
当前,我一开始使用PRNG生成一个随 secret 钥,但是当我尝试使用DES_EDE3的字符串输出来更改密钥时,它似乎使用了相同的密钥。
我认为问题在于字符串和SecByteBlock之间的转换,或分配给SecByteBlock的情况,如下所示。
任何帮助将不胜感激!
SecByteBlock GENERATOR::setKey(string keyString){
SecByteBlock replacementKey(24);
replacementKey= SecByteBlock(reinterpret_cast<const byte*>(keyString.data()), keyString.size());
return newKey = replacementKey;
}
最佳答案
听起来好像您正在尝试将3-DES用作使用密码键入密码的PRF。如果是这样,请使用HKDF。其设计用于这些类型的扩展然后提取操作。
HKDF在Crypto ++ 5.6.3及更高版本中可用。如果下层客户端需要它,则将 header 复制到需要的位置。
SecByteBlock GENERATOR::setKey(string keyString){
SecByteBlock replacementKey(24);
replacementKey= SecByteBlock(reinterpret_cast<const byte*>(keyString.data()), keyString.size());
return newKey = replacementKey;
}
尽管您将
replacementKey
的大小设置为24,但是可以通过分配replacementKey= SecByteBlock(...)
来调整它的大小。您可能要尝试以下操作:
SecByteBlock GENERATOR::setKey(const string& keyString)
{
SecByteBlock key((const byte*)keyString.data(), keyString.size());
if(key,size() < DES_EDE3::KEYLENGTH)
key.CleanGrow(DES_EDE3::KEYLENGTH);
else
key.resize(DES_EDE3::KEYLENGTH);
return key;
}
CleanGrow
将内存块的大小调整为DES_EDE3::KEYLENGTH
,并根据需要用0填充该块。如果 resize
太大,它将截断为DES_EDE3::KEYLENGTH
。您还可以执行以下操作:
SecByteBlock key(DES_EDE3::KEYLENGTH);
size_t s = STDMIN(key.size(), keyString.size());
memcpy(key.data(), keyString.data(), s);
if(s < DES_EDE3::KEYLENGTH)
memset(key.data()+s, 0, DES_EDE3::KEYLENGTH-s);
-----
结合前两个,您可以考虑以下几点:
SecByteBlock GENERATOR::setKey(const string& keyString)
{
// Block is unintialized
SecByteBlock key(DES_EDE3::KEYLENGTH);
HKDF<SHA256> kdf;
kdf.Derivekey(key.data(), key.size(), (const byte*)keyString.data(), keyString.size(), NULL, 0);
return key;
}
-----
您可以使用以下代码输出
SecByteBlock
:SecByteBlock b = GENERATOR::setKey(...);
...
cout << "Derived key: "
ArraySource as(b.data(), b.size(), true, new HexEncoder(new FileSink(cout)));
cout << endl;
以下使用Base64对其进行编码:
ArraySource as(b.data(), b.size(), true, new Base64Encoder(new FileSink(cout)));
关于c++ - 字符串到SecByteBlock的转换问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34241527/