Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C#对称加密(AES加密)每次生成的密文结果不同思路代码分享

C#对称加密(AES加密)每次生成的密文结果不同思路代码分享

作者头像
磊哥
发布于 2018-04-26 09:03:47
发布于 2018-04-26 09:03:47
1.6K00
代码可运行
举报
文章被收录于专栏:王磊的博客王磊的博客
运行总次数:0
代码可运行

思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量。

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static string Encrypt(string plainText, string AESKey)
{
    RijndaelManaged rijndaelCipher = new RijndaelManaged();
    byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组 
    rijndaelCipher.Key = Convert.FromBase64String(AESKey);//加解密双方约定好密钥:AESKey
    rijndaelCipher.GenerateIV();
    byte[] keyIv = rijndaelCipher.IV;
    byte[] cipherBytes = null;
    using (MemoryStream ms = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(ms, rijndaelCipher.CreateEncryptor(), CryptoStreamMode.Write))
        {
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            cipherBytes = ms.ToArray();//得到加密后的字节数组
            cs.Close();
            ms.Close();
        }
    }
    var allEncrypt = new byte[keyIv.Length + cipherBytes.Length];
    Buffer.BlockCopy(keyIv, 0, allEncrypt, 0, keyIv.Length);
    Buffer.BlockCopy(cipherBytes, 0, allEncrypt, keyIv.Length * sizeof(byte), cipherBytes.Length);
    return Convert.ToBase64String(allEncrypt);
}

public static string Decrypt(string showText, string AESKey)
{
    string result = string.Empty;
    try
    {
        byte[] cipherText = Convert.FromBase64String(showText);
        int length = cipherText.Length;
        SymmetricAlgorithm rijndaelCipher = Rijndael.Create();
        rijndaelCipher.Key = Convert.FromBase64String(AESKey);//加解密双方约定好的密钥
        byte[] iv = new byte[16];
        Buffer.BlockCopy(cipherText, 0, iv, 0, 16);
        rijndaelCipher.IV = iv;
        byte[] decryptBytes = new byte[length - 16];
        byte[] passwdText = new byte[length - 16];
        Buffer.BlockCopy(cipherText, 16, passwdText, 0, length - 16);
        using (MemoryStream ms = new MemoryStream(passwdText))
        {
            using (CryptoStream cs = new CryptoStream(ms, rijndaelCipher.CreateDecryptor(), CryptoStreamMode.Read))
            {
                cs.Read(decryptBytes, 0, decryptBytes.Length);
                cs.Close();
                ms.Close();
            }
        }
        result = Encoding.UTF8.GetString(decryptBytes).Replace("\0", "");   ///将字符串后尾的'\0'去掉
    }
    catch { }
    return result;
}

调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string jiaMi = MyAESTools.Encrypt(textBox1.Text, "abcdefgh12345678abcdefgh12345678");

