【问题标题】:C# string decryptionC#字符串解密
【发布时间】:2020-07-06 15:58:18
【问题描述】:

我想在我的 wcf 服务中加密。为此,我正在编写一个类来加密和解密字符串。加密似乎工作正常并产生一个加密字符串,但是在解密时它给出了不允许双重转义的错误或错误 401。我在 webconfig 中添加了以下内容

<security>
  <requestFiltering allowDoubleEscaping="true" />
</security>

现在它给出了字符串长度不正确或较短字符串坏字符串的错误。代码是

加密

static string hash = "mypass@mysitec0m";
        public static string Encrypt(string decrypted)
        {
            byte[] data = UTF8Encoding.UTF8.GetBytes(decrypted);
            using (MD5CryptoServiceProvider mds = new MD5CryptoServiceProvider())
            {
                byte[] keys = mds.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
                using (TripleDESCryptoServiceProvider tripDes = new TripleDESCryptoServiceProvider())
                {
                    ICryptoTransform transform = tripDes.CreateEncryptor();
                    byte[] result = transform.TransformFinalBlock(data, 0, data.Length);
                    return Convert.ToBase64String(result);
                }
            }
               
        }

并解密

public static string decrypt(string encrypted)
        {
            byte[] data = Convert.FromBase64String(encrypted);
            using (MD5CryptoServiceProvider mds = new MD5CryptoServiceProvider())
            {
                byte[] keys = mds.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
                using (TripleDESCryptoServiceProvider tripDes = new TripleDESCryptoServiceProvider())
                {
                    ICryptoTransform transform = tripDes.CreateDecryptor();
                    byte[] result = transform.TransformFinalBlock(data, 0, data.Length);
                    return UTF8Encoding.UTF8.GetString(result);
                }
            }

        }

为什么会出现错误,我该如何解决。

【问题讨论】:

    标签: c# wcf encryption


    【解决方案1】:

    您从未使用您的密钥初始化密码,因此您将一个随机密钥用于加密器,而将另一个随机密钥用于解密器。

    改用CreateEncryptor(Byte[], Byte[]) 方法,decryptor 类似。

    CreateEncryptor(Byte[], Byte[])...

    使用指定的 Key 属性创建一个对称加密器对象 和初始化向量 (IV)。

    【讨论】:

      【解决方案2】:

      这与WCF无关,更像是一个关于TripleDESCryptoServiceProvider的问题。你的加解密代码有错误。如果IV没有设置,加密模式应该使用ECB。默认是CBC。CBC需要设置IV。

      这是我修改后的代码:

      加密

       public static string Encrypt(string decrypted)
              {
                
                  byte[] data = UTF8Encoding.UTF8.GetBytes(decrypted);
                  using (MD5CryptoServiceProvider mds = new MD5CryptoServiceProvider())
                  {
                      byte[] keys = mds.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
                      using (TripleDESCryptoServiceProvider tripDes = new TripleDESCryptoServiceProvider() { 
                      Key=keys,
                      Mode=CipherMode.ECB
                      })
                      {
                          ICryptoTransform transform = tripDes.CreateEncryptor();
                          byte[] result = transform.TransformFinalBlock(data, 0, data.Length);
                          return Convert.ToBase64String(result);
                      }
                  }
              }
      

      解密

       public static string decrypt(string encrypted)
          {
              byte[] data = Convert.FromBase64String(encrypted);
              using (MD5CryptoServiceProvider mds = new MD5CryptoServiceProvider())
              {
                  byte[] keys = mds.ComputeHash(UTF8Encoding.UTF8.GetBytes(hash));
                  using (TripleDESCryptoServiceProvider tripDes = new TripleDESCryptoServiceProvider()
                  {
                      Key = keys,
                      Mode = CipherMode.ECB
                  })
                  {
                      ICryptoTransform transform = tripDes.CreateDecryptor();
                      byte[] result = transform.TransformFinalBlock(data, 0, data.Length);
                      return UTF8Encoding.UTF8.GetString(result);
                  }
              }
      
          }
      

      【讨论】:

        【解决方案3】:

        我建议您使用POST 代替GET。因为加密的字符串可能很长,并且会有很多特殊字符,正如您在问题中提到的那样

        下面是示例。

        [OperationContract(Name = "Decrypt")]  
        [WebInvoke(Method = "POST",  
        UriTemplate = "Decrypt")]  
        string Decrypt(string data);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-19
          • 2018-08-17
          相关资源
          最近更新 更多