在学习加密解密的过程中,我脑子不够用了。
解密函数decrypt 以及加密块函数encryptBlock与解密块函数decryptBlock 是正确的,
并且已知 加密块函数encryptBlock与解密块函数decryptBlock 是完全可逆的函数;
但是运行测试代码 ,输出信息如下:
16|16|16
密钥加密数据: 12 34 56 78 9a bc de f0 23 45 67 89 ab cd ef 01
验证加密数据: 00 00 00 00 00 00 00 7d 29 4f 48 72 03 62 e8 b9
信息框提示 信息不匹配
请为我检查加密函数 encrypt 是否为decrypt 的完全逆向函数。 并给出decrypt 的逆向版本。
不要照搬AI,我会举报。
std::vector<uint8_t> 密钥加密 = {
0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01
};//假设这个是被密钥加密过的数据,长度合适 且为8的倍数;
//本文以16字节伪数据代表 ;并且 加密块函数encryptBlock与解密块函数decryptBlock 是完全可逆的函数
std::vector<uint8_t> CMFCPKGDlg::decrypt(const std::vector<uint8_t>& body, const std::vector<uint8_t>& key)
{
if (body.size() % 8 != 0 || key.size()!=16)
{
return{};
}
std::vector<uint8_t> prev_block(8, 0);
std::vector<uint8_t> prev_original_block(8, 0);
std::vector<uint8_t> result(body.size());
int resultIndex = 0;
int remain_j = 0;
for (size_t i = 0; i < body.size(); i += 8)
{
std::vector<uint8_t> decrypt_block(8);
for (int k = 0; k < 8; k++)
{
decrypt_block[k] = prev_block[k] ^ body[i + k];
}
std::vector<uint8_t> block = decryptBlock(decrypt_block, key);
int j = remain_j;
if (i == 0)
{
int header_offset = block[0] & 0x07;
j = header_offset + 3;
}
for (; j < 8; j++)
{
result[resultIndex++] = block[j] ^ prev_original_block[j];
}
if (j > 8)
{
remain_j = j % 8;
}
else
{
remain_j = 0;
}
prev_block = block;
prev_original_block = std::vector<uint8_t>(body.begin() + i, body.begin() + i + 8);
}
//while (resultIndex > 0 && result[resultIndex - 1] == 0x0)
//{
// --resultIndex;
//}
//result.resize(resultIndex);
return result;
}
std::vector<uint8_t> CMFCPKGDlg::encrypt(const std::vector<uint8_t>& body, const std::vector<uint8_t>& key)
{
if (body.size() % 8 != 0 || key.size() != 16)
{
return {};
}
std::vector<uint8_t> prev_block(8, 0);
std::vector<uint8_t> prev_original_block(8, 0);
std::vector<uint8_t> result(body.size());
int resultIndex = static_cast<int>(body.size()) - 1;
int remain_j = 0;
for (size_t i = body.size(); i > 0; i -= 8)
{
size_t current_index = i - 8;
std::vector<uint8_t> block(8);
if (i == body.size())
{
block = prev_block;
}
else
{
for (int k = 0; k < 8; k++)
{
block[k] = body[current_index + k] ^ prev_block[k];
}
}
std::vector<uint8_t> encrypt_block = encryptBlock(block, key);
int j = remain_j;
if (i == 8) // 处理最后一个块
{
int header_offset = block[0] & 0x07;
j = header_offset + 3;
}
for (int k = 7; k >= 0; k--)
{
if (k >= j)
{
result[resultIndex--] = encrypt_block[k] ^ prev_block[k];
}
}
if (j > 8)
{
remain_j = j % 8;
}
else
{
remain_j = 0;
}
prev_block = encrypt_block;
prev_original_block = std::vector<uint8_t>(body.begin() + current_index, body.begin() + current_index + 8);
}
return result;
}
void OnBnClickedEncript()
{
std::vector<uint8_t> originalData = 密钥加密;
std::string privateKey = "woreaishenghuo!!";
std::vector<uint8_t> key(privateKey.begin(), privateKey.end());
std::vector<uint8_t> encryptedData = decrypt(originalData, key);
//此处经过手动检验 解密数据正确
std::vector<uint8_t> decryptedData = encrypt(encryptedData, key);
if (decryptedData != 密钥加密)
{
AfxMessageBox(_T("数据不匹配!"));
std::cout << originalData.size() << "|" << 密钥加密.size() << "|" << decryptedData.size() << std::endl;
std::cout << "密钥加密数据: ";
for (const auto& byte : 密钥加密) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte) << " ";
}
std::cout << std::endl;
std::cout << "验证加密数据: ";
for (const auto& byte : decryptedData) {
std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte) << " ";
}
std::cout << std::endl;
}
}