我已经尝试使用Crypto ++解密了一段时间,但是它不起作用。解密消息的前16个字节不是预期的文本。我已经尝试解决该问题,但没有找到任何方法。可以找到我的旧帖子here。值得一提的是:我为共享机密和IV使用了一个相同的密钥。也许有人知道Minecraft protocol(this部分),或者可以提及代码错误。
std::vector<unsigned char> data;
std::string sendString;
for (unsigned char c : data) {
sendString += c;
}
std::string sDecryptedSharedSecret = "aaaaaaaaaaaaaaaa";
byte IV[AES::BLOCKSIZE];
memcpy(IV, sDecryptedSharedSecret.c_str(), 16);
/* De/Encryptor */
CFB_Mode<AES>::Decryption AESDecryptor((byte*)sDecryptedSharedSecret.c_str(), (unsigned int)16, IV, 1);
/* Encrypt Data */
std::string sSource(sendString);
std::string sTarget("");
try {
StringSource(sSource, true,
new StreamTransformationFilter(AESDecryptor,
new StringSink(sTarget)
)
);
}
catch (Exception) {
std::cout << "Something went wrong\n";
}
std::cout << sTarget << std::endl;
如果以下明文:
The quick brown fox jumps over the lazy dog
使用AES-CFB8和以下密钥/ IV加密:
0x61616161616161616161616161616161
(或Utf-8解码:aaaaaaaaaaaaaaaa
),以下密文结果:
0x05DEDD51C250E99EB8CD5C201C1DC7104AFB6573541CA91A10455D715BDA809D2739AD3EBC00F504E56EE4
使用
std::vector<unsigned char> data {0x05, 0xDE, 0xDD, 0x51, 0xC2, 0x50, 0xE9, 0x9E, 0xB8, 0xCD, 0x5C, 0x20, 0x1C, 0x1D, 0xC7, 0x10, 0x4A, 0xFB, 0x65, 0x73, 0x54, 0x1C, 0xA9, 0x1A, 0x10, 0x45, 0x5D, 0x71, 0x5B, 0xDA, 0x80, 0x9D, 0x27, 0x39, 0xAD, 0x3E, 0xBC, 0x00, 0xF5, 0x04, 0xE5, 0x6E, 0xE4};
此密文可以使用发布的代码成功解密。 即该代码显然有效,并且不是问题的原因。
对此问题的可能解释可能是在CFB8中:
如果data
在actual密文之前仅包含one个额外的字节(甚至更多字节),则会对entire第一个块(16个字节)产生错误的解密)的实际密文,可以通过在上述示例的开头添加任意字节来轻松说明。类似的效果在开始时会有一个修改或丢失的字节(甚至更多的字节),可以类似地进行演示。由于CFB是stream cipher(即,明文和密文具有相同的长度),因此可以通过比较明文和密文的长度来进行测试(至少在附加字节或丢失字节的情况下)。也许不小心包含了其他字符(例如,换行符或类似字符等空白字符)。
出于进一步考虑,如果发布一个密文示例,该密文的第一个块被错误地解密,其中包括采用合适编码(十六进制或Base64)的明文和密钥,则类似于我的示例,这可能会很有用。