加密和解密的密码 [英] Encrypt and Decrypt password

查看:157
本文介绍了加密和解密的密码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用下面的code加密和解密asp.net密码。加密完美的作品,但解密时,它抛出这个错误的 无效长度为Base-64字符数组。

我的密码是123,我用它作为跟踪加密: HttpUtility.UrlEn code(CryptorEngine.Encrypt(strpassword,真实));
并且解密我使用它如下:

  CryptorEngine.Decrypt(HttpUtility.UrlDe code(strpassword),真));

和这里是code:

 公共类CryptorEngine
    {
        ///<总结>
        ///使用加密双重加密方法的字符串。返回一个加密的密文
        ///< /总结>
        ///< PARAM NAME =toEncrypt>字符串加密< /参数>
        ///< PARAM NAME =useHashing>的哈希?送额外secirity< /参数>
        ///<&回报GT;< /回报>
        公共静态字符串加密(字符串toEncrypt,布尔useHashing)
        {
            字节[] keyArray;
            字节[] = toEncryptArray UTF8Encoding.UTF8.GetBytes(toEncrypt);            System.Configuration.AppSettingsReader settingsReader =新AppSettingsReader();
            //从配置文件的密钥
            字符串键=(字符串)settingsReader.GetValue(SecurityKey,typeof运算(字符串));
            //System.Windows.Forms.MessageBox.Show(key);
            如果(useHashing)
            {
                MD5CryptoServiceProvider hashmd5 =新MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(键));
                hashmd5.Clear();
            }
            其他
                keyArray = UTF8Encoding.UTF8.GetBytes(键);            TripleDESCryptoServiceProvider TDES =新TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;            ICryptoTransform的cTransform = tdes.CreateEncryptor();
            字节[] = resultArray cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);
            tdes.Clear();
            返回Convert.ToBase64String(resultArray,0,resultArray.Length);
        }
        ///<总结>
        ///解密使用双加密方法的字符串。返回解密明确字符串
        ///< /总结>
        ///< PARAM NAME =cipherString>加密字符串< /参数>
        ///< PARAM NAME =useHashing>是否使用了哈希加密此数据?传递true是肯定的< /参数>
        ///<&回报GT;< /回报>
        公共静态字符串解密(字符串cipherString,布尔useHashing)
        {
            字节[] keyArray;
            字节[] = toEncryptArray Convert.FromBase64String(cipherString);            System.Configuration.AppSettingsReader settingsReader =新AppSettingsReader();
            //从配置文件中的钥匙打开锁!
            字符串键=(字符串)settingsReader.GetValue(SecurityKey,typeof运算(字符串));            如果(useHashing)
            {
                MD5CryptoServiceProvider hashmd5 =新MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(键));
                hashmd5.Clear();
            }
            其他
                keyArray = UTF8Encoding.UTF8.GetBytes(键);            TripleDESCryptoServiceProvider TDES =新TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;            ICryptoTransform的cTransform = tdes.CreateDecryptor();
            字节[] = resultArray cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);            tdes.Clear();
            返回UTF8Encoding.UTF8.GetString(resultArray);
        }
    }


解决方案

在URL有字符来与加密输出的冲突,至少在我的code,这是什么使这个问题。所以我用这个两个函数来改变这种字符,避免这种情况。

 公共静态字符串ChangeSPChart(字符串sTheInput)
{
    StringBuilder的sRetMe =新的StringBuilder(sTheInput);    sRetMe.Replace(+, - );
    sRetMe.Replace('/','*');
    sRetMe.Replace(=,!);    返回sRetMe.ToString();
}公共静态字符串FixSPChart(字符串sTheInput)
{
    StringBuilder的sRetMe =新的StringBuilder(sTheInput);    sRetMe.Replace(' - ','+');
    sRetMe.Replace('*','/');
    sRetMe.Replace(,=!);    返回sRetMe.ToString();
}

