对称加密和非对称加密!
2011-03-03 11:13
309 查看
主要是对称加密和非对称加密两种。可供各位参考:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO; namespace EncryptDLL { #region 对称加密类 /// /// 对称加密解密类 /// public static class SymmetricEncryptClass { #region 对称加密代码 /// /// 对称加密方法 /// /// 要加密的数据 /// 加密Key /// /// 加密向量 /// /// 返回加密后的数据,类型byte[] public static byte[] SymmetricEncrptFunction(this string strMsg, string key, string IV) { TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); SHA1 sha1 = new SHA1CryptoServiceProvider(); //初始密钥的设定 string strNamePlusBirthday = key + IV; string strKey = new string(strNamePlusBirthday.Reverse().ToArray()); if (sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).Length > tdes.Key.Length) { tdes.Key = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).ToString().Substring(0, tdes.Key.Length)); } else if (sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).Length < tdes.Key.Length) { tdes.Key = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).ToString().PadRight(tdes.Key.Length, ' ')); } //初始向量的设定 if (sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).Length > tdes.IV.Length) { tdes.IV = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).ToString().Substring(0, tdes.IV.Length)); } else if (sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).Length < tdes.IV.Length) { tdes.IV = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).ToString().PadRight(tdes.IV.Length, ' ')); } byte[] encryptBuffer = Encoding.Default.GetBytes(strMsg); MemoryStream streamMemory = new MemoryStream(); CryptoStream cryStream = null; //加密流 byte[] readBuffer; //用来接受加密数据 try { cryStream = new CryptoStream(streamMemory, new TripleDESCryptoServiceProvider().CreateEncryptor(tdes.Key, tdes.IV), CryptoStreamMode.Write); cryStream.Write(encryptBuffer, 0, encryptBuffer.Length); cryStream.FlushFinalBlock(); } catch { return null; } finally { readBuffer = streamMemory.ToArray(); cryStream.Close(); streamMemory.Close(); } return readBuffer; } #endregion #region 对称解密代码 /// 对称解密方法 /// /// 需要解密的数据 /// /// 解密Key /// /// 解密向量 /// /// 解密后的数据 public static string SymmetricDecryptionFunction(this byte[] bufMsg, string key, string IV) { TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); SHA1 sha1 = new SHA1CryptoServiceProvider(); //初始密钥的设定 string strNamePlusBirthday = key + IV; string strKey = new string(strNamePlusBirthday.Reverse().ToArray()); if (sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).Length > tdes.Key.Length) { tdes.Key = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).ToString().Substring(0, tdes.Key.Length)); } else if (sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).Length < tdes.Key.Length) { tdes.Key = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strKey)).ToString().PadRight(tdes.Key.Length, ' ')); } //初始向量的设定 if (sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).Length > tdes.IV.Length) { tdes.IV = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).ToString().Substring(0, tdes.IV.Length)); } else if (sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).Length < tdes.IV.Length) { tdes.IV = Encoding.Default.GetBytes(sha1.ComputeHash(Encoding.Default.GetBytes(strNamePlusBirthday)).ToString().PadRight(tdes.IV.Length, ' ')); } byte[] readBuffer = bufMsg; MemoryStream streamRead = new MemoryStream(readBuffer); CryptoStream deCryStream = null; byte[] bufferReader; try { deCryStream = new CryptoStream(streamRead, new TripleDESCryptoServiceProvider().CreateDecryptor(tdes.Key, tdes.IV), CryptoStreamMode.Read); bufferReader = new byte[readBuffer.Length]; deCryStream.Read(bufferReader, 0, bufferReader.Length); } finally { deCryStream.Close(); streamRead.Close(); } string deCryString = Encoding.Default.GetString(bufferReader); return deCryString; } #endregion } #endregion } namespace EncryptDLL { #region 非对称加密类 /// /// 非对称加密类 /// public static class AsymmetricEncrytClass { #region 自动生成公钥、私钥方法 /// /// 自动生成非对称公钥、私钥 /// /// 返回的公钥 /// /// 返回的私钥 public static void GenerateKey(out string publicKey, out string privateKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); publicKey = rsa.ToXmlString(false); privateKey = rsa.ToXmlString(true); } #endregion #region 非对称加密代码 /// 非对称加密方法 /// /// 要加密的数据 /// /// 加密的公钥 /// /// 返回加密后的byte[]数据 public static byte[] AsymmetricEncryptRSAFunction(this string strMsg, string strPublicKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(strPublicKey); byte[] buffers = Encoding.UTF8.GetBytes(strMsg); byte[] encryBuffer; try { encryBuffer = rsa.Encrypt(buffers, false); } catch { return null; } return encryBuffer; } #endregion #region 非对称解密代码 /// /// 非对称解密方法 /// /// 需要解密的byte[]类型数据 /// 解密的私钥 /// 解密后的数据string类型 public static string AsymmetricDecryptRSAFunction(this byte[] byteMsg, string strPrivateKey) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(strPrivateKey); byte[] decryptBuffers; try { decryptBuffers = rsa.Decrypt(byteMsg, false); } catch (Exception e) { return e.Message; } return Encoding.UTF8.GetString(decryptBuffers); } #endregion } #endregion }
相关文章推荐
- 对称加密,非对称加密,签名
- 对称加密和非对称加密总结
- 对称加密与非对称加密
- 对称加密与非对称加密
- 对称加密与非对称加密
- 大话https演化过程(对称加密、非对称加密、公钥、私钥、数字签名、数字证书)
- 对称加密 非对称加密 不可逆加密算法
- 对称加密和非对称加密介绍和区别
- 对称加密和非对称加密
- https中相关的概念:明文、密文、密码、密钥、对称加密、非对称加密、摘要、数字签名、数字证书。
- (1)java自带软件包javax.crypto的使用方法,对称加密方法和非对称加密方法
- 3des(对称加密)和RSA(非对称加密)相结合加密
- Android与服务器交互方式中的对称加密和非对称加密
- 对称加密和非对称加密笔记
- 对称加密和非对称加密介绍和区别
- 【Java-加密算法】对称加密、非对称加密、单向散列(转)
- 对称加密与非对称加密
- android 对称加密,非对称加密 android 常见的加密
- 软件对称加密与非对称加密
- 对称加密和非对称加密介绍和区别