再共享一个安全帮助类-SecurityHelper

  发现自己的博客首页的底部Banner条的位置不对,原因是内容太少了。还没想好应该写什么,所以先把以前的一些小东西先整理出来,装点一下门面。

  SecurityHelper是以前写了用于远程业务通讯安全的一个帮助类,功能也很简单,还有需要改进的地方,但当时觉得能用了就没再管它。大家如果有什么建议将不胜感激。

  对了,请教一个问题,目前这些代码虽然都是我写的,但用在了公司的项目中。这会不会违背了职业道德?我的理解是这些代码都是比较通用的部分,凡是涉及具体业务的内容一律剔除,不涉及公司的商业秘密,也不可能因此对业务系统造成损害。另一方面,这类代码完全可以公开了接受公众检验,提高质量。当然这只是个人看法,如果大部分人认为这样做不合适那我会处理掉。

  1using System;
  2using System.IO;
  3using System.Security.Cryptography;
  4using System.Text;
  5using System.Xml;
  6
  7namespace NHTSS.Framework.Common
  8{
  9    /// <summary>
 10    /// 为系统提供加密、解密功能的帮助类。
 11    /// </summary>

 12    public sealed class SecurityHelper
 13    {
 14        /// <summary>
 15        /// 内部构造,不允许实例化该类。
 16        /// </summary>

 17        internal SecurityHelper()
 18        {
 19        }

 20
 21        /// <summary>
 22        /// 加密文本。
 23        /// </summary>
 24        /// <remarks>
 25        /// 使用RSA算法。
 26        /// </remarks>
 27        /// <param name="xmlKeyPath">密钥文件(XML)路径。</param>
 28        /// <param name="strMessage">待加密的文本。</param>
 29        /// <returns>密文。</returns>

 30        public static string RSAEncryptString(string xmlKeyPath, string strMessage)
 31        {
 32            if (!File.Exists(xmlKeyPath))
 33            {
 34                throw new System.IO.FileNotFoundException("加密密钥文件不存在。");
 35            }

 36            try
 37            {
 38                UnicodeEncoding myByteConverter = new UnicodeEncoding();
 39
 40                byte[] dataToEncrypt = myByteConverter.GetBytes(strMessage);
 41                byte[] encryptedData;
 42
 43                using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())
 44                {
 45                    XmlDocument myDoc = new XmlDocument();
 46                    myDoc.Load(xmlKeyPath);
 47                    myRSACSP.FromXmlString(myDoc.OuterXml);
 48
 49                    encryptedData = myRSACSP.Encrypt(dataToEncrypt, false);
 50                }

 51                return Convert.ToBase64String(encryptedData);
 52            }

 53            catch (System.Exception ex)
 54            {
 55                throw new ApplicationException("加密失败!\r\n" + ex.Message, ex);
 56            }

 57        }

 58
 59        /// <summary>
 60        /// 解密文本。
 61        /// </summary>
 62        /// <remarks>
 63        /// 使用RSA算法。
 64        /// </remarks>
 65        /// <param name="xmlKeyPath">密钥文件(XML)路径。</param>
 66        /// <param name="strCryptograph">待解密的文本。</param>
 67        /// <returns>明文。</returns>

 68        public static string RSADecryptString(string xmlKeyPath, string strCryptograph)
 69        {
 70            if (!File.Exists(xmlKeyPath))
 71            {
 72                throw new System.IO.FileNotFoundException("解密密钥文件不存在。");
 73            }

 74
 75            try
 76            {
 77                byte[] dataToDecrypt = Convert.FromBase64String(strCryptograph);
 78                byte[] decryptedData;
 79
 80                using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())
 81                {
 82                    XmlDocument myDoc = new XmlDocument();
 83                    myDoc.Load(xmlKeyPath);
 84                    myRSACSP.FromXmlString(myDoc.OuterXml);
 85
 86                    decryptedData = myRSACSP.Decrypt(dataToDecrypt, false);
 87                }

 88                UnicodeEncoding myByteConverter = new UnicodeEncoding();
 89                return myByteConverter.GetString(decryptedData);
 90            }

 91            catch (System.Exception ex)
 92            {
 93                throw new ApplicationException("解密失败!\r\n" + ex.Message, ex);
 94            }

 95        }

 96
 97
 98        /// <summary>
 99        /// 对文本进行签名。
100        /// </summary>
101        /// <param name="xmlPrivateKeyPath">签名密钥(XML)的路径。</param>
102        /// <param name="strMessage">待签名的文本。</param>
103        /// <returns>签名。</returns>

