C# 之 AES加密源码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; using Exam.EncryptPrivate; using System.Text;
using System.Security.Cryptography; /// <summary>
/// Aes加密、解密,密钥长度256,密钥长度不大于32个字节
/// </summary>
public class AesCryptoHelper
{
public const string RET_ERROR = "x07x07x07x07x07";
private const string CRYPTO_IV = "XIANJIAN";
private const string CRYPTO_KEY = "XIANJIAN";
private const int CRYPTO_KEY_LENGTH = ;
private const int CRYPTO_IV_LENGTH = ; private AesCryptoServiceProvider m_aesCryptoServiceProvider;
private string m_message;
public string Message
{
get { return m_message; }
set { m_message = value; }
} private bool m_containKey; /// <summary>
/// True:密文中包含密钥
/// False:密文中不包含密钥
/// </summary>
public bool ContainKey
{
get { return m_containKey; }
set { m_containKey = value; }
} public AesCryptoHelper()
{
m_aesCryptoServiceProvider = new AesCryptoServiceProvider();
m_containKey = true;
m_message = string.Empty;
} public AesCryptoHelper(bool containKey):this()
{
m_containKey = containKey;
} private string Encrypt(string s_crypto, byte[] key, byte[] iv)
{
string s_encryped = string.Empty;
byte[] crypto, encrypted;
ICryptoTransform ct; try
{
crypto = string2Byte(s_crypto);
m_aesCryptoServiceProvider.Key = key;
m_aesCryptoServiceProvider.IV = iv;
ct = m_aesCryptoServiceProvider.CreateEncryptor();
encrypted = ct.TransformFinalBlock(crypto, , crypto.Length); if (m_containKey)
{
s_encryped += byte2HexString(key);
} s_encryped += byte2HexString(encrypted);
return s_encryped;
} catch (Exception ex)
{
m_message = ex.ToString();
return RET_ERROR;
}
} /// <summary>
/// 指定密钥对明文进行AES加密
/// </summary>
/// <param name="s_crypto">明文</param>
/// <param name="s_key">加密密钥</param>
/// <returns></returns>
public string Encrypt(string s_crypto, string s_key)
{
byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
byte[] temp = string2Byte(s_key); if (temp.Length > key.Length)
{
m_message = "Key too long,need less than 32 Bytes key.";
return RET_ERROR;
} key = string2Byte(s_key.PadRight(key.Length));
iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
return Encrypt(s_crypto, key, iv);
} /// <summary>
/// 动态生成密钥,并对明文进行AES加密
/// </summary>
/// <param name="s_crypto">明文</param>
/// <returns></returns>
public string Encrypt(string s_crypto)
{
byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
m_aesCryptoServiceProvider.GenerateKey();
key = m_aesCryptoServiceProvider.Key;
iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
return Encrypt(s_crypto, key, iv);
} private string Decrypt(string s_encrypted, byte[] key, byte[] iv)
{
string s_decrypted = string.Empty;
byte[] encrypted, decrypted;
ICryptoTransform ct;
try
{
encrypted = hexString2Byte(s_encrypted);
m_aesCryptoServiceProvider.Key = key;
m_aesCryptoServiceProvider.IV = iv;
ct = m_aesCryptoServiceProvider.CreateDecryptor();
decrypted = ct.TransformFinalBlock(encrypted, , encrypted.Length);
s_decrypted += byte2String(decrypted);
return s_decrypted;
}
catch (Exception ex)
{
m_message = ex.ToString();
m_message = "Decrypt fail.";
return RET_ERROR;
}
} /// <summary>
/// 从密文中解析出密钥,并对密文进行解密
/// </summary>
/// <param name="s_encrypted">密文</param>
/// <returns></returns>
public string Decrypt(string s_encrypted)
{
string s_key = string.Empty;
byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
if (s_encrypted.Length <= CRYPTO_KEY_LENGTH * )
{
m_message = "Encrypted string invalid.";
return RET_ERROR;
} if (m_containKey)
{
s_key = s_encrypted.Substring(, CRYPTO_KEY_LENGTH * );
s_encrypted = s_encrypted.Substring(CRYPTO_KEY_LENGTH * );
} key = hexString2Byte(s_key);
iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
return Decrypt(s_encrypted, key, iv);
} /// <summary>
/// 指定密钥,并对密文进行解密
/// </summary>
/// <param name="s_encrypted">密文</param>
/// <param name="s_key">密钥</param>
/// <returns></returns>
public string Decrypt(string s_encrypted, string s_key)
{
byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
byte[] temp = string2Byte(s_key);
if (temp.Length > key.Length)
{
m_message = "Key invalid.too long,need less than 32 Bytes";
return RET_ERROR;
} key = string2Byte(s_key.PadRight(key.Length));
iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
if (m_containKey)
{
s_encrypted = s_encrypted.Substring(CRYPTO_KEY_LENGTH * );
} return Decrypt(s_encrypted, key, iv);
} private string byte2HexString(byte[] bytes)
{
StringBuilder sb = new StringBuilder();
foreach (byte b in bytes)
{
sb.AppendFormat("{0:X2}", b);
} return sb.ToString();
} private byte[] hexString2Byte(string hex)
{
int len = hex.Length / ;
byte[] bytes = new byte[len]; for (int i = ; i < len; i++)
{
bytes[i] = (byte)(Convert.ToInt32(hex.Substring(i * , ), ));
}
return bytes;
} private byte[] string2Byte(string str)
{
return Encoding.UTF8.GetBytes(str);
} private string byte2String(byte[] bytes)
{
return Encoding.UTF8.GetString(bytes);
}
}
C# 之 AES加密源码的更多相关文章
- md5 32位小写加密源码
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * md5 32位小写加密 ...
- 【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解
原文地址:http://docode.top/Article/Detail/10003 目录: 1..Net(C#)平台下Des加密解密源代码 2..Net(C#)平台下Aes加密解密源代码 3..N ...
- net reactor加密源码保软件安全-net reactor使用教程
上一次介绍用 Xenocode Postbuild for .NET 混淆加密源代码确保软件安全,本篇将讨论用 Eziriz .NET Reactor 混淆加密软件源代码,为从未用过该软件加密的用户分 ...
- Python实现基于DES加密源码的文本加密器
这是自行制作的一个DES文本加密工具 最终效果图: 本加密器支持UTF-8字符的加解密(包含中文),由于其中的编码方式与常用编码方式不同,加密结果与网上工具不同,但是能实现正常加解密. 最终目标: 目 ...
- MD5加密源码!
import java.security.*; class MD5{ public final static String MD5(String s){ char hexDigits[] = {'0' ...
- python爬虫破解带有CryptoJS的aes加密的反爬机制
发现问题 在一次偶然中,在爬取某个公开网站(非商业型网站)时,老方法,打开调试工具查看请求方式,请求拦截,是否是异步加载,不亦乐乎,当我以为这个网站非常简单的时候,发现二级网页的地址和源码不对应 Aj ...
- Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)
因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧. 一.加密原理 记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这 ...
- JAVA上百实例源码以及开源项目
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...
- 使用AES加密的勒索类软件分析报告
报告名称: 某勒索类软件分析报告 作者: 李东 报告更新日期: 样本发现日期: 样本类型: 样本文件大小/被感染文件变化长度: 样本文件MD5 校验值: da4ab5e31793 ...
随机推荐
- HTML.ActionLink 和 Url.Action 的区别
html.ActionLink生成一个<a href=".."></a>标记.而Url.Action只返回一个url.例如:@Html.ActionLink ...
- nopcommerce商城系统--源代码结构和架构
这个文档是让开发者了解nopcommerce解决方案结构的指南.这是新的nopcommerce开发者学习nopcommerce代码的相关文档.首先,nopCommerce源代码是很容易得到的.它是一个 ...
- HDU 5698 瞬间移动
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- 使用VS2010调用matlab的mat格式文件
做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来. C++读取mat文件的步骤如 ...
- 单点登录技术:微软Passport单点登录协议和自由联盟规范
随着互联网络应用的普及,越来越多的人开始使用互联网上提供的服务.然而目前提供服务的网站大多采用用户名.口令的方式来识别用户身份,这使得用户需要经常性的输入自己的用户名.口令.显然这种认证方式存在着弊端 ...
- 【转】java list用法示例详解
转自:http://www.jb51.net/article/45660.htm java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对java list用法做了详解. Lis ...
- MySQL翻页查询技巧
在查询大量数据库,一般都会采用翻页.自然会想到offset跟limit. 今天知道了一个技巧,用id查询.因为id是主键,查起来很快. 思路是:给id一个区间做where条件,将数据分隔成几份,然后每 ...
- C++基类和派生类之间的转换
本文讲解内容的前提是派生类继承基类的方式是公有继承,关键字public 以下程序为讲解用例. #include<iostream> using namespace std; class A ...
- NOIP2007 字符串展开
.字符串的展开 (expand.pas/c/cpp) [问题描述] 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子 ...
- hdu3315-My Brute(费用流 or KM算法)
题目:My Brute Seaco是一个漂亮的妹子,喜欢玩一款名叫My Brute的游戏.情人节快到了,starvae和xingxing都想邀请妹子过节,但是妹子只能陪一个啊,于是两个人决定打一架,用 ...