我遇到了在crypto ++中为3键三重DES分配新密钥的问题。
我已经生成了一个新密钥作为字符串,但需要将其分配给SecByteBlock以便在Crypto ++中使用。
目前我在开始时使用PRNG生成随机密钥,但是当我尝试使用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;
}
答案 0 :(得分:0)
我尝试使用DES_EDE3的字符串输出更改密钥,它似乎使用相同的密钥
这几乎听起来像是在尝试使用3-DES作为密码输入的PRF。如果是,请使用HKDF。它专为这些类型的扩展 - 然后提取操作而设计。
HKDF可在Crypto ++ 5.6.3及更高版本中使用。如果您需要它用于下层客户端,请将标头复制到您需要的位置。
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
太大,{{3}}会截断为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)));