字符串到 SecByteBlock 的转换问题
String to SecByteBlock Conversion Issues
我在为 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;
}
I attempt to change the key using string output from DES_EDE3, it appears to use the same key
这听起来几乎像是您在尝试将 3-DES 用作使用密码键入的 PRF。如果是这样,请使用 HKDF。它专为这些类型的 expand-then 提取操作而设计。
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
sizes the memory block to DES_EDE3::KEYLENGTH
and backfills the block with 0's as needed. 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)));
我在为 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;
}
I attempt to change the key using string output from DES_EDE3, it appears to use the same key
这听起来几乎像是您在尝试将 3-DES 用作使用密码键入的 PRF。如果是这样,请使用 HKDF。它专为这些类型的 expand-then 提取操作而设计。
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
sizes the memory block to DES_EDE3::KEYLENGTH
and backfills the block with 0's as needed. 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)));