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

时间:2011-03-10 22:05:43

标签: c# cryptography padding encryption rijndaelmanaged

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

4 个答案:

答案 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();