1

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

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

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

4

1 回答 1

4

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

(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 个填充字节。

似乎要么未填充算法没有很好地实现,要么部署了非确定性填充算法。

于 2012-03-01T16:17:40.353 回答