我如何从解密后的字符串中去除填充?我使用RijndaelManaged提供程序进行加密和解密。当我解密时,字符串末尾会有几个/0/0/0/0/0/0
。我的问题是如何优雅(正确)地从结果字符串中删除这些字符?
我如何从解密后的字符串中去除填充?我使用RijndaelManaged提供程序进行加密和解密。当我解密时,字符串末尾会有几个/0/0/0/0/0/0
。我的问题是如何优雅(正确)地从结果字符串中删除这些字符?
你很可能没有正确使用RijndaelManaged实例的填充和块模式(在下面的代码中称为提供程序)。由于.NET中的对称加密提供程序都是块密码,因此这些设置会影响填充的工作方式(以及输出的安全性)。
使用以下设置将为您提供最佳的RijndaelManaged安全性:
// set the padding algorithm
provider.Padding = PaddingMode.ISO10126; // default is PKCS7
// set the block chaining mode
provider.Mode = CipherMode.CBC;
如果您不是加密数据的人,并且无法确定发起方使用了哪些设置,那么您可以在其他答案中找到帮助 :)
使用TrimEnd()
方法:
theString.TrimEnd("/0");
theString.TrimEnd('\0');
,它会将字符串末尾的空字符删除。除非解密后的字符串真的是用交替的反斜杠和零填充的。 - Greg在加密字符串之前,您可以在字符串开头添加字符串的长度,然后加密它们。解密后,使用长度确定字符串的结束位置。
或者,在加密之前对字符串进行base64编码,然后在解密后进行解码。
或者,在加密之前使用二进制或XML序列化程序对其进行编码。
所有这些方法都具有一个优点,即它们允许您恢复存储的确切字符串。任何采用当前输出并猜测要应用的转换的方法都没有该属性。
我不明白这与加密有什么关系。如果我理解正确,您已经完成了解密,并且有一个明文字符串,在其末尾有一些您想要删除的内容。如果是这样,那么您的问题涉及字符串操作,而使用的加密算法无关紧要。但也许我误解了..?
建议(可能不正确,但您会得到思路):
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();
原始字符串
-> 加密过程
-> 损坏的字符串
,因此需要修复加密过程。 - Jeffrey L Whitledge