一、简介

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. hdoj1003 DP

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  2. 在c#中设置Excel格式

    生成excel的时候有时候需要设置单元格的一些属性,可以参考一下: range.NumberFormatLocal = "@"; //设置单元格格式为文本 ange.get_Ran ...

  3. OC - 缓存 - NSCache - 介绍

  4. 理解数据结构Priority Queue

    我们知道Queue是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在Queue中基于优先级处理对象.举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大 ...

  5. Volley的使用

    Volley加载图片到控件上 VolleyUtils.getLoader(getContext()).get(zixun.getPicurl(), ImageLoader.getImageListen ...

  6. 零基础学习hadoop到上手工作线路指导(中级篇)

    此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结. 五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解: hadoop分为h ...

  7. DNS/BIND in Debian

    Debian official document:http://www.debian.org/doc/manuals/network-administrator/ch-bind.html Buildi ...

  8. 何时开始phonics学习及配套阅读训练zz

    引子:自从11月份俱乐部第一批孩子开始英文阅读,到现在三.四个月的时间过去了.很多孩子从不知道怎么读绘本甚至排斥英语,到现在能很投入地看原版书, 有些甚至主动地去寻找拼读规律.我家小宝目前也从前期的阅 ...

  9. 2018.09.08 poj1185 炮兵阵地(状压dp)

    传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...

  10. Netty学习第四节WebSocket入门

    1.什么是webSocket?       webSocket是H5提出的一个协议规范,webSocket约定了一个通信的规范,通过一个握手的机制,客户端和服务端,就能建立一个类似TCP的连接,从而方 ...