一、简介

AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高。

用AES加密2000年10月,NIST(美国国家标准和技术协会)宣布通过从15种候选算法中选出的一项新的密匙加密标准。Rijndael被选中成为将来的 AES。Rijndael是在1999年下半年,由研究员Joan Daemen 和 Vincent Rijmen 创建的。AES正日益成为加密各种形式的电子数据的实际标准。

美国标准与技术研究院(NIST)于2002年5月26日制定了新的高级加密标准(AES)规范。

AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。

AES使用几种不同的方法来执行排列和置换运算。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。

与公共密钥加密使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

二、实现

/// <summary>
/// AES加解密
/// ECB模式,偏移向量不起作用
/// 当前代码的密钥、偏移向量不可以含有中文
/// 如需跟java、php通用加解密,参数需一致
/// </summary>
public class AesHelper
{
//默认密钥、初始化向量
private static readonly string _Key = "Q3zmD8v^LWYu5QsX"; //默认密钥 长度可为16位、24位、32位
private static readonly string _Vector = "figQi#gxIxqcnaKr"; //默认偏移向量 长度为16位 /// <summary>
/// AES加密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 输出:Base64
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <returns>大写的密文</returns>
public static string Encrypt(string plaintext)
{
return Encrypt(plaintext, _Key, _Vector);
} /// <summary>
/// AES加密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 输出:自定义
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <returns>大写的密文</returns>
public static string Encrypt(string plaintext, OutputMethod method)
{
return Encrypt(plaintext, _Key, _Vector, method);
} /// <summary>
/// AES加密
/// 密码:自定义
/// 偏移量:自定义
/// 模式:CBC
/// 填充:PKCS7
/// 输出:Base64
/// 编码:UTF8
/// </summary>
/// <param name="plaintext">明文</param>
/// <param name="key">密码,16、24、32位,不含中文</param>
/// <param name="iv">偏移量,16位,不含中文</param>
/// <param name="cipher">加密模式</param>
/// <param name="padding">填充</param>
/// <returns></returns>
public static string Encrypt(string plaintext, string key, string iv, OutputMethod method = OutputMethod.Base64, CipherMode cipher = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
if (String.IsNullOrEmpty(plaintext))
{
throw new ArgumentNullException("明文不能为空");
} Encoding encoding = Encoding.UTF8;
byte[] byteContent = encoding.GetBytes(plaintext);
byte[] byteKey = encoding.GetBytes(key);
byte[] byteIV = encoding.GetBytes(iv); Rijndael rjd = Rijndael.Create();
rjd.Key = byteKey;
rjd.IV = byteIV;
rjd.Mode = cipher;
rjd.Padding = padding; using (MemoryStream ms = new MemoryStream())
{
CryptoStream cStream = new CryptoStream(ms, rjd.CreateEncryptor(), CryptoStreamMode.Write);
cStream.Write(byteContent, , byteContent.Length);
cStream.FlushFinalBlock(); byte[] result = ms.ToArray();
return EadUtil.Output(result, method);
}
} /// <summary>
/// AES解密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext">密文</param>
/// <returns>返回明文</returns>
public static string Decrypt(string ciphertext)
{
return Decrypt(ciphertext, _Key, _Vector);
} /// <summary>
/// AES解密
/// 密码:默认
/// 偏移量:默认
/// 模式:CBC
/// 填充:PKCS7
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext">密文</param>
/// <returns>返回明文</returns>
public static string Decrypt(string ciphertext, OutputMethod method)
{
return Decrypt(ciphertext, _Key, _Vector, method);
} /// <summary>
/// AES解密
/// 密码:自定义
/// 偏移量:自定义
/// 模式:CBC
/// 填充:PKCS7
/// 编码:UTF8
/// </summary>
/// <param name="ciphertext">密文</param>
/// <param name="key">密码,16、24、32位,不含中文</param>
/// <param name="iv">偏移量,16位,不含中文</param>
/// <param name="cipher">加密模式</param>
/// <param name="padding">填充</param>
/// <returns></returns>
public static string Decrypt(string ciphertext, string key, string iv, OutputMethod method = OutputMethod.Base64, CipherMode cipher = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
if (String.IsNullOrEmpty(ciphertext))
{
throw new ArgumentNullException("密文不能为空");
} byte[] buffer = EadUtil.Input(ciphertext, method); Encoding encoding = Encoding.UTF8;
byte[] byteKey = encoding.GetBytes(key);
byte[] byteIV = encoding.GetBytes(iv); Rijndael aes = Rijndael.Create();
aes.Key = byteKey;
aes.IV = byteIV;
aes.Mode = cipher;
aes.Padding = padding; using (MemoryStream ms = new MemoryStream())
{
CryptoStream cStream = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write);
cStream.Write(buffer, , buffer.Length);
cStream.FlushFinalBlock();
ms.Close();
return encoding.GetString(ms.ToArray());
}
}
}

