从DefaultEncryptorWithMAC解密数据

时间:2014-12-12 12:06:06

标签: encryption crypto++ chilkat

在CryptoPP中使用DefaultEncryptorWithMAC时,它似乎使用了这个Mash函数

// The purpose of this function Mash() is to take an arbitrary length input
// string and *deterministicly* produce an arbitrary length output string such
// that (1) it looks random, (2) no information about the input is
// deducible from it, and (3) it contains as much entropy as it can hold, or
// the amount of entropy in the input string, whichever is smaller.

static void Mash(const byte *in, size_t inLen, byte *out, size_t outLen, int iterations)
{
    if (BytePrecision(outLen) > 2)
        throw InvalidArgument("Mash: output legnth too large");

    size_t bufSize = RoundUpToMultipleOf(outLen, (size_t)DefaultHashModule::DIGESTSIZE);
    byte b[2];
    SecByteBlock buf(bufSize);
    SecByteBlock outBuf(bufSize);
    DefaultHashModule hash;

    unsigned int i;
    for(i=0; i<outLen; i+=DefaultHashModule::DIGESTSIZE)
    {
        b[0] = (byte) (i >> 8);
        b[1] = (byte) i;
        hash.Update(b, 2);
        hash.Update(in, inLen);
        hash.Final(outBuf+i);
    }

    while (iterations-- > 1)
    {
        memcpy(buf, outBuf, bufSize);
        for (i=0; i<bufSize; i+=DefaultHashModule::DIGESTSIZE)
        {
            b[0] = (byte) (i >> 8);
            b[1] = (byte) i;
            hash.Update(b, 2);
            hash.Update(buf, bufSize);
            hash.Final(outBuf+i);
        }
    }

    memcpy(out, outBuf, outLen);
}

根据此页面http://www.cryptopp.com/wiki/DefaultEncryptorWithMAC

  

DefaultEncryptorWithMAC使用双键Triple DES作为默认值   加密器和SHA1作为MAC的默认哈希。分组密码   以CBC模式运行。密码是混淆的而不是派生的   使用基于密码的密钥派生函数。每一个贯穿始终   DefaultEncryptorWithMAC由于使用而产生不同的结果   基于时间和时钟的盐。

我正在尝试用另一个库读取这个加密的字符串,我真的很挣扎,即执行DefaultDecryptorWithMAC(http://www.cryptopp.com/wiki/DefaultDecryptorWithMAC)的等效操作

如果我通过密码和在线SHA1加密,我得到的结果与上面的Mash函数不一样?

根据上面的网页,它似乎表明它使用标准加密技术我无法用其他任何东西解密结果

希望有人在这个库中解密这些功能的结果

提前致谢

1 个答案:

答案 0 :(得分:0)

来自评论:

  

我显然知道整个盐/时钟/糖化物的秘密密钥   使我几乎不可能解密已经存在的字符串   用上述方法加密。

如果您查看DefaultEncryptorWithMACh filecpp file)的代码,您会看到输出的内容多于仅在加密密码下加密的数据。所以它还不足以得出&#34;秘密密钥&#34;在mash功能中并键入DES_EDE2密码并以CBC模式操作。

在第83行查看函数DefaultEncryptor::FirstPut(继承自ProxyFilter),编写了序言。序言是盐和关键检查。所以加密数据的布局是:

[SALT][KEYCHECK][ENCRYPTED DATA]

SALT基于DefaultHashModule::DIGESTSIZE计算;但只写了8个字节。然后,KEYCHECK基于DefaultHashModule::DIGESTSIZE计算;但只写Default_BlockCipher::Encryption::BLOCKSIZE

当需要解密时,您将剥离盐并使用它来重新导出IV。您剥离密钥检查并验证您派生的密钥。然后用导出的密钥和iv。

键入解密器