Encryption 三元组解密截断最后一个字符

Encryption 三元组解密截断最后一个字符,encryption,encryption-symmetric,tripledes,Encryption,Encryption Symmetric,Tripledes,我有一个.NET类,它实现了三重加密和解密。代码太多,无法在此发布。然而,问题是,虽然加密是正常的,但解密是不一致的,这取决于原始明文的长度。我知道加密是可以的,因为其他三重DES工具也提供相同的值 具体来说,如果原始纯文本的长度为8、16、24、32、40等,即8n,则最后一个字符将从生成的纯文本中删除 加密模式为CBC 密钥大小为24个字符(192bit) IV是8个字符问题在于(取消)填充算法不正确 (3) DES加密/解密8字节的块。由于并非所有文本都是8字节,最后一个块必须包含非纯文本

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

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

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

问题在于(取消)填充算法不正确

(3) DES加密/解密8字节的块。由于并非所有文本都是8字节,最后一个块必须包含非纯文本的原始字节。现在的诀窍是找出哪一个是纯文本的最后一个字符。有时,纯文本的长度是事先知道的,那么填充字符实际上可以是任何东西

如果不知道纯文本的长度,则必须使用确定性填充算法,例如PKCS5P。PKCS5Padding始终执行填充,即使明文是以字节为单位的N*块大小。原因很简单:否则它不知道最后一个字节是纯文本还是填充:
41 41 41 08 08 08 08
将是8个“A”字符,带有8个填充字节


看起来要么是取消添加算法没有很好地实现,要么是部署了非确定性填充算法。

问题在于(取消)填充算法不正确

(3) DES加密/解密8字节的块。由于并非所有文本都是8字节,最后一个块必须包含非纯文本的原始字节。现在的诀窍是找出哪一个是纯文本的最后一个字符。有时,纯文本的长度是事先知道的,那么填充字符实际上可以是任何东西

如果不知道纯文本的长度,则必须使用确定性填充算法,例如PKCS5P。PKCS5Padding始终执行填充,即使明文是以字节为单位的N*块大小。原因很简单:否则它不知道最后一个字节是纯文本还是填充:
41 41 41 08 08 08 08
将是8个“A”字符,带有8个填充字节


看起来要么是取消添加算法没有得到很好的实现,要么是部署了一个非确定性填充算法。

如果没有看到一些代码,我们就帮不了你:)不要让C/C++伤了你的大脑,你说的是“字节”或“八位字节”,而不是字符。如果没有看到一些代码,我们就帮不了你:)不要让C/C++伤了你的大脑,你说的是“字节”或“八位字节”,而不是字符。如果你不知道加密前的纯文本长度,并且密码文本有时与纯文本长度相同,那么你可能会遇到麻烦。请注意,有时纯文本本身包含以字节为单位的长度(例如,在使用BER/DER编码加密ASN.1定义的对象时)。我将填充模式从零更改为PKCS7(其他可用选项包括ANSIX923、ISO10126和NONE)现在解密似乎可以工作了。你有没有解释为什么解密可以在PKCS7上工作,而不是在零填充模式下工作??是的,纯文本的长度是可变的。是的,零的填充模式通常是不确定的:它只是用零填充最后一个块。因此,当unpadding删除字节时,它也可能删除纯文本的最后一个00h值字节。如果你认为纯文本是空的,这是“有趣的”。零填充只能在已知纯文本长度的情况下使用。如果在加密之前您不知道纯文本长度,并且密码文本有时与纯文本长度相同,那么您可能会遇到麻烦。请注意,有时纯文本本身包含以字节为单位的长度(例如,在使用BER/DER编码加密ASN.1定义的对象时)。我将填充模式从零更改为PKCS7(其他可用选项包括ANSIX923、ISO10126和NONE)现在解密似乎可以工作了。你有没有解释为什么解密可以在PKCS7上工作,而不是在零填充模式下工作??是的,纯文本的长度是可变的。是的,零的填充模式通常是不确定的:它只是用零填充最后一个块。因此,当unpadding删除字节时,它也可能删除纯文本的最后一个00h值字节。如果你认为纯文本是空的,这是“有趣的”。只有当纯文本长度已知时,才应使用零填充。