在一个项目中需要将用户输入的字符串加密,不过在
System.Security.Cryptography 命名空间下所有用来加密解密的类全部都是对流进行操作的,没有对字符串直接操作的。于是我就到
System.IO 命名空间里找,看看有没有能利用的资源,结果发现了
MemoryStream 类。从这个类的名称来判断应该是对内存操作的流,或者用内存来模拟流。查了MSDN文档,果然可以利用这个类对字符串进行加密。以下是
DES 算法加密解密字符串的代码:
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
namespace MoneyStreamCryptoExample
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//初始化加密器生成器
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.GenerateKey();
des.GenerateIV();
//*************************
//加密字符串
//*************************
string notEncryptStr = Console.ReadLine();
//将字符串转换成字节
byte [] byteNotEncrypt = Encoding.UTF8.GetBytes( notEncryptStr );
//创建内存数据流
MemoryStream encryptMs = new MemoryStream();
//创建加密器
CryptoStream encryptCs = new CryptoStream( encryptMs, des.CreateEncryptor(), CryptoStreamMode.Write );
//将字节加密并写入内存
encryptCs.Write( byteNotEncrypt, 0, byteNotEncrypt.Length );
//将缓存中的数据写入内存
encryptCs.FlushFinalBlock();
//回到内存流开始的位置
encryptMs.Seek( 0, SeekOrigin.Begin );
//将加密后的数据读取出来
byte [] byteEncrypt = new byte[1024];
int i = encryptMs.Read( byteEncrypt, 0, 1024 );
encryptCs.Close();
//将加密后的字节转换为BASE64编码
string secStr = Convert.ToBase64String( byteEncrypt, 0, i );
Console.WriteLine( secStr );
//*************************
//解密字符串
//*************************
//将加密后的BASE64编码的字符串转换成字节
byte [] byteNotDecrypt = Convert.FromBase64String( secStr );
MemoryStream decryptMs = new MemoryStream( byteNotDecrypt );
CryptoStream decryptCs = new CryptoStream( decryptMs, des.CreateDecryptor(), CryptoStreamMode.Read );
//解密数据
byte [] byteDecrypt = new byte[1024];
i = decryptCs.Read( byteDecrypt, 0, 1024 );
decryptCs.Close();
//输出
Console.WriteLine( Encoding.UTF8.GetString( byteDecrypt, 0, i ) );
Console.ReadLine();
}
}
}
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
namespace MoneyStreamCryptoExample
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//初始化加密器生成器
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.GenerateKey();
des.GenerateIV();
//*************************
//加密字符串
//*************************
string notEncryptStr = Console.ReadLine();
//将字符串转换成字节
byte [] byteNotEncrypt = Encoding.UTF8.GetBytes( notEncryptStr );
//创建内存数据流
MemoryStream encryptMs = new MemoryStream();
//创建加密器
CryptoStream encryptCs = new CryptoStream( encryptMs, des.CreateEncryptor(), CryptoStreamMode.Write );
//将字节加密并写入内存
encryptCs.Write( byteNotEncrypt, 0, byteNotEncrypt.Length );
//将缓存中的数据写入内存
encryptCs.FlushFinalBlock();
//回到内存流开始的位置
encryptMs.Seek( 0, SeekOrigin.Begin );
//将加密后的数据读取出来
byte [] byteEncrypt = new byte[1024];
int i = encryptMs.Read( byteEncrypt, 0, 1024 );
encryptCs.Close();
//将加密后的字节转换为BASE64编码
string secStr = Convert.ToBase64String( byteEncrypt, 0, i );
Console.WriteLine( secStr );
//*************************
//解密字符串
//*************************
//将加密后的BASE64编码的字符串转换成字节
byte [] byteNotDecrypt = Convert.FromBase64String( secStr );
MemoryStream decryptMs = new MemoryStream( byteNotDecrypt );
CryptoStream decryptCs = new CryptoStream( decryptMs, des.CreateDecryptor(), CryptoStreamMode.Read );
//解密数据
byte [] byteDecrypt = new byte[1024];
i = decryptCs.Read( byteDecrypt, 0, 1024 );
decryptCs.Close();
//输出
Console.WriteLine( Encoding.UTF8.GetString( byteDecrypt, 0, i ) );
Console.ReadLine();
}
}
}