【问题标题】:How to decrypt a right shifted message with XOR?如何用 XOR 解密右移消息?
【发布时间】:2021-12-29 12:57:11
【问题描述】:

我有一条消息 m 用代码加密 c = m xor [m>>1]
(m>>x 表示我将它移动 x 位 - 例如 1000>>1 = 0100)

我需要解密这条消息。

我尝试过类似 6 的代码,但它不适用于 1 位移位:

int main() {
    uint32_t n = 0xff;
    for (uint32_t m = 0; m < n; ++m) {
         printf("input: %X \n", m); 
        uint32_t c = m ^ (m >> 6);// c = encrypted value
        printf("encrypted value: %X \n", m);
        uint32_t x = c;
        x ^= ((x &       0x3F) >> 6);
        x ^= ((x &      0xFC0) >> 6);
        x ^= ((x &    0x3F000) >> 6);
        x ^= ((x &   0xFC0000) >> 6);
        x ^= ((x & 0x3F000000) >> 6);
        if (m != x) {
            printf("Mismatch: %X > %X > %X\n", m, c, x); // should never happen
            break;
        }
    }
}

【问题讨论】:

    标签: logical-operators bit-shift


    【解决方案1】:

    可以像这样撤消右移 1 位的异或移位:

    x ^= x >> 1;
    x ^= x >> 2;
    x ^= x >> 4;
    x ^= x >> 8;
    x ^= x >> 16;
    

    可以像您展示的那样撤消右移 6 的异或移位,但也可以像这样,更短:

    x ^= (x >> 6) ^ (x >> 12);
    x ^= x >> 18;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2023-01-04
      • 2021-04-21
      • 2016-08-19
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多