104        public static string RSASignString(string xmlPrivateKeyPath, string strMessage)
105        {
106            if (!File.Exists(xmlPrivateKeyPath))
107            {
108                throw new System.IO.FileNotFoundException("签名密钥文件不存在。");
109            }

110
111            try
112            {
113                UnicodeEncoding myByteConverter = new UnicodeEncoding();
114
115                byte[] dataToSign = myByteConverter.GetBytes(strMessage);
116                byte[] signedData;
117
118                using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())
119                {
120                    XmlDocument myDoc = new XmlDocument();
121                    myDoc.Load(xmlPrivateKeyPath);
122                    myRSACSP.FromXmlString(myDoc.OuterXml);
123
124                    signedData = myRSACSP.SignData(dataToSign, new SHA1CryptoServiceProvider());
125                }

126                return myByteConverter.GetString(signedData);
127            }

128            catch (System.Exception ex)
129            {
130                throw new ApplicationException("签名失败!\r\n" + ex.Message, ex);
131            }

132        }

133
134        /// <summary>
135        /// 验证签名。
136        /// </summary>
137        /// <param name="xmlPublicKeyPath">验证签名的公钥文件(XML)路径。</param>
138        /// <param name="strMessage">消息原文。</param>
139        /// <param name="strSignature">签名数据。</param>
140        /// <returns>验证结果。</returns>

141        public static bool RSAVerifySignString(string xmlPublicKeyPath, string strMessage, string strSignature)
142        {
143            if (!File.Exists(xmlPublicKeyPath))
144            {
145                throw new System.IO.FileNotFoundException("验证密钥文件不存在。");
146            }

147
148            try
149            {
150                UnicodeEncoding myByteConverter = new UnicodeEncoding();
151
152                byte[] dataToSign = myByteConverter.GetBytes(strMessage);
153                byte[] signedData = myByteConverter.GetBytes(strSignature);
154
155                bool bolResult = false;
156                using (RSACryptoServiceProvider myRSACSP = new RSACryptoServiceProvider())
157                {
158                    XmlDocument myDoc = new XmlDocument();
159                    myDoc.Load(xmlPublicKeyPath);
160                    myRSACSP.FromXmlString(myDoc.OuterXml);
161
162                    bolResult = myRSACSP.VerifyData(dataToSign, new SHA1CryptoServiceProvider(), signedData);
163                }

164                return bolResult;
165            }

166            catch (System.Exception ex)
167            {
168                throw new ApplicationException("验证签名失败!\r\n" + ex.Message, ex);
169            }

170        }

171    }

172
173    /// <summary>
174    /// 用来生成密钥对。
175    /// </summary>
176    /// <remarks>
177    /// 采用RSA算法。XML文件表示。
178    /// </remarks>

179    public class KeyGenerator
180    {
181        private XmlDocument _privateKey;
182        private XmlDocument _publicKey;
183
184        /// <summary>
185        /// 缺省构造,生成密钥对。
186        /// </summary>

187        public KeyGenerator()
188        {
189            //Use RSA Provider to generate public / private key pair
190            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
191            {
192                //  create the xml-docs
193                _privateKey = new XmlDocument();
194                _publicKey = new XmlDocument();
195
196                //  use RSA convenience methods to stuff public and private keys into dom's
197                _privateKey.LoadXml(RSA.ToXmlString(true));
198                _publicKey.LoadXml(RSA.ToXmlString(false));
199            }

200        }

201
202        /// <summary>
203        /// 私钥。
204        /// </summary>

205        public XmlDocument PrivateKey
206        {
207            get return _privateKey; }
208        }

209
210        /// <summary>
211        /// 公钥。
212        /// </summary>

213        public XmlDocument PublicKey
214        {
215            get return _publicKey; }
216        }

217
218        /// <summary>
219        /// 生成加密型强随机非零值序列作为会话令牌。
220        /// </summary>
221        /// <remarks>
222        /// 使用弱加密,16位。
223        /// </remarks>
224        /// <returns>随机的令牌。</returns>

225        public static string GenToken()
226        {
227            byte[] random = new Byte[16];
228            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
229            rng.GetNonZeroBytes(random);
230            UnicodeEncoding myByteConverter = new UnicodeEncoding();
231            return myByteConverter.GetString(random);
232        }

233    }

234}
posted @ 2006-03-21 20:11  bengxia  阅读(1239)  评论(0编辑  收藏  举报
无觅相关文章插件,快速提升流量