如何从解密的字符串中删除填充?我正在使用RijndaelManaged提供程序进行加密和解密。当我解密时,字符串末尾有几个/0/0/0/0/0/0
。我的问题是如何优雅地(正确地)从结果字符串中删除字符?
答案 0 :(得分:10)
您很可能没有使用RijndaelManaged实例的正确填充和阻止模式(在下面的代码中称为提供程序)。由于.NET中的对称加密提供程序都是分组密码,因此这些设置会影响填充的工作方式(以及输出的安全性)。
使用RijndaelManaged时,以下设置将为您提供最佳安全性:
// set the padding algorithm
provider.Padding = PaddingMode.ISO10126; // default is PKCS7
// set the block chaining mode
provider.Mode = CipherMode.CBC;
如果您不是加密数据的人,而您无法确定发起方使用的设置,那么您将在其他一些答案中找到帮助:)
答案 1 :(得分:5)
像这样使用TrimEnd()
:
theString.TrimEnd("/0");
答案 2 :(得分:1)
您可以将字符串的长度加到字符串的开头,然后加密它们,然后在解密后,使用长度来确定字符串的结束位置。
或者你可以在加密之前对字符串进行base64编码,然后对其进行解码。
或者在加密之前使用二进制或XML序列化程序对其进行编码。
所有这些方法的优势在于它们允许您准确恢复存储的字符串。任何获取当前输出并猜测要应用的转换的方法都没有该属性。
答案 3 :(得分: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();