在 C++ 中使用跨数据包字节的 10 字节密钥解密旋转 XOR

Decrypt rotating XOR with 10-byte key across packet bytes in C++

试图弄清楚如何用 C++ 编写一些东西,将旋转 XOR 解密为大小不同的数据包字节,并使用已知的 10 字节密钥(密钥可以是 ascii 或十六进制,无论哪个更容易)。

例如:

XOR 10 字节十六进制密钥:41 30 42 44 46 4c 58 53 52 54

ASCII 中的 XOR 10 字节密钥:A0BDFLXSRT

这是十六进制的“这是我的明文消息”,需要用上述密钥解密

15 58 2B 37 66 25 2B 73 3F 2D 61 5D 27 37 35 2D 3F 36 72 3D 2F 10 21 28 23 2D 2A 73 26 31 39 44

我需要一种方法将我的 XOR 密钥以循环方式应用到这些字节的顶部:

41 30 42 44 46 4c 58 53 52 54 41 30 42 44 46 4c 58 53 52 54 41 30 42 44 46 4c 58 53 52 54 52 54 15 58 2B 37 66 25 2B 73 3F 2D 61 5D 27 37 35 2D 3F 36 72 3D 2F 10 21 28 23 2D 2A 73 26 31 39 44

当我将它们异或在一起时,我再次获得可读格式的数据:

“这是我的明文消息”

我见过一些使用整个 XOR 密钥并将其应用于每个字节的示例,但这不是我需要的。它需要以某种方式轮换字节,直到到达数据末尾。

有没有人可以帮忙?

您只需使用一个循环和一个模运算,将密钥的一个字节与密文的一个字节进行异或。

void decrypt(char *cypher, int length, char* key) {
    for (int i = 0; i < length; i++) cypher[i] ^= key[i % 10];
}

通过索引 key 的模数(余数)为 10,它将始终具有 0 到 9 之间的“旋转”值。

使用 %(取模)运算符!

using byte_t = unsigned char;

std::vector< byte_t > xor_key;
std::vector< byte_t > cipher_text;

std::string plain_text;
plain_text.reserve( cipher_text.size( ) );

for( std::size_t i = 0;
     i < cipher_text.size( );
     ++i )
{
    auto const cipher_byte = cipher_text[ i ];
    // i % xor_key.size( ) will "rotate" the index
    auto const key_byte = xor_key[ i % xor_key.size( ) ];
    // xor like usual!
    plain_text += static_cast< char >( cipher_byte ^ key_byte );
}