c# aes加密解密私钥公钥通钥

发布于:2024-03-04 ⋅ 阅读:(70) ⋅ 点赞:(0)

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

namespace EncryptTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");

           
            string 密= EncryptAESBASE64("你第三方第三方斯蒂芬 手打几号放假啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 ****---#¥%…………&*(好", "666");
            Console.WriteLine(密);

            string 明文= DecryptAESBASE64(密, "666");
            Console.WriteLine(明文);

            明文 = DecryptAESBASE64(密, "私人的KEY_NAME");//公钥读取
            Console.WriteLine(明文);
        }
        public static byte[] CalculateMD5(string input)
        {
            MD5 md5 = MD5.Create();
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);
            return md5.ComputeHash(inputBytes);
        }

        private static Dictionary<string, byte[]>? keys=new Dictionary<string, byte[]>();

        public static void AddKey(string keyName, byte[] key)
        {
            if (!keys.ContainsKey(keyName))
            {
                keys.Add(keyName, key);
            }
        }

        public static string EncryptAESBASE64(string clearText, string keyName)
        {
            AddKey("私人的KEY_NAME", CalculateMD5(keyName));
            if (!keys.ContainsKey(keyName))
            {
                //添加
                byte[] md5 = CalculateMD5(keyName);
                AddKey(keyName, md5);
            }

            //解密的时候,不能随便让用户添加
            if (keys.ContainsKey(keyName))
            {
                byte[] key = keys[keyName];
                using (Aes encryptor = Aes.Create())
                {
                    encryptor.Key = key;
                    encryptor.IV = new byte[16]; // Use proper IV generation
                    encryptor.Padding = PaddingMode.PKCS7; // Set padding mode

                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                        {
                            byte[] clearBytes = Encoding.UTF8.GetBytes(clearText);
                            cs.Write(clearBytes, 0, clearBytes.Length);
                        }
                        return Convert.ToBase64String(ms.ToArray());
                    }
                }
            }
            else
            {
                return "读取失败502";
            }
        }

        public static string DecryptAESBASE64(string encryptedText, string keyName)
        {
            AddKey("私人的KEY_NAME", CalculateMD5(keyName));
            if (keys.ContainsKey(keyName))
            {
                byte[] key = keys[keyName];
                byte[] cipherBytes = Convert.FromBase64String(encryptedText);

                using (Aes encryptor = Aes.Create())
                {
                    encryptor.Key = key;
                    encryptor.IV = new byte[16]; // Use proper IV generation
                    encryptor.Padding = PaddingMode.PKCS7; // Set padding mode

                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(cipherBytes, 0, cipherBytes.Length);
                        }
                        return Encoding.UTF8.GetString(ms.ToArray());
                    }
                }
            }
            else
            {
                throw new ArgumentException("Key not found", nameof(keyName));
            }
        }

    }
}
 

点评:

这个代码需要提前添加       keys。

private static Dictionary<string, byte[]>? keys=new Dictionary<string, byte[]>();