TripleDES解密截断最后一个字符

时间:2012-03-01 15:49:36

标签: encryption encryption-symmetric tripledes

我有一个实现TripleDES加密和解密的.NET类。代码太多了,不能在这里发布。然而,问题是虽然加密是可以的,但是根据原始明文的长度,解密是不一致的。我知道加密是可以的,因为其他三重DES工具也可以提供相同的价值。

具体来说,如果原始明文的长度为8,16,24,32,40等,即8n,那么最后一个字符将从生成的纯文本中删除。

加密模式是CBC 密钥大小为24个字符(192位) IV是8个字符

1 个答案:

答案 0 :(得分:4)

问题是因为(un)填充算法不正确。

(3)DES加密/解密8字节的块。由于并非所有文本都精确地为8个字节,因此最后一个块必须包含非纯文本字节的字节。现在的诀窍是找出哪一个是纯文本的最后一个字符。有时,纯文本的长度事先是已知的 - 然后填充字符可以是任何真实的。

如果未知纯文本的长度,则必须使用确定性填充算法,例如, PKCS5Padding。 PKCS5Padding 总是执行填充,即使明文是N * blocksize(以字节为单位)。原因很简单:否则它不知道最后一个字节是纯文本还是填充:41 41 41 41 41 41 41 41 08 08 08 08 08 08 08 08将是8个'A'字符,有8个填充字节。

似乎unpadding算法没有很好地实现,或者部署了非确定性填充算法。