加密:按位反转和位移?

Dav*_*vid 0 encryption xor

我正在尝试反转 XOR 加密。我有加密代码:

// Walk the 16 nibbles in the 64 bit long long, selecting the corresponding key digit
// and XORing it into the result.
unsigned long long result = 0;
for( i=0; i<16; i++ )
{
    int n = 4*(i % keyLen);
    int k = (key & (0xF << n)) >> n;
    result |= value&(0xF << 4*i) ^ (k<<4*i);
}
Run Code Online (Sandbox Code Playgroud)

第一行没问题。

第二个和第三个不是。我的 3 个问题是:

  1. 我想我可以反转位移位就可以了,对吗?
  2. 但是如何按位反转 & 呢?那么#2 是如何反转的呢?
  3. 因此,如果#1 的答案是肯定的,并且我知道如何执行#2,那么我可以这样做并能够解密“是”吗?

Mic*_*urr 5

您提供的代码似乎只是对数据的每个 4 位半字节执行 XOR(即一次相当于一个十六进制字符)。

按位&和移位操作只是屏蔽了每轮循环中使用的特定位集for。您不需要“恢复”任何丢失的位,因为所做的只是创建位掩码。

由于这是直接的 XOR 加密,因此它具有以下解密例程:

unsigned long long result = 0;
for( i=0; i<16; i++ )
{  
    int n = 4*(i % keyLen);
    int k = (key & (0xF << n)) >> n;
    result |= value&(0xF << 4*i) ^ (k<<4*i);
}
Run Code Online (Sandbox Code Playgroud)

这恰好是加密例程(异或加密是通过使用相同密钥通过加密例程运行密文来解密的)。

当然,我觉得有必要指出,XOR 加密只是一个玩具 - 它非常脆弱且容易破解。所以我希望你只是玩玩或学习。

不幸的是,这种代码经常出现在实际产品中......