本博文列出了.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):对称加密的更多相关文章

  1. Java常用的加密解密类(对称加密类)

    Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...

  2. 非对称加解密 Asymmetric encryption 对称加密和非对称加密的区别

    考虑这样一个问题:一切的装备文件都存储在 Git 长途库房,RAR密码破解装备文件中的一些信息又是比较灵敏的.所以,我们需求对这些灵敏信息进行加密处理.首要的加密方法分为两种:一种是同享密钥加 密(对 ...

  3. php中des加密解密 匹配C#des加密解密 对称加密

    原文:php中des加密解密 匹配C#des加密解密 对称加密 网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数  可以用于C#和php通信 对数据进行加密,其中$key 是 ...

  4. 加密解密知识 php非对称加密

    function test1(){ $config = array( "digest_alg" => "sha1", "private_key_ ...

  5. 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

    原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...

  6. AES加密解密 助手类 CBC加密模式

    "; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...

  7. .NET下的加密解密大全(1): 哈希加密

    .NET有丰富的加密解密API库供我们使用,本博文总结了.NET下的Hash散列算法,并制作成简单的DEMO,希望能对大家有所帮助. MD5[csharp]using System; using Sy ...

  8. Java加密解密大全

    ChinaSEI系列讲义(By 郭克华)   Java加密解密方法大全                     如果有文字等小错,请多包涵.在不盈利的情况下,欢迎免费传播. 版权所有.郭克华 本讲义经 ...

  9. Java加密与解密笔记(二) 对称加密

    前面的仅仅是做了编码或者摘要,下面看看真正的加密技术. DES public class DESUtil { static final String ALGORITHM = "DES&quo ...

随机推荐

  1. 数学:lucas定理的总结

    今天考试的题目中有大组合数取模,不会唉,丢了45分,我真是个弱鸡,现在还不会lucas. 所以今天看了一下,定理差不多是: (1)Lucas定理:p为素数,则有: 即:lucas(n,m,p)=c(n ...

  2. Color the ball HDOJ--1556

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. hive中sql解析出对应表和字段的实现

    import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Map ...

  4. Cubieboard编译安装NodeJS经验总结

    Cubieboard编译安装NodeJS经验总结,以供新手免走弯路. Cubieboad用的是arm处理器,NodeJs的编译安装上不像pc上那么简单,可以一遍过. 单单make编译一次,就得几乎一个 ...

  5. 洛谷1440 求m区间内的最小值

    洛谷1440 求m区间内的最小值 本题地址:http://www.luogu.org/problem/show?pid=1440 题目描述 一个含有n项的数列(n<=2000000),求出每一项 ...

  6. javascript 通过IE ActiveX 获得本机内网ip

    <HTML><HEAD><TITLE>WMI Scripting HTML</TITLE> <META http-equiv=Content-Ty ...

  7. python-面向对象(一)——开篇基础

    面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 一.创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现, ...

  8. 缓存算法–LRU

    LRU LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,也就是说,LRU缓存把最近最少使用的数据移除,让给最新读取的数据.而往往最常读取的,也是读取次数最多的,所 ...

  9. CentOS 7下安装xampp和testlink

    记录一下最近安装testlink的经历,供大伙儿参考,有问题可以留言讨论,这里就不截图了 先说下安装版本: CentOS-7.0-1406-x86_64-DVDxampp-linux-1.8.3-5- ...

  10. js 日期插件 datepicker

    点击图片出现  时间 ,增加一个点击事件 <label for="" class="width80">创建日:</label> < ...