一、简介

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. hdoj2612 Find a way (bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 思路: 这个题我wa了十多发QAQ. 刚开始的思路是搜索每个‘@’,然后广搜该点到Y和M的最小距 ...

  2. Super Star(最小球覆盖)

    Super Star http://poj.org/problem?id=2069 Time Limit: 1000MS   Memory Limit: 65536K Total Submission ...

  3. 搜索旋转排序数组 II

    跟进“搜索旋转排序数组”,假如有重复元素又将如何? 一句话思路:不能二分,因为复杂度是n eg全是0,找一个1 class Solution { public boolean search(int[] ...

  4. 罗马数字转整数 · Roman to Integer

    13. Roman to Integer [抄题]: [暴力解法]: 时间分析: 空间分析: [思维问题]: 没有想到罗马字是逆序的情况 没有想到要先用toCharArray()方法把字符串拆成一个字 ...

  5. Redis安装异常解决办法

    官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxv ...

  6. poj3017 Cut the Sequence 单调队列 + 堆 dp

    描述 把一个正数列 $A$分成若干段, 每段之和 不超过 $M$, 并且使得每段数列的最大值的和最小, 求出这个最小值. 题目链接 题解 首先我们可以列出一个$O(n^2)$ 的转移方程 : $F_i ...

  7. Debian Buster Nginx 布署 Brophp 项目(类 Thinkphp)

    1 材料 debian buster nginx a project that develop base brophp 2 步骤 配置文件 /etc/nginx/sites-available/pis ...

  8. 属性表格 datagridproperty

    http://www.cnblogs.com/yxlblogs/p/3468921.html

  9. 2018.09.05 bzoj2726: [SDOI2012]任务安排(斜率优化dp+二分)

    传送门 跟Ti" role="presentation" style="position: relative;">TiTi为正数的时候差不多. ...

  10. 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)

    传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...