在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函数不一样?
根据上面的网页,它似乎表明它使用标准加密技术我无法用其他任何东西解密结果
希望有人在这个库中解密这些功能的结果
提前致谢
答案 0 :(得分:0)
来自评论:
我显然知道整个盐/时钟/糖化物的秘密密钥 使我几乎不可能解密已经存在的字符串 用上述方法加密。
如果您查看DefaultEncryptorWithMAC(h file和cpp 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。
键入解密器