字符串到SecByteBlock转换问题

时间:2015-12-12 15:27:01

标签: c++ cryptography crypto++

我遇到了在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;
}

1 个答案:

答案 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)));