多重加密/解密造成的数据混乱



我正在使用PHP编写一个应用程序,用户可以使用几种可能的算法对文本进行多次加密。起初我觉得这真的很简单,但后来我想到了当数据被填充到块大小、加密然后解密时会出现的问题。

起初,我认为我可以在每次解密过程后删除空字节,以便在填充之前获得原始数据。现在,如果数据的末尾有几个空字节,那么在解密过程后删除空字节只会删除部分原始数据,最终会丢失数据,可能还会错误解密(最后一点取决于以下解密算法的块大小)。尽管数据或经过几次加密处理后的数据包含几个空字节的可能性几乎为零,但我正在寻找解决上述问题的解决方案。

如果我不想从数据中去除空字节,根据所用算法的块大小,我也会得到一些令人讨厌的结果。为了证明我写了一个python程序,它有三种加密算法,一种是2字节的块大小,另一种是3个块大小,最后一种是4个块大小。所以你可以将它们与128位、192位和256位算法进行比较。我从一些随机字节开始,对它们进行了多次加密,然后在每次解密过程后都在不删除空字节的情况下对它们进行解密。该程序以十六进制格式打印每次解密/加密过程后的字节,以下是我的一些评论输出:

48 61 6c 6c 6f                      //thats our data at the start
da b4 28 fe 9e 4a                   //now the 3-byte algorithm was run -> padded to 6 bytes
5e 62 04 72 1a d8 d2 a4             //used the 4-byte algorithm -> padded to 8 bytes
cc a1 43 e0 f5 e7 40 eb 81          //3-byte algorithm used again -> padded to 9 bytes
48 61 7a 07 71 1e 3f 0f 05 8d 98 a4 //at last used the 4-byte algorithm -> padded to 12 bytes
cc a1 43 e0 f5 e7 40 eb 81 00 00 00 //first encryption done, notice the three null-bytes and the similarity to line 4
5e 62 04 72 1a d8 d2 a4 00 92 0f 2a //secound encryption done, not removed null-bytes "decrypted", but the rest goes well, as seen in line 3
da b4 28 fe 9e 4a 00 00 84 1a 8d 03 //third encryption done, same as above, decryption of null-bytes results in chaos, but original data still the same
48 61 6c 6c 6f 00 92 0f ae 88 98 be //last encryption, we got original data with some near random bytes

您可以看到,第一个解密过程进行得很顺利,第二个解密过程也进行得很好,除了3个填充字节被"解密"。因此,在每次加密过程之后,我们都会更接近原始数据,但我们会不断解密这些填充字节。(注意:如果有人怀疑我的加密/解密功能,我测试了100次,每次都有效,如果需要或怀疑,我也可以发布源代码)

把这一切归结为一个简单的问题,当我解密数据时,我怎么知道哪些空字节是原始数据的一部分,哪些是加密算法添加的?你知道我该怎么做吗?

您可以使用诸如PKCS#7之类的填充模式来编码填充字节中的填充量,而不是对数据进行零填充。这允许在解密时确定填充字节的数量,以便可以删除它们,只留下原始明文。

从本质上讲,填充字节都=添加的填充字节数。例如,如果需要3个填充字节,则该填充将是0x03的3个字节。

总是至少有一个字节的填充,这意味着如果明文已经是块大小的倍数,那么必须添加一个仅由填充组成的额外块。这确保了可以区分块大小的精确倍数并且已经nn字节结束的明文和已经用n字节填充的明文。

最新更新