我收到一条消息m
,该消息已通过代码进行加密
c = m xor [m<<6] xor [m<<10]
({m<<x
意味着我将其移位了x位-例如1001 << 2 = 0100)
我需要解密此消息。
我尝试过以下代码:
c xor [c<<6] xor [c<<10]
OR
c xor [c>>6] xor [c>>10]
但没有一个起作用。
答案 0 :(得分:0)
函数c = m xor [m<<6] xor [m<<10]
是一个双射(即在给定模2 n 上是可逆的)。所以你很高兴...
从最低位开始,逐段对值进行6和10位的异或。
int main() {
uint32_t n = 0xfffffff;
for (uint32_t m = 0; m < n; ++m) {
uint32_t c = m ^ (m << 6) ^ (m << 10); // c = encrypted value
uint32_t x = c;
x ^= ((x & 0x3F) << 6);
x ^= ((x & 0x3FF) << 10);
x ^= ((x & 0xFC0) << 6);
x ^= ((x & 0x3F000) << 6);
x ^= ((x & 0xFFC00) << 10);
x ^= ((x & 0xFC0000) << 6);
x ^= ((x & 0x3F000000) << 6);
x ^= ((x & 0x3FF00000) << 10);
if (m != x) {
printf("Mismatch: %X > %X > %X\n", m, c, x); // should never happen
break;
}
}
}