首页 > 编程语言 >C# 使用AES实现简单的加解密

C# 使用AES实现简单的加解密

时间:2023-12-10 11:45:54浏览次数:33  
标签:AES string C# 加解密 Aes Key new using aesAlg

加密:

// 使用SHA-256哈希函数处理秘钥
var hashedKey = GetSHA256Hash(publicKey);

// 加密
var encryptString = EncryptStringToBytes_Aes(strs, hashedKey);


static string GetSHA256Hash(string input)
{
    using (SHA256 sha256 = SHA256.Create())
    {
        byte[] inputBytes = Encoding.UTF8.GetBytes(input);
        byte[] hashedBytes = sha256.ComputeHash(inputBytes);
        // 取前32字节作为AES算法的秘钥
        return Convert.ToBase64String(hashedBytes).Substring(0, 32);
    }
}

static string EncryptStringToBytes_Aes(string plainText, string Key)
{
    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = Encoding.UTF8.GetBytes(Key);
        aesAlg.IV = new byte[16];

        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, Encoding.UTF8))
                {
                    swEncrypt.Write(plainText);
                }
                return Convert.ToBase64String(msEncrypt.ToArray());
            }
        }
    }
}

解密:

// 使用SHA-256哈希函数处理秘钥
string hashedKey = GetSHA256Hash(publicKey);

var decryptString = DecryptStringFromBytes_Aes(strs, hashedKey);

static string GetSHA256Hash(string input)
{
    using (SHA256 sha256 = SHA256.Create())
    {
        byte[] inputBytes = Encoding.UTF8.GetBytes(input);
        byte[] hashedBytes = sha256.ComputeHash(inputBytes);
        // 取前32字节作为AES算法的秘钥
        return Convert.ToBase64String(hashedBytes).Substring(0, 32);
    }
}

static string DecryptStringFromBytes_Aes(string cipherText, string Key)
{
    byte[] cipherBytes = Convert.FromBase64String(cipherText);

    using (Aes aesAlg = Aes.Create())
    {
        aesAlg.Key = Encoding.UTF8.GetBytes(Key);
        aesAlg.IV = new byte[16]; // IV应该与加密时生成的IV相同

        ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

        using (MemoryStream msDecrypt = new MemoryStream(cipherBytes))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(csDecrypt, Encoding.UTF8))
                {
                    return srDecrypt.ReadToEnd();
                }
            }
        }
    }
}

 

标签:AES,string,C#,加解密,Aes,Key,new,using,aesAlg
From: https://www.cnblogs.com/log9527blog/p/17892322.html

相关文章

  • vue3学习之createApp(App).mount('#app')
    装了vue-cli之后,新建个项目跑起来了,碰上个没理解的问题,不知道createApp(App).mount('#app')挂载的这个id=“app”从哪冒出来的 用命令创建出来的项目,components/HelloWorld.vue,App.vue,main.js中都没有估摸着得是底层的,网上找一圈,各路大神基本是一句带过,可能是太简单了,没......
  • CentOS的GPT分区+LVM挂载
    为突破MBR分区限制(最大卷:2T,最多4个主分区或3个主分区加一个扩展分区)常常以GPT分区方式(突破MBR4个主分区限制,每个磁盘最多支持128个分区,支持大于2T的分区,最大卷可达18EB)新建分区并挂载,下面记录自己常用的GPT+LVM的方式挂载新的硬盘的方式。1.查看硬盘标签使用fdisk-l也可查看......
  • ARC169 B Subsegments with Small Sums 题解
    LinkARC169BSubsegmentswithSmallSumsQuestion\(x\)是一个序列,定义\(f(x)\)为把序列\(x\)切成几段,每段的和不能超过\(S\)的最小段数给出序列\(A=(A_1,A_2,\cdots,A_N)\)求:\[\sum_{1\lel\leN}f((A_l,A_{l+1},\cdots,A_r))\]Question先考虑一个结论,\(x\)为......
  • C++ Qt开发:使用顺序容器类
    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。Qt中提供了丰富的容器类,用于方便地管理和操作数据。这些容......
  • RISC-V 环境搭建问题----1
    在此记录一下搭建开源Vivado-risc-v项目时所遇到的一些问题本来已经弄好的差不多了,最后一看,下载的别人网盘的,版本落后了,只支持到vivado2022.1....只好重新拉一下最新的,又踩雷无数。1.wls2进行gitclone时连接拒绝原文:Ubuntu20.4WSL2无法访问github终极解决方案_ubuntug......
  • RT-mutex 实现设计【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/rt-mutex-design.htmlRT-mutex实现设计版权所有(c)2006StevenRostedt根据GNU自由文档许可证第1.2版许可本文档试图描述rtmutex.c实现的设计。它并不描述rtmutex.c存在的原因。有关此内容,请参阅带PI支持的RT-m......
  • EXCEL快捷键2
    Excelで行挿入^+Shift++(plus)行削除^+-Excelで行・列をグループするAlt+Shift+→逆に解除するショートカット:Alt+Shift+←選択範囲の列全体を選択する^+space行全体選択:shift+space※IME半角の場合コメントの表示・非表示の切り替えA......
  • 通用互斥子系统 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/mutex-design.html通用互斥子系统由[email protected]发起由[email protected]更新互斥锁是什么?在Linux内核中,互斥锁指的是一种特定的锁原语,它在共享内存系统上强制进行串行化,而不仅仅是指学术界......
  • Excel公式
    Excel公式cell内容比较IF(A1=B1,"0","1")同效果:=A1=B1=NOT(A1=B1)*1时间型变换表示dima,ba="17:1:2"b=Format(a,"hh:mm:ss")⇒17:01:02b=Format(a,"hh時mm分ss秒")⇒17時01分02秒统计只表示出来的内容,用subtotal例如:フィルタ......
  • 锁统计 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/lockstat.html锁统计什么顾名思义,它提供了有关锁的统计信息。为什么因为诸如锁争用之类的问题会严重影响性能。如何Lockdep已经在锁函数中设置了钩子,并将锁实例映射到锁类上。我们在此基础上构建(参见运行时锁正确性验证器)......