和加密/解密code将是:

 公共静态字符串加密(字符串toEncrypt,布尔useHashing)
{
    字节[] keyArray;
    字节[] = toEncryptArray UTF8Encoding.UTF8.GetBytes(toEncrypt);    System.Configuration.AppSettingsReader settingsReader =新AppSettingsReader();
    //从配置文件的密钥
    字符串键=(字符串)settingsReader.GetValue(SecurityKey,typeof运算(字符串));
    //System.Windows.Forms.MessageBox.Show(key);
    如果(useHashing)
    {
        MD5CryptoServiceProvider hashmd5 =新MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(键));
        hashmd5.Clear();
    }
    其他
        keyArray = UTF8Encoding.UTF8.GetBytes(键);    TripleDESCryptoServiceProvider TDES =新TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.PKCS7;    ICryptoTransform的cTransform = tdes.CreateEncryptor();
    字节[] = resultArray cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);    tdes.Clear();
    变种加密= Convert.ToBase64String(resultArray,0,resultArray.Length);    //这里我改变
    返回ChangeSPChart(加密的);
}
///<总结>
///解密使用双加密方法的字符串。返回解密明确字符串
///< /总结>
///< PARAM NAME =cipherString>加密字符串< /参数>
///< PARAM NAME =useHashing>是否使用了哈希加密此数据?传递true是肯定的< /参数>
///<&回报GT;< /回报>
公共静态字符串解密(字符串cipherString,布尔useHashing)
{
    cipherString = FixSPChart(cipherString);    字节[] keyArray;
    字节[] = toEncryptArray Convert.FromBase64String(cipherString);    System.Configuration.AppSettingsReader settingsReader =新AppSettingsReader();
    //从配置文件中的钥匙打开锁!
    字符串键=(字符串)settingsReader.GetValue(SecurityKey,typeof运算(字符串));    如果(useHashing)
    {
        MD5CryptoServiceProvider hashmd5 =新MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(键));
        hashmd5.Clear();
    }
    其他
        keyArray = UTF8Encoding.UTF8.GetBytes(键);    TripleDESCryptoServiceProvider TDES =新TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.PKCS7;    ICryptoTransform的cTransform = tdes.CreateDecryptor();
    字节[] = resultArray cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);    tdes.Clear();
    返回UTF8Encoding.UTF8.GetString(resultArray);
}

I am using the following code to encrypt and decrypt passwords in asp.net. the encryption works perfectly but when decrypting it throws this error Invalid length for a Base-64 char array.

my password is 123 and i am using it as follow to encrypt: HttpUtility.UrlEncode(CryptorEngine.Encrypt(strpassword, true)); and to decrypt I am using it as follow :

CryptorEngine.Decrypt(HttpUtility.UrlDecode(strpassword), true));

and here is the code :

 public class CryptorEngine
    {
        /// <summary>
        /// Encrypt a string using dual encryption method. Return a encrypted cipher Text
        /// </summary>
        /// <param name="toEncrypt">string to be encrypted</param>
        /// <param name="useHashing">use hashing? send to for extra secirity</param>
        /// <returns></returns>
        public static string Encrypt(string toEncrypt, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
            // Get the key from config file
            string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
            //System.Windows.Forms.MessageBox.Show(key);
            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                hashmd5.Clear();
            }
            else
                keyArray = UTF8Encoding.UTF8.GetBytes(key);

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            tdes.Clear();
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }
        /// <summary>
        /// DeCrypt a string using dual encryption method. Return a DeCrypted clear string
        /// </summary>
        /// <param name="cipherString">encrypted string</param>
        /// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>
        /// <returns></returns>
        public static string Decrypt(string cipherString, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = Convert.FromBase64String(cipherString);

            System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
            //Get your key from config file to open the lock!
            string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));

            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                hashmd5.Clear();
            }
            else
                keyArray = UTF8Encoding.UTF8.GetBytes(key);

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            tdes.Clear();
            return UTF8Encoding.UTF8.GetString(resultArray);
        }
    }

解决方案

In the URL there are come characters that conflict with the encrypted output, and at least on my code, this is what make the problem. So I use this two functions to change this characters and avoid that.

public static string ChangeSPChart(string sTheInput)
{
    StringBuilder sRetMe = new StringBuilder(sTheInput);

    sRetMe.Replace('+', '-');
    sRetMe.Replace('/', '*');
    sRetMe.Replace('=', '!');

    return sRetMe.ToString();
}

public static string FixSPChart(string sTheInput)
{
    StringBuilder sRetMe = new StringBuilder(sTheInput);

    sRetMe.Replace('-', '+');
    sRetMe.Replace('*', '/');
    sRetMe.Replace('!', '=');

    return sRetMe.ToString();
}

and the encryption/decryption code will be:

public static string Encrypt(string toEncrypt, bool useHashing)
{
    byte[] keyArray;
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

    System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
    // Get the key from config file
    string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
    //System.Windows.Forms.MessageBox.Show(key);
    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
        hashmd5.Clear();
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    tdes.Clear();
    var encrypted = Convert.ToBase64String(resultArray, 0, resultArray.Length);

    // here I change it
    return  ChangeSPChart(encrypted);
}
/// <summary>
/// DeCrypt a string using dual encryption method. Return a DeCrypted clear string
/// </summary>
/// <param name="cipherString">encrypted string</param>
/// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>
/// <returns></returns>
public static string Decrypt(string cipherString, bool useHashing)
{
    cipherString = FixSPChart(cipherString);

    byte[] keyArray;
    byte[] toEncryptArray = Convert.FromBase64String(cipherString);

    System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
    //Get your key from config file to open the lock!
    string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));

    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
        hashmd5.Clear();
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyArray;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateDecryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    tdes.Clear();
    return UTF8Encoding.UTF8.GetString(resultArray);
}

这篇关于加密和解密的密码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