您的位置:首页 > 编程语言 > C#

C#实现内存中字符串或byte[]的加解密

2011-10-09 12:58 369 查看
程序如下:最重要的是两个函数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));

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