程序如下:最重要的是两个函数Encrypt和Decrypt,分别执行加解密操作,使用MemoryStream来做CryptoStream的操作对象。使用者只需要记住加密前生成的加密密钥和初始向量(即Key和IV),使用这个Key和IV可以将byte[]进行加解密。至于字符串,用Encoding转换成byte[]就可以。
加密方式是AES,当然可以根据自己需求修改成其他加密算法
运行截图:
代码:
using System;
using System.Text;
using System.IO;
using System.Security.Cryptography;
namespace Mgen.TTC
{
class Program
{
static void Main()
{
using (var aes = Aes.Create())
{
byte[] key, iv;
//其实Key和IV默认自己就会随机生成的,这里强调一下这个过程
aes.GenerateKey();
aes.GenerateIV();
key = aes.Key;
iv = aes.IV;
Console.WriteLine("请输入需要加密的文字");
string src = Console.ReadLine();
Console.WriteLine();
var datRaw = Encoding.Default.GetBytes(src);
var datEnc = Encrypt(datRaw, key, iv);
Console.WriteLine("加密Key: ");
PrintBytes(key);
Console.WriteLine();
Console.WriteLine("加密IV: ");
PrintBytes(iv);
Console.WriteLine();
Console.WriteLine("源数据");
PrintBytesB64(datRaw);
Console.WriteLine();
Console.WriteLine("加密后数据");
PrintBytesB64(datEnc);
Console.WriteLine();
Console.WriteLine("使用Key和IV解密后的文字");
var dec = Decrypt(datEnc, key, iv);
Console.WriteLine(Encoding.Default.GetString(dec));
}
}
static byte[] Encrypt(byte[] src, byte[] key, byte[] iv)
{
using (var aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
using (var ms = new MemoryStream())
using (var cstream = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
cstream.Write(src, 0, src.Length);
cstream.Close();
ms.Close();
return ms.ToArray();
}
}
}
static byte[] Decrypt(byte[] dest, byte[] key, byte[] iv)
{
using (var aes = Aes.Create())
{
aes.Key = key;
aes.IV = iv;
using (var ms = new MemoryStream(dest))
using (var destMs = new MemoryStream())
using (var cstream = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
byte[] data = new byte[100];
int readLen;
while ((readLen = cstream.Read(data, 0, 100)) > 0)
destMs.Write(data, 0, readLen);
return destMs.ToArray();
}
}
}
static void PrintBytes(byte[] data)
{
if (data == null)
throw new ArgumentNullException("data");
foreach (var b in data)
Console.Write("{0:X2} ", b);
Console.WriteLine();
}
static void PrintBytesB64(byte[] data)
{
if (data == null)
throw new ArgumentNullException("data");
Console.WriteLine(Convert.ToBase64String(data, Base64FormattingOptions.InsertLineBreaks));
}
}
}