首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除.net CryptoStream填充

如何删除.net CryptoStream填充
EN

Stack Overflow用户
提问于 2011-06-15 21:16:57
回答 2查看 4.6K关注 0票数 1

当我使用下面的类时,输出是填充的。

代码语言:javascript
复制
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());
}

我从另一篇文章中了解到

代码语言:javascript
复制
rijn.Padding = PaddingMode.None;

当我添加这个的时候,我得到一个错误,说“要加密的数据的长度无效”。

即使当我尝试加密一个6字节的字符串时,我也会看到得到一个很长的结果。

代码语言:javascript
复制
var def1 = Encrypt.EncryptString("abcdefg");

给了我24个字节!

有没有人能给我一些建议。

更新

更改为以下内容:

代码语言:javascript
复制
        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);

当我检查bytOut时,它是16字节,那么在ToBase64之后返回的值是24字节。我还是不明白为什么这么大。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-15 21:31:46

你的问题是mode of operation。默认值是密码块链接(CBC),它要求每个块与算法的块大小相匹配,并在必要时使用填充。

您可以使用另一种模式。以CFB为例,在执行普通ECB模式之前,它会在内部填充您的数据,并在返回结果时切断填充。(对IVs做一些聪明的事情,这样您就可以继续使用密码,而不需要填充。)但它似乎适合你的情况。

代码语言:javascript
复制
rijn.Mode = CipherMode.CFB;
票数 2
EN

Stack Overflow用户

发布于 2011-06-15 21:27:29

加密算法以块为单位工作。它将始终向上舍入到最接近的块大小。你只需要一个定义良好的填充算法,这样你就可以在解密后正确地删除填充。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6358254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档