可逆加密怎样运用?
各位大虾,我要让用户可以找回密码,并且要给他密码加密,可是怎样使用可逆的加密?
[解决办法]
找回密码功能都是重新设置一个新的密码给用户的。要是密码可以解密,那就没有再加密的必要了
[解决办法]
一般的找回密码都是通过一定的条件让你能够重新设置密码吧。。。为什么要可逆呢?
[解决办法]
你自己规定一种算法好了,比如取密码,然后对每个字符串值+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
----------天天说,天天都快乐----------
[解决办法]
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是要解密的字符串.