.NET下的加密解密大全(2):对称加密
本博文列出了.NET下常用的对称加密算法,并将它们制作成小DEMO,希望能对大家有所帮助。
公共代码
[csharp]
static byte[] CreateKey(int num)
{
byte[] result = new byte[num];
Random rand = new Random();
for (int i = 0; i < num; i++)
{
result[i] = (Byte)rand.Next(1, 256);
}
return result;
}
DES
[csharp]
/// <summary>
/// DES加密算法必须使用Base64的Byte对象
/// </summary>
/// <param name="data">待加密的字符数据</param>
/// <param name="key">密匙,长度必须为64位(byte[8]))</param>
/// <param name="iv">iv向量,长度必须为64位(byte[8])</param>
/// <returns>加密后的字符</returns>
static string EnDES(string data, byte[] key, byte[] iv)
{
DES des = DES.Create();
//这行代码很重要,需要根据不同的字符串选择不同的转换格式
byte[] tmp = Encoding.Unicode.GetBytes(data);
Byte[] encryptoData;
ICryptoTransform encryptor = des.CreateEncryptor(key, iv);
using (MemoryStream memoryStream = new MemoryStream())
{
using (var cs = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter writer = new StreamWriter(cs))
{
writer.Write(data);
writer.Flush();
}
}
encryptoData = memoryStream.ToArray();
}
des.Clear();
return Convert.ToBase64String(encryptoData);
}
/// <summary>
/// DES解密算法
/// </summary>
/// <param name="data">待加密的字符数据</param>
/// <param name="key">密匙,长度必须为64位(byte[8]))</param>
/// <param name="iv">iv向量,长度必须为64位(byte[8])</param>
/// <returns>加密后的字符</returns>
static string DeDes(string data, Byte[] key, Byte[] iv)
{
string resultData = string.Empty;
//这行代码很重要
Byte[] tmpData = Convert.FromBase64String(data);//转换的格式挺重要
DES des = DES.Create();
ICryptoTransform decryptor = des.CreateDecryptor(key, iv);
using (var memoryStream = new MemoryStream(tmpData))
{
using (var cs = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
StreamReader reader = new StreamReader(cs);
resultData = reader.ReadLine();
}
}
return resultData;
}
调用代码
[csharp]
//DES对称加密
Console.WriteLine("DES对称加密");
Byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
Byte[] key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
string inputDES_1 = inputString();
string enData = EnDES(inputDES_1, key, iv);<p>
Console.WriteLine("加密后的数据:{0}", enData);
Console.WriteLine("解密后的数据:{0}", DeDes(enData, key, iv));</p>
TripleDES(3DES)
[csharp]
/// <summary>
/// TripleDES加密
/// </summary>
/// <param name="data">待加密的字符数据</param>
/// <param name="key">密匙,长度可以为:128位(byte[16]),192位(byte[24])</param>
/// <param name="iv">iv向量,长度必须为64位(byte[8])</param>
/// <returns>加密后的字符</returns>
static string EnTripleDES(string data, Byte[] key, Byte[] iv)
{
Byte[] tmp = null;
Byte[] tmpData = Encoding.Unicode.GetBytes(data);
TripleDES tripleDes = TripleDES.Create();
ICryptoTransform encryptor = tripleDes.CreateEncryptor(key, iv);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
StreamWriter writer = new StreamWriter(cs);
writer.Write(data);
writer.Flush();//这句很重要,在对流操作结束后必须用这句话强制将缓冲区中的数据全部写入到目标对象中
}
tmp = ms.ToArray();
}
return Convert.ToBase64String(tmp);
}
/// <summary>
/// TripleDES解密
/// </summary>
/// <param name="data">待加密的字符数据</param>
/// <param name="key">密匙,长度可以为:128位(byte[16]),192位(byte[24])</param>
/// <param name="iv">iv向量,长度必须为64位(byte[8])</param>
/// <returns>加密后的字符</returns>
static string DeTripleDES(string data, Byte[] key, Byte[] iv)
{
Byte[] tmp = Convert.FromBase64String(data);
string result = string.Empty;
TripleDES tripleDES = TripleDES.Create();
ICryptoTransform decryptor = tripleDES.CreateDecryptor(key, iv);
using (MemoryStream ms = new MemoryStream(tmp))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
StreamReader reader = new StreamReader(cs);
result = reader.ReadLine();
}
}
tripleDES.Clear();
return result;
}
调用代码
[csharp]
TripleDES对称加密
Console.WriteLine("TripleDES对称加密");
Byte[] iv = CreateKey(8);
Byte[] key = CreateKey(32);
string inputDES_1 = inputString();
string enData = EnTripleDES(inputDES_1, key, iv);
Console.WriteLine("加密后的数据:{0}", enData);
Console.WriteLine("解密后的数据:{0}", DeTripleDES(enData, key, iv)); <
AES
[csharp]
/// <summary>
/// AES加密
/// </summary>
/// <param name="data">待加密的字符数据</param>
/// <param name="key">密匙,长度可以为:128位(byte[16]),192位(byte[24]),256位(byte[32])</param>
/// <param name="iv">iv向量,长度必须为128位(byte[16])</param>
/// <returns>加密后的字符</returns>
static string EnAES(string data, byte[] key, byte[] iv)
{
Aes aes = Aes.Create();
byte[] tmp = null;
ICryptoTransform encryptor = aes.CreateEncryptor(key, iv);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
StreamWriter writer = new StreamWriter(cs);
writer.Write(data);
writer.Flush();
writer.Close();
}
tmp = ms.ToArray();
}
return Convert.ToBase64String(tmp);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="data">待加密的字符数据</param>
/// <param name="key">密匙,长度可以为:128位(byte[16]),192位(byte[24]),256位(byte[32])</param>
/// <param name="iv">iv向量,长度必须为128位(byte[16])</param>
/// <returns>加密后的字符</returns>
static string DeAES(string data, byte[] key, byte[] iv)
{
string result = string.Empty;
Aes aes = Aes.Create();
ICryptoTransform decryptor = aes.CreateDecryptor(key, iv);
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(data)))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
StreamReader reader = new StreamReader(cs);
result = reader.ReadLine();
reader.Close();
}
}
aes.Clear();
return result;
}
调用代码
[csharp]
<p> //AES对称加密
Console.WriteLine("AES对称加密");
Byte[] iv = CreateKey(16);
Byte[] key = CreateKey(24);
string inputDES_1 = inputString();</p><p> string enData =EnAES(inputDES_1, key, iv);</p><p>
Console.WriteLine("加密后的数据:{0}", enData);
Console.WriteLine("解密后的数据:{0}", DeAES(enData, key, iv));</p>
Rijndael
[csharp]
/// <summary>
/// Rijndael加密
/// </summary>
/// <param name="data">需要加密的字符数据</param>
/// <param name="key">密匙,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])</param>
/// <param name="iv">iv向量,长度为128(byte[16])</param>
/// <returns>加密后的字符</returns>
static string EnRijndael(string data, byte[] key, byte[] iv)
{
Rijndael rijndael = Rijndael.Create();
byte[] tmp = null;
ICryptoTransform encryptor = rijndael.CreateEncryptor(key, iv);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
StreamWriter writer = new StreamWriter(cs);
writer.Write(data);
writer.Flush();
}
tmp = ms.ToArray();
}
return Convert.ToBase64String(tmp);
}
/// <summary>
/// Rijndael解密
/// </summary>
/// <param name="data">需要加密的字符数据</param>
/// <param name="key">密匙,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])</param>
/// <param name="iv">iv向量,长度为128(byte[16])</param>
/// <returns>解密后的字符</returns>
static string DeRijndael(string data, byte[] key, byte[] iv)
{
string result = string.Empty;
Rijndael rijndael = Rijndael.Create();
ICryptoTransform decryptor = rijndael.CreateDecryptor(key, iv);
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(data)))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
StreamReader reader = new StreamReader(cs);
result = reader.ReadLine();
reader.Close();
}
}
return result;
}
调用代码
[csharp]
//Rijndael对称加密
Console.WriteLine("Rijndael对称加密");
Byte[] iv = CreateKey(16);
Byte[] key = CreateKey(32);
string inputDES_1 = inputString();
string enData = EnRijndael(inputDES_1, key, iv);
Console.WriteLine("加密后的数据:{0}", enData);
Console.WriteLine("解密后的数据:{0}", DeRijndael(enData, key, iv));
.NET下的加密解密大全(2):对称加密的更多相关文章
- Java常用的加密解密类(对称加密类)
Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...
- 非对称加解密 Asymmetric encryption 对称加密和非对称加密的区别
考虑这样一个问题:一切的装备文件都存储在 Git 长途库房,RAR密码破解装备文件中的一些信息又是比较灵敏的.所以,我们需求对这些灵敏信息进行加密处理.首要的加密方法分为两种:一种是同享密钥加 密(对 ...
- php中des加密解密 匹配C#des加密解密 对称加密
原文:php中des加密解密 匹配C#des加密解密 对称加密 网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数 可以用于C#和php通信 对数据进行加密,其中$key 是 ...
- 加密解密知识 php非对称加密
function test1(){ $config = array( "digest_alg" => "sha1", "private_key_ ...
- 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)
原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...
- AES加密解密 助手类 CBC加密模式
"; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...
- .NET下的加密解密大全(1): 哈希加密
.NET有丰富的加密解密API库供我们使用,本博文总结了.NET下的Hash散列算法,并制作成简单的DEMO,希望能对大家有所帮助. MD5[csharp]using System; using Sy ...
- Java加密解密大全
ChinaSEI系列讲义(By 郭克华) Java加密解密方法大全 如果有文字等小错,请多包涵.在不盈利的情况下,欢迎免费传播. 版权所有.郭克华 本讲义经 ...
- Java加密与解密笔记(二) 对称加密
前面的仅仅是做了编码或者摘要,下面看看真正的加密技术. DES public class DESUtil { static final String ALGORITHM = "DES&quo ...
随机推荐
- 为web服务器设置HttpOnly防范XSS攻击
HttpOnly标识是一个可选的.避免利用XSS(Cross-Site Scripting)来获取session cookie的标识.XSS攻击最常见一个的目标是通过获取的session cookie ...
- GIS应用及OpenGIS介绍
转自:http://blog.csdn.net/cdl2008sky/article/details/7266680 GIS的三大应用第一类是政府应用,“电子政务” 是当今政府加强信息化建设的新方向, ...
- 用 Eclipse 开发 Android 应用程序
转自:http://www.apkbus.com/android-13828-1-1.html 开始之前 本教程介绍如何在 Eclipse 环境中进行 Android 应用程序开发,包括两个示例应用程 ...
- mongoDB文件太大查错纪录
日志系统,突然从24号之后的都断层了,交易看不见.查了一下问题是MongoDB把硬盘撑爆了,看了下情况: -bash-3.2$ du -h 82M ./log .1G ./db/journal .0K ...
- Android4.0 以后不允许在主线程进行网络连接
Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException.因此,必须另起一个线程进行网络连接方面的操作. pac ...
- group by子句的三点注意项
1.在含有统计函数的select语句中,如果不使用group by子句,那么select子句中只允许出现统计函数,其他任何字段都不允许出现: 2.在含有统计函数的select语句中,如果使用了grou ...
- Navicat远程连接MySQL数据库
1.打开Navicat,在界面的“主机名和IP地址”处输入IP地址,一般是192.168.1.1 2.输入相应的用户名和密码,点击连接测试,确认是否已经连接,之后就可以点击确定了 3.找到相应的数据库 ...
- Day 4 @ RSA Conference Asia Pacific & Japan 2016
09.00 – 09.45 hrs Advanced Malware and the Cloud: The New Concept of 'Attack Fan-out' Krishna Naraya ...
- 征服 Redis + Jedis + Spring (三)—— 列表操作【转】
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 相关链接: 征服 Redis 征服 Re ...
- hdu2002
import java.util.*;class Main{public static void main(String args[]){Scanner cin=new Scanner(System. ...