我在为 crypto++ 中的 3 key 三重 DES 分配新 key 时遇到问题。
我已经生成了一个字符串形式的新 key ,但需要将其分配给 SecByteBlock 以便在 Crypto++ 中使用。
目前我在开始时使用 PRNG 生成一个随 secret 钥,但是当我尝试使用 DES_EDE3 输出的字符串更改 key 时,它似乎使用相同的 key 。
我认为问题在于字符串和 SecByteBlock 之间的转换,或者分配给 SecByteBlock,如下所示。
如有任何帮助,我们将不胜感激!
SecByteBlock GENERATOR::setKey(string keyString){
SecByteBlock replacementKey(24);
replacementKey= SecByteBlock(reinterpret_cast<const byte*>(keyString.data()), keyString.size());
return newKey = replacementKey;
}
最佳答案
I attempt to change the key using string output from DES_EDE3, it appears to use the same key
听起来您几乎像是在尝试将 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 回填该 block 。 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/