8

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

4

4 回答 4

11

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

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

// set the padding algorithm
provider.Padding = PaddingMode.ISO10126; // default is PKCS7
// set the block chaining mode
provider.Mode = CipherMode.CBC;

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

于 2011-03-10T22:13:37.637 回答
5

通过TrimEnd()这样使用:

theString.TrimEnd("/0");
于 2011-03-10T22:09:42.693 回答
1

您可以在加密它们之前将字符串的长度添加到字符串的开头,然后在解密后使用长度来确定字符串的结束位置。

或者你可以在加密之前对字符串进行base64编码,然后再解码。

或者在加密之前使用二进制或 XML 序列化程序对其进行编码。

所有这些方法的优点是它们允许您准确恢复存储的字符串。任何采用当前输出并猜测要应用什么转换的方法都不具有该属性。

于 2011-03-10T22:11:13.970 回答
0

我看不出它与加密有什么关系。IIUC,您已经完成了解密,并且有一个明文字符串,该字符串末尾有您想要删除的内容。如果是这样,您的问题是关于字符串操作,与您使用的加密算法无关。但也许我误解了..?

建议(可能不正确,但你会明白的):

string pattern = (i % 2 == 0? "/0" : "0/");
var sb = new StringBuilder(s);

int i = s.Length - 1;
while (sb[i] == pattern[i % 2]) --i;
sb.Length = i;
s = sb.ToString();
于 2011-03-10T22:13:54.563 回答