.NET2.0中有关加密解密的知识

3DES加密解密学习
本文介绍了作者在学习ASP.NET2.0自定义配置过程中的一个子任务——研究3DES加密算法的过程。主要内容包括对称加密3DES算法的实现原理及具体应用,通过实例展示了如何在.NET2.0环境中进行3DES加密解密操作。
  十七周开始考试,不急,到时候再看要考试的内容。
  大三了,快大四了,找工作了,先找个单位实践实践,不为钱,只想学点东西!
  十六周计划,学习:
    ASP.NET2.0自定义配置学习。
    学习有关.NET2.0的加密解密类。
    学习PetShop4.0。
    C#异常复习。
  本想在这个周末,重写完全支持ACCESS的成员资格与角色管理提供程序,在重写MembershipProvider的时候,遇到了有关密码加密的东东,以前也用到过,只是从网上下一个算法,现在想好好研究这个东西,今天花一整天的时间学习有关知识。
  首选是有关加密解密的概要,什么是对称加密,什么是非对称加密,哈希是怎么回事,这些应该是要清楚的。还要了解什么是数字签名。

  最重要的是会应用.NET2.0提供的基类,写一些加密解密函数。学习了SHA1,MD5和3DES的算法。具体的源代码如下:

/Files/JBoy/encrypt.rar


下面是3DES对称加密解密:

  1 None.gif    dot.gif
  2 None.gif   dot.gif
  3 None.gif     // 用户自己设置
  4 None.gif      private   static   string  key_string  =   " 1234567890123456 " ;   // 加密密钥
  5 None.gif      private   static   string  iv_string  =   " 12345678 " ;    // 初始化向量
  6 None.gif     // 系统根据字符串自动生成
  7 None.gif      private   static   byte [] key;
  8 None.gif     private   static   byte [] iv;
  9 None.gif    
 10 None.gif     // 初始化iv与key
 11 None.gif      private   static   void  InitKeyAndIV()
 12 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
 13ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//*比较复杂的方式生成key与iv
 14InBlock.gif        //3DES使用124位--192位加密,密钥的长度是16--24个字节
 15InBlock.gif        key = new byte[16];  //124位密钥
 16InBlock.gif        iv = new byte[8];    //64位
 17InBlock.gif    
 18InBlock.gif        SHA1 hasher = (SHA1)HashAlgorithm.Create("sha1");
 19InBlock.gif        //向字符编码为字节数组
 20InBlock.gif        byte[] key_arr = ASCIIEncoding.ASCII.GetBytes(key_string);
 21InBlock.gif        byte[] iv_arr = ASCIIEncoding.ASCII.GetBytes(iv_string);
 22InBlock.gif        
 23InBlock.gif        //哈希相应的字符数组
 24InBlock.gif        //SHA1哈希后得到20*8位
 25InBlock.gif        //MD5哈希后得到16*8位
 26InBlock.gif        byte[] hashed_key_arr = hasher.ComputeHash(key_arr);
 27InBlock.gif        byte[] hashed_iv_arr = hasher.ComputeHash(iv_arr);
 28InBlock.gif        
 29InBlock.gif        //取前16个字符为密钥
 30InBlock.gif        //取前8个字符为初始化向量
 31InBlock.gif        for (int i = 0; i < 16; i++)
 32InBlock.gif        {
 33InBlock.gif            key[i] = hashed_key_arr[i];
 34InBlock.gif        }
 35InBlock.gif        for (int i = 0; i < 8; i++)
 36InBlock.gif        {
 37InBlock.gif            iv[i] = hashed_iv_arr[i];
 38InBlock.gif        }
 39ExpandedSubBlockEnd.gif        */

 40ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//*简单的方式生成key与iv*/
 41InBlock.gif        key = System.Text.Encoding.ASCII.GetBytes(key_string);
 42InBlock.gif        iv = System.Text.Encoding.ASCII.GetBytes(iv_string);
 43InBlock.gif        return;
 44ExpandedBlockEnd.gif    }

 45 None.gif    
 46 None.gif     // 加密算法
 47 None.gif      private   static   string  Encrypt( string  data)
 48 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
 49InBlock.gif        //先初始化 KEY 和 IV
 50InBlock.gif        if (key == null || iv == null)
 51InBlock.gif            InitKeyAndIV();
 52InBlock.gif        
 53InBlock.gif        //将要加密的数据编码为字节数组
 54InBlock.gif        byte[] _data = System.Text.Encoding.UTF8.GetBytes(data);    //如果使用Unicode编码,支持中文加密
 55InBlock.gif        
 56InBlock.gif        //创建流,保存加密后的数据
 57InBlock.gif        MemoryStream ms = new MemoryStream();
 58InBlock.gif        
 59InBlock.gif        //创建TripleDESCryptoServiceProvider类
 60InBlock.gif        TripleDESCryptoServiceProvider _3des = new TripleDESCryptoServiceProvider();
 61InBlock.gif        
 62InBlock.gif        //创建加密流
 63InBlock.gif        CryptoStream cs = new CryptoStream(ms, _3des.CreateEncryptor(key, iv), CryptoStreamMode.Write);
 64InBlock.gif        
 65InBlock.gif        //调用Write方法将加密后的结果写到 流 中
 66InBlock.gif        cs.Write(_data, 0, _data.Length);
 67InBlock.gif        //将数据从流写入内存(这句不能少,否则在从内存导出到字符串的时候会出现字符丢失)
 68InBlock.gif        cs.FlushFinalBlock();
 69InBlock.gif        
 70InBlock.gif        //ms.ToString(); ==>将流写入字节数组中
 71InBlock.gif        string result = Convert.ToBase64String(ms.ToArray());
 72InBlock.gif        //string result = System.Text.Encoding.UTF8.GetString(ms.ToArray());
 73ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//*
 74InBlock.gif        StringBuilder result = new StringBuilder();
 75InBlock.gif        foreach (byte b in ms.ToArray())
 76InBlock.gif        {
 77InBlock.gif            result.AppendFormat("{0:X2}", b);
 78InBlock.gif        }
 79ExpandedSubBlockEnd.gif        */

 80InBlock.gif        
 81InBlock.gif        ms.Close();
 82InBlock.gif        cs.Close();
 83InBlock.gif        
 84InBlock.gif        return result;//.ToString();
 85InBlock.gif        
 86ExpandedBlockEnd.gif    }

 87 None.gif    
 88 None.gif     // 解密算法
 89 None.gif      private   static   string  Decrypt( string  data)
 90 ExpandedBlockStart.gifContractedBlock.gif     dot.gif {
 91InBlock.gif        if (key == null || iv == null)
 92ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 93InBlock.gif            InitKeyAndIV();
 94ExpandedSubBlockEnd.gif        }

 95InBlock.gif        
 96InBlock.gif        byte[] encrypted_data = Convert.FromBase64String(data);
 97InBlock.gif
 98InBlock.gif        MemoryStream ms = new MemoryStream();
 99InBlock.gif        
