C# 实现RSA AES加密解密

RAS:

C#  System.Security.Cryptography 提供了base64和xmlstring两种方式,我更喜欢base64的

 

RSA是非对称加密,经典的对称加密就是DES,AES等,不过这两种算法的缺点是加解密双方都必须知道密钥,安全性不高

RSA则可以解决这个问题,生成公钥和私钥,公钥可以公开给其他人,私钥自己保管,别人用公钥加密后,自己用私钥解密。

 

RSA代码如下:

using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Windows;

namespace RSA
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            RSAUtil rsaInstance = new RSAUtil();
            var dictK = rsaInstance.GetKey();
            string strText = "aaabbbcc";
            Console.WriteLine("要加密的字符串是:{0}", strText);
            string str1 = rsaInstance.Encrypt(strText, dictK["PublicKey"]);
            Console.WriteLine("加密后的字符串:{0}", str1);
            string str2 = rsaInstance.Decrypt(str1, dictK["PrivateKey"]);
            Console.WriteLine("解密后的字符串:{0}", str2);
        }
    }

    public class RSAUtil
    {
        /// <summary>
        /// 使用公钥加密
        /// </summary>
        /// <returns></returns>
        public string Encrypt(string strText, string strPublicKey)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.ImportCspBlob(Convert.FromBase64String(strPublicKey));
            byte[] byteText = Encoding.UTF8.GetBytes(strText);
            byte[] byteEntry = rsa.Encrypt(byteText, false);
            return Convert.ToBase64String(byteEntry);
        }

        /// <summary>
        /// 私钥解密
        /// </summary>
        /// <param name="strEntryText"></param>
        /// <param name="strPrivateKey"></param>
        /// <returns></returns>
        public string Decrypt(string strEntryText, string strPrivateKey)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.ImportCspBlob(Convert.FromBase64String(strPrivateKey));
            byte[] byteEntry = Convert.FromBase64String(strEntryText);
            byte[] byteText = rsa.Decrypt(byteEntry, false);
            return Encoding.UTF8.GetString(byteText);
        }

        /// <summary>
        /// 获取公钥和私钥
        /// </summary>
        /// <returns></returns>
        public Dictionary<string, string> GetKey()
        {
            Dictionary<string, string> dictKey = new Dictionary<string, string>();
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            string public_Key = Convert.ToBase64String(rsa.ExportCspBlob(false));
            string private_Key = Convert.ToBase64String(rsa.ExportCspBlob(true));
            dictKey.Add("PublicKey", public_Key);
            dictKey.Add("PrivateKey", private_Key);
            return dictKey;
        }
    }
}

 

 

AES代码如下:

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace AEStest
{
    class Program
    {
        //为什么要用base64,因为得到的密文是byte[],所以默认用base64转成str方便查看
        static void Main(string[] args)
        {
            string password = "abcAE#$M&*987";
            Console.WriteLine($"原始密码为:{password} ");
            string key = "1234567890qwerty";//16字节,128位

            var EncryptStr = Encrypt(key, password);
            Console.WriteLine($"使用密钥:{key} 为原密码:{password} 加密");
            Console.WriteLine($"得到密文:{EncryptStr}");

            Console.WriteLine($"使用密钥:{key} 为密文:{EncryptStr} 解密");
            var realPwd = Decrypt(key, EncryptStr);
            Console.WriteLine($"得到原密码:{realPwd}");
        }

        // AES 加密的初始化向量,加密解密需设置相同的值。默认值我们设置成 16 个 0
        public static byte[] AES_IV = Encoding.UTF8.GetBytes("0000000000000000");

        // AES的key支持128位,最大支持256位。256位需要32个字节。
        // 所以这里使用密钥的前 32 字节作为 key ,不足32补 0。
        public static byte[] GetKey(string pwd)
        {
            while (pwd.Length < 32)
            {
                pwd += '0';
            }
            pwd = pwd.Substring(0, 32);
            return Encoding.UTF8.GetBytes(pwd);
        }




        /// <summary>
        ///  加密
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="password">要被加密的原始密码</param>
        /// <returns>密文base64</returns>
        public static string Encrypt(string key, string password)
        {
            using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
            {
                aesAlg.Key = GetKey(key);
                aesAlg.IV = AES_IV;
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(password);
                        }
                        byte[] bytes = msEncrypt.ToArray();
                        return Convert.ToBase64String(bytes);
                    }
                }
            }
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="EncryptStr">密文</param>
        /// <returns>明文-原密码</returns>
        public static string Decrypt(string key, string EncryptStr)
        {
            byte[] inputBytes = Convert.FromBase64String(EncryptStr);
            using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
            {
                aesAlg.Key = GetKey(key);
                aesAlg.IV = AES_IV;

                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
                using (MemoryStream msEncrypt = new MemoryStream(inputBytes))
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srEncrypt = new StreamReader(csEncrypt))
                        {
                            return srEncrypt.ReadToEnd();
                        }
                    }
                }
            }
        }
    }
}

AES加解密,不同语言之间,需要对上AES的模式,密钥,向量, 编码格式

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值