【问题标题】:how to encrypt string in asp.net c# [duplicate]如何在asp.net c#中加密字符串[重复]
【发布时间】:2017-01-06 16:40:38
【问题描述】:
public string EncryptPwd(String strString)
        {
            int intAscii;
            string strEncryPwd = "";
            for (int intIndex = 0; intIndex < strString.ToString().Length; intIndex++)
            {
                intAscii = (int)char.Parse(strString.ToString().Substring(intIndex, 1));
                intAscii = intAscii + 5;
                strEncryPwd += (char)intAscii;
            }
            return strEncryPwd;
        }

这是我的代码。请建议我这样做是否正确。

【问题讨论】:

  • 建议您使用MD5,AES或其他标准加密代替自定义加密。
  • 使用securitydriven.net/inferno/#Encryption 它有一个nuget包。 Inferno 为正确保护数据做了所有正确的事情,大多数示例显示了薄弱且有缺陷的保护配置。

标签: c# asp.net


【解决方案1】:

您可以使用此代码:

用密码加密字符串:

public static string EncryptString(string Message, string Passphrase)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

             MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));         
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();           
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;        
            byte[] DataToEncrypt = UTF8.GetBytes(Message);     
            try
            {
                ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }          
            return Convert.ToBase64String(Results);
        }

并使用密码解密字符串:

public static string DecryptString(string Message, string Passphrase)
        {
            byte[] Results;
            System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

             MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));

            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;

            byte[] DataToDecrypt = Convert.FromBase64String(Message);
            // Step 5. Bat dau giai ma chuoi
            try
            {
                ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
            }
            catch (Exception) { Results = DataToDecrypt; }
            finally
            {                   
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }   

            return UTF8.GetString(Results);
        }

【讨论】:

    【解决方案2】:

    你有办法解密吗?这是SO上的另一个答案

    private static readonly UTF8Encoding Encoder = new UTF8Encoding();
    
    public static string Encrypt(string unencrypted)
    {
        if (string.IsNullOrEmpty(unencrypted)) 
            return string.Empty;
    
        try
        {
            var encryptedBytes = MachineKey.Protect(Encoder.GetBytes(unencrypted));
    
            if (encryptedBytes != null && encryptedBytes.Length > 0)
                return HttpServerUtility.UrlTokenEncode(encryptedBytes);    
        }
        catch (Exception)
        {
            return string.Empty;
        }
    
        return string.Empty;
    }
    
    public static string Decrypt(string encrypted)
    {
        if (string.IsNullOrEmpty(encrypted)) 
            return string.Empty;
    
        try
        {
            var bytes = HttpServerUtility.UrlTokenDecode(encrypted);
            if (bytes != null && bytes.Length > 0)
            {
                var decryptedBytes = MachineKey.Unprotect(bytes);
                if(decryptedBytes != null && decryptedBytes.Length > 0)
                    return Encoder.GetString(decryptedBytes);
            }
    
        }
        catch (Exception)
        {
            return string.Empty;
        }
    
        return string.Empty;
    }
    

    【讨论】:

    • 感谢我所做的一切。
    【解决方案3】:

    我同意之前的所有答案(尤其是 share pvv),但如果您真的想要 Caesar Cipher(凯撒密码是一种非常弱加密,不应在生产中使用) ,如果这是一个学习练习,那么这里有一些代码

    string strString = "abcdefghijklmnopqrstuvwxyz";
    string enc = String.Join("", strString.ToArray().Select(x =>(char)( 'a' + (x-'a'+5)%26)));
    Console.WriteLine(enc);
    

    或者像你一样使用 for 循环

     string strEncryPwd = "";
     for (int index = 0; index < strString.ToString().Length; index++)
     {
            int plainChar = strString[index];
            int encrypted = 'a' + (plainChar - 'a' + 5) % 26;
            strEncryPwd += (char)encrypted;
      }
            Console.WriteLine(strEncryPwd);
    

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2011-03-09
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多