Encryption 使用MAC从DefaultEncryptor解密数据

Encryption 使用MAC从DefaultEncryptor解密数据,encryption,crypto++,chilkat,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 inf

在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);
}
//此函数Mash()的目的是获取任意长度的输入
//字符串和*确定性*生成任意长度的输出字符串,如
//(1)它看起来是随机的,(2)没有关于输入的信息是随机的
//(3)它包含尽可能多的熵,或者
//输入字符串中的熵量,以较小者为准。
静态void Mash(常量byte*in、size\t inLen、byte*out、size\t outLen、int迭代)
{
如果(BytePrecision(outLen)>2)
抛出无效辩论(“Mash:output legnth too large”);
size\u t bufSize=roundupmultipleof(outLen,(size\t)DefaultHashModule::DIGESTSIZE);
字节b[2];
SecByteBlock buf(bufSize);
SecByteBlock突发事件(bufSize);
DefaultHashModule散列;
无符号整数i;
对于(i=0;i>8);
b[1]=(字节)i;
hash.Update(b,2);
hash.Update(in,inLen);
最终散列(F+i);
}
而(迭代次数-->1)
{
memcpy(buf、exputf、bufSize);
对于(i=0;i>8);
b[1]=(字节)i;
hash.Update(b,2);
hash.Update(buf,bufSize);
最终散列(F+i);
}
}
memcpy(out、exputf、outLen);
}
根据这一页

DefaultEncryptorWithMAC使用2密钥三重DES作为默认值 加密程序,并将SHA1作为MAC的默认哈希。分组密码 在CBC模式下运行。密码是混合的,而不是派生的 使用基于密码的密钥派生函数。每一个都要通过 DefaultEncryptorWithMAC由于使用了 基于时间和时钟的盐

我正试图用另一个库读取这个加密字符串,我真的很难做到DefaultDecryptorWithMAC()的等效操作

如果我把我的秘密密钥通过并在线加密SHA1,我不会得到与上面的Mash函数相同的结果吗

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

希望这里有人有从这个库解密这些函数结果的经验

提前感谢您的评论

很明显,我知道秘密的关键——盐/钟/糖化物 使我几乎不可能解密一个已被删除的字符串 用上述方法加密

如果您查看(和)的代码,您将看到输出中包含的内容不仅仅是在混合密码下加密的数据。因此,仅在mash函数中导出“密钥”并为
DES_EDE2
密码设置密钥并在CBC模式下对其进行操作是不够的

查看第83行上的函数(从
ProxyFilter
继承而来),其中写入了序言。序言是盐和关键检查。因此,加密数据的布局为:

[SALT][KEYCHECK][ENCRYPTED DATA]
盐是根据
DefaultHashModule::DIGESTSIZE
计算的;但只写入了8个字节。然后,根据
DefaultHashModule::DIGESTSIZE
计算KEYCHECK;但只写入了
Default\u BlockCipher::Encryption::BLOCKSIZE


当需要解密时,您去掉salt并使用它重新派生IV。您去掉密钥检查并验证派生的密钥。然后,使用派生密钥和iv为解密程序设置密钥。

谢谢您的回复。我试图使用Chilkat库()来读取使用DefaultEncryptorWithMAC加密的内容,但尽管我显然知道密钥,但整个salt/clock/mashing过程使我几乎无法解密使用上述方法加密的字符串。mash和DefaultEncryptorWithMAC anywhere的其余部分的算法是否有任何伪代码?作为对作者的一种补充,这对我来说已经是伪代码了。因此,我收回了我先前的评论。也许您可以使用调试器逐步完成代码,然后尝试使用chilkat复制它?如果你被卡住了,你可以再发一次。目前还不清楚你在问什么(从示例代码中分出,这是偏离主题)。“也许你可以使用调试器来逐步地使用代码,并尝试用CHIKAT复制它”这就是我正在尝试做的,但我不是真正的C++开发者。这不是我的第一语言。我在顶级水平上想做什么?获取此
encryptor=new DefaultEncryptorWithMAC(密码短语,new base64编码器(new StringSink(ls),false))的结果;'只有知道这一点,并且密码短语实际上能够做到这一点
decryptor=newbase64解码器(newdefaultdecryptorwithmac(密码短语,newstringsink(ls));`为了恢复原来的字符串,也许有人会用上面的CHIKAT链接给我一个建议,也许这个显示了各种C++加密例子,使用他们的库来解密DefaultEncryptorWithMAC创建的字符串,然后我可以把它转换成我使用的专业语言(DATAFLX)。非常感谢您的详细回复。我可以看到
Default\u BlockCipher::Encryption::BLOCKSIZE
是8,
DefaultHashModule::DIGESTSIZE
是20。获取加密字符串(salt)的前8个字符后,我使用什么过程来获取IV?这个结果应该以某种方式匹配加密字符串的下20个字符吗?然后我是否将IV和密钥传递给desu EDE2进程以解密字符串的最后部分?再次感谢jwwI,我已经尽了最大的努力,取得了一些好的进展,但现在我陷入了困境。上面cpp文件中的DefaultDecryptor::CheckKey是我一直试图匹配的,我已经成功地在我自己的代码中获得了salt、keycheck、check、key、IV的相同值。我被卡住的位是这个位的代码`decryptor->Put(keycheck、BLOCKSIZE);解密