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 ...
随机推荐
- (八)学习CSS之line-style-type属性
参考:http://www.w3school.com.cn/cssref/pr_list-style-type.asp 设置不同的列表样式: ul.circle {list-style-type:ci ...
- css选择器,有箭头与没箭头的区别
div > span 和 div span 的区别 ,即有箭头和没箭头的区别 div > span span 是 div 的下一层级关系 在这种情况下找得到span元素: <div& ...
- SharePoint Security and Permission System Overview
转:http://www.sharepointblues.com/2010/09/01/sharepoint-security-and-permission-system-overview/ Shar ...
- UVA 1637 Double Patience
题意:36张扑克,平分成9摞,两张数字一样的可以拿走,每次随机拿两张,问能拿光的概率. 解法:记忆化搜索,状态压缩.一开始我想在还没拿的时候概率是1,然后往全拿光推···样例过不去···后来觉得推反了 ...
- 【Jenkins】Linux搭建Jenkins平台
为了配合上一篇的ant+jenkins做持续集成,需要在linux环境下搭建一个jenkins平台.网上有很多安装的例子,我主要记录一下自己遇到的问题,真真的是特别惆怅的,每次我遇到的问题都格外多. ...
- HDU5046 Airport dancing links 重复覆盖+二分
这一道题和HDU2295是一样 是一个dancing links重复覆盖解决最小支配集的问题 在给定长度下求一个最小支配集,只要小于k就行 然后就是二分答案,每次求最小支配集 只不过HDU2295是浮 ...
- ZOJ 3469 Food Delivery 区间DP
这道题我不会,看了网上的题解才会的,涨了姿势,现阶段还是感觉区间DP比较难,主要是太弱...QAQ 思路中其实有贪心的意思,n个住户加一个商店,分布在一维直线上,应该是从商店开始,先向两边距离近的送, ...
- 【UR #12】实验室外的攻防战(BIT)
[题目链接] http://uoj.ac/problem/180 [题意] 给定两个1..n的排列AB,只有当ai<ai+1才能交换ai和ai+1,问是否能够将A转换为B. [思路] 令a[i] ...
- 【noip2011】Mayan游戏
题解: 刷了一天的noip啊 做了10题! 突然找回了做马拉松的感觉- - 我中午竟然放弃治疗去看视频 做到晚上累得都快挂了 用电脑放一些rock 把音乐当咖啡硬撑下来 但是还是没能刷3届 唉 显然速 ...
- 字符串匹配算法——KMP算法学习
KMP算法是用来解决字符串的匹配问题的,即在字符串S中寻找字符串P.形式定义:假设存在长度为n的字符数组S[0...n-1],长度为m的字符数组P[0...m-1],是否存在i,使得SiSi+1... ...