string jieMi = MyAESTools.Decrypt(textBox3.Text, "abcdefgh12345678abcdefgh12345678");
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-01-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信小程序获取用户信息签名解密C#
在做小程序时,官方没有C#的解密,自己给写一个封装,希望可以帮到大家 #region 解密 #region 私有方法 private static byte[] AES_Decrypt(String Input, byte[] Iv, byte[] Key) { RijndaelManaged aes = new RijndaelManaged(); aes.KeySize = 128;//原始:2
牛嗷嗷
2018/03/30
1.3K0
Asp.Net 加密解密
#region DES加密解密 /// <summary> /// DES加密 /// </summary> /// <param name="strSource">待加密字串</param> /// <param name="key">32位Key值</param> /// <returns>加密后的字符串</returns> public string DESEncrypt(string strSource) { return DESEncrypt(strSource, DESKey); } public string DESEncrypt(string strSource, byte[] key) { SymmetricAlgorithm sa = Rijndael.Create(); sa.Key = key; sa.Mode = CipherMode.ECB; sa.Padding = PaddingMode.Zeros; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write); byte[] byt = Encoding.Unicode.GetBytes(strSource); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); return Convert.ToBase64String(ms.ToArray()); } /// <summary> /// DES解密 /// </summary> /// <param name="strSource">待解密的字串</param> /// <param name="key">32位Key值</param> /// <returns>解密后的字符串</returns> public string DESDecrypt(string strSource) { return DESDecrypt(strSource, DESKey); } public string DESDecrypt(string strSource, byte[] key) { SymmetricAlgorithm sa = Rijndael.Create(); sa.Key = key; sa.Mode = CipherMode.ECB; sa.Padding = PaddingMode.Zeros; ICryptoTransform ct = sa.CreateDecryptor(); byte[] byt = Convert.FromBase64String(strSource); MemoryStream ms = new MemoryStream(byt); CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Read); StreamReader sr = new StreamReader(cs, Encoding.Unicode); return sr.ReadToEnd(); }
用户8671053
2021/11/02
2.1K0
3DES 加密与解密
/// <summary>     /// C#/PHP/JSP 3DES 加密与解密(只支持UTF-8编码)     /// </summary>     public class Crypto3DES     {         /// <summary>         /// 默认密钥         /// </summary>         private string Keys;         /// <summary>         /// 密钥与加密字符串
用户1220053
2018/02/09
2.2K0
那些常用的加密算法
MD5加密是最常见的加密方式,因为MD5是不可逆的,所以很多系统的密码都是用MD5加密保存的。
Kiba518
2020/11/26
1.2K0
那些常用的加密算法
3des算法源码
using System; using System.Text; using System.IO; using System.Security.Cryptography; class Class1 { static void Main() {   Console.WriteLine("Encrypt String...");   txtKey = "tkGGRmBErvc=";   btnKeyGen();   Console.WriteLine("Encrypt Key :{0}",txtKey);   txtIV = "Kl7ZgtM1dvQ=";   btnIVGen();   Console.WriteLine("Encrypt IV :{0}",txtIV);   Console.WriteLine();   string txtEncrypted = EncryptString("1111");   Console.WriteLine("Encrypt String : {0}",txtEncrypted);   string txtOriginal = DecryptString(txtEncrypted);   Console.WriteLine("Decrypt String : {0}",txtOriginal); } private static SymmetricAlgorithm mCSP; private static string txtKey; private static string txtIV; private static void btnKeyGen() {   mCSP = SetEnc();   byte[] byt2 = Convert.FromBase64String(txtKey);   mCSP.Key = byt2; } private static void btnIVGen() {   byte[] byt2 = Convert.FromBase64String(txtIV);   mCSP.IV = byt2; } private static string EncryptString(string Value) {   ICryptoTransform ct;   MemoryStream ms;   CryptoStream cs;   byte[] byt;   ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);   byt = Encoding.UTF8.GetBytes(Value);   ms = new MemoryStream();   cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);   cs.Write(byt, 0, byt.Length);   cs.FlushFinalBlock();   cs.Close();   return Convert.ToBase64String(ms.ToArray()); } private static string DecryptString(string Value) {   ICryptoTransform ct;   MemoryStream ms;   CryptoStream cs;   byte[] byt;   ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);   byt = Convert.FromBase64String(Value);   ms = new MemoryStream();   cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);   cs.Write(byt, 0, byt.Length);   cs.FlushFinalBlock();   cs.Close();   return Encoding.UTF8.GetString(ms.ToArray()); } private static SymmetricAlgorithm SetEnc() {   return new DESCryptoServiceProvider(); } } 3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样, 3
py3study
2020/01/10
7020
WinForm加密技术全解析
在当今数字化时代,数据安全至关重要。对于WinForm应用程序而言,保护敏感数据不被窃取或篡改是开发者必须重视的问题。加密技术作为数据安全的重要防线,能够将原始数据转换为密文,只有通过特定的密钥和算法才能还原为原始数据。本文将深入探讨WinForm中的加密技术,包括常见的加密算法及其实现方式。
郑子铭
2025/03/24
680
WinForm加密技术全解析
c#爬取Silverlight网页[通俗易懂]
爬取普通的文本网页非常容易,但爬取Silverlight的网页代码时,有时候可能会加密。这样就会很麻烦了。下面就爬取网站http://zx.bjmemc.com.cn/ (北京空气质量网)进行说明。
全栈程序员站长
2022/11/02
7740
c#爬取Silverlight网页[通俗易懂]
对称加密和解密
.NET提供了一组类型来实现对称加密和解密。这些类型拥有共同的基类SymmetricAlgorithm,如图所示。
小蜜蜂
2019/07/24
2.1K0
对称加密和解密
对称加密与非对称加密
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
用户7353950
2022/05/10
1K0
对称加密与非对称加密
【Unity3D】存档文件加密代码
存档文件, 被修改起来现在变的很容易了, 为了解决这个问题,请用下面的代码,修改playerPrefs.cs
py3study
2020/01/08
5530
ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
前言:   这一节提供一个简单的功能,这个功能看似简单,找了一下没找到EF链接数据库串的加密帮助文档,只能自己写了,这样也更加符合自己的加密要求 有时候我们发布程序为了避免程序外的SQL链接串明文暴露,需要进行一些加密手段! 加密主要分几类:对称加密,非对称加密,散列算法(自己百度脑补,这里不再多说) 我这里选择AES 256位的加密,主要加密速度算法快,安全性高,资源消耗低。 公司一直在使用AES加密来加密一些小数据量的数据,比较方法和安全   这是我选择加密AES的理由,当然你可以选择其他有名的加密
用户1149182
2018/01/16
1K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(62)-EF链接串加密
DES/3DES/AES加密
数据加密算法DES 数据加密算法(Data EncryptionAlgorithm,DEA)的数据加密标准(Data Encryption Standard,DES)是规范的描述,它出自 IBM的研究工作,并在 1997 年被美国政府正式采纳。它很可能是使用最广泛的秘钥系统,特别是在保护金融数据的安全中,最初开发的 DES 是嵌入硬件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用 DES。 DES 使用一个 56位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环。 *** DES的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced EncryptionStandard,AES)。 DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。 IBM 曾对 DES 拥有几年的专利权,但是在 1983 年已到期,并且处于公有范围中,允许在特定条件下可以免除专利使用费而使用。 由于DES是加(解)密64位明(密)文,即为8个字节(8*8=64),可以据此初步判断这是分组加密,加密的过程中会有16次循环与密钥置换过程,据此可以判断有可能是用到DES密码算法,更精确的判断还得必须懂得一点DES的加密过程。 Crackme实例分析 本期Crackme用到MD5及DES两种加密算法,难度适中。这次我们重点来看一下DES的加密过程及注册算法过程。用调试器载入程序,下GegDlgItemTextA断点,可以定位到下面代码,我们先来看一下整个crackme的注册过程: 由于代码分析太长,故收录到光盘中,请大家对照着分析(请见光盘“code1.doc”) 从上面分析可以看出,注册过程是类似:f(机器码,注册码)式的两元运算。机器码是经过md5算法得到的中间16位值,注册码是经过DES解密过程取得16位注册码,然后两者比较,如相等,则注册成功。机器码的运算过程可以参照上一期的MD5算法来理解。下面重点来说一下注册码DES的运算过程。 1、密钥处理过程:一般进行加解密过程都要初始化密钥处理。我们可以跟进004023FA CALL Crackme1.00401A40这个call,可以看到如下代码: …(省略)... 00401A4D LEA ECX,DWORD PTR DS:[ECX] 00401A50 /MOV EDX,EAX 00401A52 |SHR EDX,3 00401A55 |MOV DL,BYTE PTR DS:[EDX+ESI] 00401A58 |MOV CL,AL 00401A5A |AND CL,7 00401A5D |SAR DL,CL 00401A5F |AND DL,1 00401A62 |MOV BYTE PTR DS:[EAX+417DA0],DL 00401A68 |INC EAX 00401A69 |CMP EAX,40 这里比较是否小于64 00401A6C \JL SHORT Crackme1.00401A50 以上过程就是去掉密钥各第八位奇偶位。 …(省略)... 00401AB0 |MOV DL,BYTE PTR DS:[ECX+417D9F] 00401AB6 |MOV BYTE PTR DS:[EAX+417BA3],DL 00401ABC |ADD EAX,4 00401ABF |CMP EAX,38 这里进行密钥变换 …(省略)... 00401BFF ||MOVSX ECX,BYTE PTR DS:[EAX+412215] 00401C06 ||MOV CL,BYTE PTR DS:[ECX+417D9F] 00401C0C ||MOV BYTE PTR DS:[EAX+417BA5],CL 00401C12 ||ADD EAX,6 00401C15 ||CMP EAX,30 这里产生48位的子密钥 00401C18 |\JL SHORT Crackme1.00401BA0 00401C1A |MOV EAX,DWORD PTR SS:[ESP+14]
py3study
2020/01/08
1.1K0
C#开发中常用的加密解密方法
相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天给大家分享我个人总结的一些加密算法:
用户7053485
2020/03/19
2K0
C#封装的DES加密、解密类代码
这个C#类封装的DES加密解密,可以使用默认秘钥进行加密、解密,也可以自定义秘钥进行加密、解密,调用简单方便。
用户7108768
2021/11/03
1.3K0
C#笔记:RC4算法实现
public class RC4Cryptor     {                 public byte[] Encrypt(byte[] data, string pwd)         {             SymmetricAlgorithm sa = RC4Creator.Create(); ;             //             byte[] inputByteArray = data;//得到需要加密的字节数组             //设置密钥及密钥
超级大猪
2019/11/21
1.6K0
ASP.NET Core 数据加解密的一些坑
ASP.NET Core 给我们提供了自带的Data Protection机制,用于敏感数据加解密,带来方便的同时也有一些限制可能引发问题,这几天我就被狠狠爆了一把
Edi Wang
2019/07/08
1.7K0
ASP.NET Core 数据加解密的一些坑
C#实现微信AES-128-CBC加密数据的解密
小程序登录时,获得用户的信息,只是昵称,无法用作ID。而有用的数据,都加密着,腾讯给出了解密的方法: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下: 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。 对称解密的目标密文为 Base64_Decode(encryptedD
用户1075292
2018/01/23
3.4K0
C#实现微信AES-128-CBC加密数据的解密
c#通用登录模块,简单好用,一贴见效
// 举个例子:一个网站有用户系统、商家系统、网站后台3个系统 //可以分3个userType, user ,shop , system //网站后台一般都有角色,如admin,employee //那么网站的角色就有 user,shop,admin,employee,但是admin和employee在一个客户端是不能同时登陆的,所以他们是同一类用户(system) 使用方法: 1、添加一个类LoginUser.cs 代码如下: 代码: namespace MVCCommonAut
阿炬
2018/05/11
1.1K2
一款实用的.NET Core加密解密工具类库
在我们日常开发工作中,为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES,RSA,MD5,SAH1,SAH256,DES等,这时候假如我们有一个封装的对应加密解密工具类可以直接调用,那这样可以节省不少的开发时间。今天推荐一款实用的.NET Core加密解密工具类库:NETCore.Encrypt。
追逐时光者
2023/11/20
3210
一款实用的.NET Core加密解密工具类库
DotNet中几种常用的加密算法
彭泽0902
2018/01/04
7670
相关推荐
微信小程序获取用户信息签名解密C#
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验