读书人

可逆加密怎样运用?解决办法

发布时间: 2012-01-08 22:48:50 作者: rapoo

可逆加密怎样运用?
各位大虾,我要让用户可以找回密码,并且要给他密码加密,可是怎样使用可逆的加密?


[解决办法]
找回密码功能都是重新设置一个新的密码给用户的。要是密码可以解密,那就没有再加密的必要了
[解决办法]
一般的找回密码都是通过一定的条件让你能够重新设置密码吧。。。为什么要可逆呢?
[解决办法]
你自己规定一种算法好了,比如取密码,然后对每个字符串值+1,类似的.
[解决办法]
这里有一个可逆加密的算法:

http://www.cnblogs.com/JBoy/archive/2007/06/17/786799.html
[解决办法]
逆转密码很不安全啊,一般都重置密码. 如果密码可逆的话,还不如不加密,直接插入到数据表中的. 楼主还可以把密码给select出来.
[解决办法]
/// <summary>
/// 3DES加密
/// </summary>
/// <param name="Value">待加密字符串</param>
/// <param name="sKey">密钥</param>
/// <param name="sIV">矢量</param>
/// <returns>加密后字符串</returns>
private static string encryptString(string Value, string sKey, string sIV)
{
//构造对称算法
SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();

ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
mCSP.Key = Convert.FromBase64String(sKey);
mCSP.IV = Convert.FromBase64String(sIV);
//指定加密的运算模式
mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
//获取或设置加密算法的填充模式
mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
byt = Encoding.UTF8.GetBytes(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}

/// <summary>
/// 3DES解密
/// </summary>
/// <param name="Value">待解密字符串</param>
/// <param name="sKey">密钥</param>
/// <param name="sIV">矢量</param>
/// <returns>解密后字符串</returns>
private static string decryptString(string Value, string sKey, string sIV)
{
//构造对称算法
SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();

ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
mCSP.Key = Convert.FromBase64String(sKey);
mCSP.IV = Convert.FromBase64String(sIV);
mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
mCSP.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
byt = Convert.FromBase64String(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}
[解决办法]
可以逆加密
但是密码不建议这样做
密码加密还是不可逆为好,比如MD5



----------天天说,天天都快乐----------
[解决办法]


C# code
using   System;   using   System.Security.Cryptography;   using   System.IO;   using   System.Text; using   System.Web.Security; namespace   EncryptingDecrypting { ///   <summary >   ///   SymmCrypto   的摘要说明。   ///   SymmCrypto类实现.NET框架下的加密和解密服务。   ///   作者:badboy ///   </summary >   public   class   SymmCrypto   {   public   enum   SymmProvEnum   :   int   {   DES,   RC2,   Rijndael   }         private   SymmetricAlgorithm   mobjCryptoService;         ///   <remarks >   ///   使用.Net   SymmetricAlgorithm   类的构造器.   ///   </remarks >   public   SymmCrypto(SymmProvEnum   NetSelected)   {   switch   (NetSelected)   {   case   SymmProvEnum.DES:   mobjCryptoService   =   new   DESCryptoServiceProvider();   break;   case   SymmProvEnum.RC2:   mobjCryptoService   =   new   RC2CryptoServiceProvider();   break;   case   SymmProvEnum.Rijndael:   mobjCryptoService   =   new   RijndaelManaged();   break;   }   }         ///   <remarks >   ///   使用自定义SymmetricAlgorithm类的构造器.   ///   </remarks >   public   SymmCrypto(SymmetricAlgorithm   ServiceProvider)   {   mobjCryptoService   =   ServiceProvider;   }         ///   <remarks >   ///   Depending   on   the   legal   key   size   limitations   of   ///   a   specific   CryptoService   provider   and   length   of   ///   the   private   key   provided,   padding   the   secret   key   ///   with   space   character   to   meet   the   legal   size   of   the   algorithm.   ///   </remarks >   private   byte[]   GetLegalKey(string   Key)   {   string   sTemp;   if   (mobjCryptoService.LegalKeySizes.Length   >   0)   {   int   lessSize   =   0,   moreSize   =   mobjCryptoService.LegalKeySizes[0].MinSize;   //   key   sizes   are   in   bits   while   (Key.Length   *   8   >   moreSize)   {   lessSize   =   moreSize;   moreSize   +=   mobjCryptoService.LegalKeySizes[0].SkipSize;   }   sTemp   =   Key.PadRight(moreSize   /   8,   "   ");   }   else   sTemp   =   Key;         //   convert   the   secret   key   to   byte   array   return   ASCIIEncoding.ASCII.GetBytes(sTemp);   }         public   string   Encrypting(string   Source,   string   Key)   {   byte[]   bytIn   =   System.Text.ASCIIEncoding.ASCII.GetBytes(Source);   //   create   a   MemoryStream   so   that   the   process   can   be   done   without   I/O   files   System.IO.MemoryStream   ms   =   new   System.IO.MemoryStream();         byte[]   bytKey   =   GetLegalKey(Key);         //   set   the   private   key   mobjCryptoService.Key   =   bytKey;   mobjCryptoService.IV   =   bytKey;         //   create   an   Encryptor   from   the   Provider   Service   instance   ICryptoTransform   encrypto   =   mobjCryptoService.CreateEncryptor();         //   create   Crypto   Stream   that   transforms   a   stream   using   the   encryption   CryptoStream   cs   =   new   CryptoStream(ms,   encrypto,   CryptoStreamMode.Write);         //   write   out   encrypted   content   into   MemoryStream   cs.Write(bytIn,   0,   bytIn.Length);   cs.FlushFinalBlock();         //   get   the   output   and   trim   the   "\0 "   bytes   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);   }         public   string   Decrypting(string   Source,   string   Key)   {   //   convert   from   Base64   to   binary   byte[]   bytIn   =   System.Convert.FromBase64String(Source);   //   create   a   MemoryStream   with   the   input   System.IO.MemoryStream   ms   =   new   System.IO.MemoryStream(bytIn,   0,   bytIn.Length);         byte[]   bytKey   =   GetLegalKey(Key);         //   set   the   private   key   mobjCryptoService.Key   =   bytKey;   mobjCryptoService.IV   =   bytKey;         //   create   a   Decryptor   from   the   Provider   Service   instance   ICryptoTransform   encrypto   =   mobjCryptoService.CreateDecryptor();         //   create   Crypto   Stream   that   transforms   a   stream   using   the   decryption   CryptoStream   cs   =   new   CryptoStream(ms,   encrypto,   CryptoStreamMode.Read);         //   read   out   the   result   from   the   Crypto   Stream   System.IO.StreamReader   sr   =   new   System.IO.StreamReader(   cs   );   return   sr.ReadToEnd();   }   }   } 使用方法: 加密:           SymmCrypto   de   =   new   SymmCrypto(SymmCrypto.SymmProvEnum.DES);           string   strValue   =   de.Encrypting(writeValue,strkey);           //strkey为密钥,writeValue是要加密的字符串. 解密:           SymmCrypto   de   =   new   SymmCrypto(SymmCrypto.SymmProvEnum.DES);           string   retValue   =   de.Decrypting(strValue,strkey);           //strkey为密钥,strValue是要解密的字符串. 

读书人网 >asp.net

热点推荐