100InBlock.gif        TripleDESCryptoServiceProvider _3des = new TripleDESCryptoServiceProvider();
101InBlock.gif        
102InBlock.gif        CryptoStream cs = new CryptoStream(ms, _3des.CreateDecryptor(key, iv), CryptoStreamMode.Write);
103InBlock.gif
104InBlock.gif        cs.Write(encrypted_data, 0, encrypted_data.Length);
105InBlock.gif        cs.FlushFinalBlock();
106InBlock.gif        string result = System.Text.Encoding.UTF8.GetString(ms.ToArray());
107InBlock.gif        
108InBlock.gif        cs.Close();
109InBlock.gif        ms.Close();
110InBlock.gif        
111InBlock.gif        return result;
112ExpandedBlockEnd.gif    }

113 None.gif    dot.gif
114 None.gif    dot.gif

MD5加密算法:
None.gif byte [] bt_str  =  System.Text.Encoding.Unicode.GetBytes(str);  // 将一组字符编码为字节序列
None.gif                
None.gif        
// MD5 md5Hasher = MD5.Create();    // 创建一个 MD5CryptoServiceProvider 实例
None.gif        
// MD5 md5Hasher = (MD5CryptoServiceProvider)HashAlgorithm.Create("MD5");
None.gif
        HashAlgorithm md5Hasher  =  HashAlgorithm.Create( " MD5 " );
None.gif        
byte [] hashed_str  =  md5Hasher.ComputeHash(bt_str);   // 计算指定字节数组的哈希
None.gif        
None.gif        StringBuilder result 
=   new  StringBuilder();
None.gif        
foreach  ( byte  b  in  hashed_str)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            result.Append(b.ToString(
"x2"));    //十六进制格式
InBlock.gif            
//lblResult.Text += b.ToString();
InBlock.gif
            
ExpandedBlockEnd.gif        }

明天继续学习,要把它彻底征服了!

转载于:https://www.cnblogs.com/JBoy/archive/2007/06/17/786799.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值