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

程序如下:最重要的是两个函数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));

        }

 

    }

 

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值