点击查看 OutputMethod、EadUtil

【加密算法】AES的更多相关文章

  1. JAVA的对称加密算法AES——加密和解密

    出自: http://blog.csdn.net/hongtashan11/article/details/6599645 http://www.cnblogs.com/liunanjava/p/42 ...

  2. java加密算法AES与RSA

    1.commons-codec使用 commons-codes 常用工具类:DigestUtils,Base64,Hex 1.1 md5 String text = "hello,md5&q ...

  3. 第八章 对称加密算法--AES

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 8.1.AES 特点: 密钥建立时间短.灵敏性好.内存需求低(不管怎样,反正就是好) ...

  4. Java加密算法 AES

    版权声明:本文为博主原创文章,转载请注明出处. [java] view plain copy print?在CODE上查看代码片派生到我的代码片 package com.stone.security; ...

  5. AES加密算法原理

    随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES[1].经过三轮的筛选 ...

  6. [非原创] 常用加密算法整理 AES/SSL(一)

    前言: 在伟大的计算机科学家研究下,发明了许多的加密算法,以下做个简答的描述: 一.分类 加密算法分为两种:单向加密.双向加密. 单向加密,不可逆的加密算法,只能加密不能解密: 双向加密,由对称性加密 ...

  7. DES、3DES、AES、PBE对称加密算法实现及应用

    1.对称加密算法概述 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文 ...

  8. C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

    一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应 ...

  9. IOS开发之—— 各种加密的使用(MD5,base64,DES,AES)

    基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法)SHA(Secure Hash Algorithm ...

  10. 【Android工具】DES终结者加密时报——AES加密演算法

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中.我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了怎样才干实现 ...

随机推荐

  1. 百度BAE的使用

  2. Sql求和异常——对象不能从 DBNull 转换为其他类型

    做项目遇到一个以前没遇到的问题,就是要计算一个用户消费总额, 关键代码如下: string sql = "select sum(Tmoney) from [order] where uid= ...

  3. .net的内置对象

    一 . 获取客户端,服务器端信息: Response.Write("客户端信息:"); Response.Write("<br>浏览器类型,版本:" ...

  4. centos云服务器安装Python3记录

    题记 购买了一个月的服务器和公网ip,计划用Python与Nginx写一个web服务,于是踏上了漫漫的摸索之路. 行程 步骤 1.本地ssh连接. 2.mkdir /usr/local/python3 ...

  5. WCF生成客户端代理对象的两种方法的解释

    最近在封装WCF,有一些很好的实践就记录下来,大家可以放心使用,所有代码都已经调试过.如果有高手可以大家探讨一下. 在WCF中有两种不同的方法可以用于创建客户端服务对象,他们分别为: 1. 代理构造法 ...

  6. How Autofs Works

    How Autofs Works Autofs is a client-side service that automatically mounts the appropriate file syst ...

  7. Android 控制ScrollView滚动到底部或顶部

    在开发中,我们经常需要更新列表,并将列表拉倒最底部,比如发表微博,聊天界面等等, 这里有两种办法,第一种,使用scrollTo(): public static void scrollToBottom ...

  8. win8 app code中设置Resources里定义好的Style

    WPF中应该可以用这个: rectangle.Style = (Style)FindResource("FormLabelStyle"); 但 Win8.1 App是个精简框架,F ...

  9. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  10. 2018.06.29 洛谷P1505 [国家集训队]旅游(树链剖分)

    旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有 ...