RijndaelManaged Decryption - 如何优雅地删除padding/0?

Hca*_*tek 7 c# encryption cryptography padding rijndaelmanaged

如何从解密的字符串中删除填充?我正在使用RijndaelManaged提供程序进行加密和解密.当我解密/0/0/0/0/0/0时,字符串末尾有几个.我的问题是如何优雅地(正确地)从结果字符串中删除字符?

Mor*_*ner 10

您很可能没有使用RijndaelManaged实例的正确填充和阻止模式(在下面的代码中称为提供程序).由于.NET中的对称加密提供程序都是分组密码,因此这些设置会影响填充的工作方式(以及输出的安全性).

使用RijndaelManaged时,以下设置将为您提供最佳安全性:

// set the padding algorithm
provider.Padding = PaddingMode.ISO10126; // default is PKCS7
// set the block chaining mode
provider.Mode = CipherMode.CBC;
Run Code Online (Sandbox Code Playgroud)

如果您不是加密数据的那个,并且您无法确定发起方使用的设置,那么您将在其他一些答案中找到帮助:)

  • CipherMode.CBC 本质上确保两个相同的输入块不会产生相同的加密输出,从而提高安全性(参见 http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation)。CBC 的缺点是需要一个 IV 并且执行需要按顺序进行。 (2认同)
  • PaddingMode 控制使用哪些字符来填充最后一块数据,直到使用的块大小。默认值是 (afacr) 0s,这比随机数据的安全性更低。检查 CipherMode 和 PaddingMode 的 MSDN 文档,因为我记得它们包含所有这些信息。 (2认同)

Arn*_* F. 5

通过这样使用TrimEnd():

theString.TrimEnd("/0");
Run Code Online (Sandbox Code Playgroud)

  • 我猜你的意思是`theString.TrimEnd('\ 0');`,它修剪了字符串末尾的空字符.除非解密的字符串真的用交替的斜线和零填充. (5认同)
  • 由于null字符在.NET字符串中是合法的,我个人认为这是一种不正确的方法. (2认同)