C#字符串解密

C#字符串解密,c#,wcf,encryption,C#,Wcf,Encryption,我想在我的wcf服务中加密。为此,我正在编写一个类来加密和解密字符串。加密似乎工作正常,并生成加密字符串,但在进行解密时,它给出了不允许双重转义的错误或错误401。我有以下附加的网络配置 <security> <requestFiltering allowDoubleEscaping="true" /> </security> 解密 出现错误的原因以及如何修复它。我建议您使用POST代替GET。因为加密字符串可能很长,并且会有许多特殊

我想在我的wcf服务中加密。为此,我正在编写一个类来加密和解密字符串。加密似乎工作正常,并生成加密字符串,但在进行解密时,它给出了不允许双重转义的错误或错误401。我有以下附加的网络配置

<security>
  <requestFiltering allowDoubleEscaping="true" />
</security>
解密
出现错误的原因以及如何修复它。

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

下面是示例

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

您从未使用密钥初始化密码,因此您使用一个随机密钥作为加密机,使用另一个随机密钥作为解密机

请改用该方法,同样地,对于

CreateEncryptor(字节[],字节[])

创建具有指定密钥属性的对称加密程序对象 初始化向量(IV)


这与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);
            }
        }

    }
解密

 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);
            }
        }

    }