使用 .NET 进行加密/解密





3.00/5 (31投票s)
2002年3月15日

456782

5019
一个 .NET 对称算法安全类包装器,用于使用私钥进行内存加密/解密
引言
加密和解密
Microsoft .NET Framework 中的 System.Security.Cryptographic
命名空间提供了多种工具来辅助加密和解密。 这里使用 CryptoStream
类来演示使用 System.Security.Cryptographic.SymmetricAlgorithm
(例如 DESCryptoServiceProvider
、RC2CryptoServiceProvider
和 RijndaelManaged
类)进行加密和解密。
我在互联网上搜索了一些示例,但发现的所有示例都基于 Microsoft 在 KB 文章 Q307010 中的示例代码,该代码基本上将输入/输出文件作为源和目标。 我希望在内存中完成加密和解密,而无需指定源和目标文件,以便我可以在 Web 服务器或其他地方使用该代码。
如有任何问题,请发送电子邮件至:fangfrank@hotmail.com
方方
源代码
using System; using System.Security.Cryptography; using System.IO; using System.Text; namespace FangHome_Crypto { /// <summary> /// SymmCrypto is a wrapper of System.Security.Cryptography.SymmetricAlgorithm classes /// and simplifies the interface. It supports customized SymmetricAlgorithm as well. /// </summary> public class SymmCrypto { /// <remarks> /// Supported .Net intrinsic SymmetricAlgorithm classes. /// </remarks> public enum SymmProvEnum : int { DES, RC2, Rijndael } private SymmetricAlgorithm mobjCryptoService; /// <remarks> /// Constructor for using an intrinsic .Net SymmetricAlgorithm class. /// </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> /// Constructor for using a customized SymmetricAlgorithm class. /// </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(); } } }