当我使用下面的类时,输出被填充。
public static string EncryptString(string ClearText) {
byte[] clearTextBytes = Encoding.UTF8.GetBytes(ClearText);
System.Security.Cryptography.SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
MemoryStream ms = new MemoryStream();
byte[] rgbIV = Encoding.ASCII.GetBytes("ryojvlzmdalyglrj");
byte[] key = Encoding.ASCII.GetBytes("hcxilkqbbhczfeultgbskdmaunivmfuo");
CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV),
CryptoStreamMode.Write);
cs.Write(clearTextBytes, 0, clearTextBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
public static string DecryptString(string EncryptedText)
{
byte[] encryptedTextBytes = Convert.FromBase64String(EncryptedText);
MemoryStream ms = new MemoryStream();
System.Security.Cryptography.SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
rijn.Mode = CipherMode.CFB;
byte[] rgbIV = Encoding.ASCII.GetBytes("ryojvlzmdalyglrj");
byte[] key = Encoding.ASCII.GetBytes("hcxilkqbbhczfeultgbskdmaunivmfuo"); ;
CryptoStream cs = new CryptoStream(ms, rijn.CreateDecryptor(key, rgbIV),
CryptoStreamMode.Write);
cs.Write(encryptedTextBytes, 0, encryptedTextBytes.Length);
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}
我从另一篇文章中了解到有
rijn.Padding = PaddingMode.None;
当我添加这个时,我收到一条错误,上面写着“要加密的数据长度无效”
即使我尝试加密一个6字节的字符串,我也看到了很长的结果。
var def1 = Encrypt.EncryptString("abcdefg");
给了我24个字节!
有人可以在这里给我一些建议。
更新
更改为以下内容:
byte[] bytOut = ms.GetBuffer();
int i = 0;
for (i = 0; i < bytOut.Length; i++)
if (bytOut[i] == 0)
break;
// convert into Base64 so that the result can be used in xml
return System.Convert.ToBase64String(bytOut, 0, i);
当我检查时它是16字节然后在ToBase64之后返回的值是24字节。我仍然不确定为什么尺寸如此之大
答案 0 :(得分:2)
您的问题是mode of operation。默认为密码块链接(CBC),它要求每个块匹配算法的块大小,并在必要时使用填充。
您可以使用其他模式。以CFB为例,它将在执行普通ECB模式之前在内部填充数据,并在返回结果时切断填充。 (并使用IV做一些聪明的事情,这样你就可以继续使用密码而无需填充。)但它似乎适合你的情况。
rijn.Mode = CipherMode.CFB;
答案 1 :(得分:0)
加密算法以块为单位。它将始终向上舍入到最近的块大小。您只需要一个明确定义的填充算法,这样您就可以在解密后正确删除填充。