本博文列出了.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. BZOJ3132: 上帝造题的七分钟

    3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 483  Solved: 222[Submit][Status] Desc ...

  2. 【转】调整mac电脑鼠标移动速度

    原文网址:https://www.zhihu.com/question/19579075 作者:陆猛链接:https://www.zhihu.com/question/19579075/answer/ ...

  3. wifi测试相关(iwconfig,WPA Supplicant用法)

    iwconfig用法 1.打开无线网卡电源 iwconfig wlan0 txpower no 2.列出区域内的无线网络 iwconfig wlan0 scan 3.假设要连接到网络myhome(即e ...

  4. WCF简单教程

    WCF是DotNet体系中很重要的一项技术,但是组内很多组员通过书籍自学的时候 感觉涉及面太广.配置文件太复杂,新名词太多.抓不到头绪,有感于此,决定进行一次组内技术培训,顺便把培训讲义整理到blog ...

  5. Linux和Windows下的进程管理总结

    在Windows和Linux下都可以很方便地列出当前运行的进程.Windows下可以使用组合键CTRL+ALT+DEL打开任务管理器,在进程选项卡中就列举出了当前运行的所有进程,除此之外还可以在命令行 ...

  6. 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组

    这一章在第19页,写的好深奥,我竟然没看明白在说什么--之后再看了几遍,终于明白了. 原文: C程序员的巧计有时候却成为c++程序员的陷阱.例如把单一元素的数组放在一个struct的末尾,于是每个st ...

  7. Spring框架整合Struts2

    1,用Spring架构,及Struts2-spring-plugin插件 导入Spring的dist全部所需的jar包 Struts2的spring插件 struts2-spring-plugin.X ...

  8. usaco 奶牛集会 && 奶牛抗议

    奶牛集会 Description 约翰家的N头奶牛每年都会参加“哞哞大会” .哞哞大会是世界奶牛界的盛事.集会上 的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.当然,哞哞大叫肯定也包括在内. 奶牛 ...

  9. weekend110(Hadoop)的 第三天笔记

    (2015年1月17日) 课程目录 01-hdfs源码跟踪之打开输入流 02-hdfs源码跟踪之打开输入流总结 03-mapreduce介绍及wordcount 04-wordcount的编写和提交集 ...

  10. 3 weekend110的配置hadoop(格式化) + 一些问题解决 + 未免密码配置

    由于,之前,已经在/etc/profile里,配置了hadoop的全局变量,所以,现在可以在任何路径下执行hadoop命令. 来玩玩, 其实啊,在这里,出现了错误, 参考解决链接: http://it ...