加密、解密常用类

12 篇文章 0 订阅
12 篇文章 0 订阅

 A. 对称密钥类。

using    System;   
using    System.Security.Cryptography;   
using    System.IO;   
using    System.Text;   
    
namespace    IMServer   
{   
    
///     <summary>
    
///    SymmCrypto是一个System.Security.Cryptography.SymmetricAlgorithm类的包、简单化的接口
    
///    它也支持可定制的SymmetricAlgorithm。 
    
///     </summary>    
     public     class    SymmCrypto   
    {   
        
///      <remarks>
        
///   支持.Net自带的SymmetricAlgorithm类。
        
///    </remarks>    
         public   enum  SymmProvEnum: int
        {DES,RC2,Rijndael,TripleDES}   
    
        
private    SymmetricAlgorithm   mobjCryptoService;   
    
        
///   <remarks>
        
///  为使用.Net自带的SymmetricAlgorithm类的构造器。
        
///   </remarks>    
         public  SymmCrypto(SymmProvEnum NetSelected)
        {   
            
switch (NetSelected)   
            {   
                
case  SymmProvEnum.DES:
                    mobjCryptoService   
=     new    DESCryptoServiceProvider();   
                    
break ;   
                
case  SymmProvEnum.RC2:   
                    mobjCryptoService   
=     new    RC2CryptoServiceProvider();   
                    
break ;   
                
case  SymmProvEnum.Rijndael:   
                    mobjCryptoService   
=     new    RijndaelManaged();   
                    
break ;   
                
case  SymmProvEnum.TripleDES:   
                    mobjCryptoService   
=     new    TripleDESCryptoServiceProvider();   
                    
break ;   
            }   
        }   
    
        
///   <remarks>
        
///  为使用一个定制的SymmetricAlgorithm类的构造器。
        
///   </remarks>    
         public  SymmCrypto(SymmetricAlgorithm ServiceProvider)   
        {
            mobjCryptoService
= ServiceProvider;
        }   
    
        
private   byte [] GetLegalKey( string  Key)   
        {   
            
string  sTemp  = Key;
            mobjCryptoService.GenerateKey();
            
byte [] bytTemp = mobjCryptoService.Key;
            
int  KeyLength = bytTemp.Length;
            
if (sTemp.Length > KeyLength)
                sTemp
= sTemp.Substring( 0 ,KeyLength);   
            
else   if (sTemp.Length < KeyLength)
                sTemp
= sTemp.PadRight(KeyLength, '   ' );    
            
return  ASCIIEncoding.ASCII.GetBytes(sTemp);   
        }   
    
        
private   byte [] GetLegalIV()   
        {
            
// 初始化的IV字符串可以修改成你喜欢的数据。
             string  sTemp = " 救臆妲饣 " ;
            mobjCryptoService.GenerateIV();
            
byte [] bytTemp = mobjCryptoService.IV;
            
int  IVLength = bytTemp.Length;
            
if (sTemp.Length > IVLength)
                sTemp
= sTemp.Substring( 0 ,IVLength);
            
else   if (sTemp.Length < IVLength)
                sTemp
= sTemp.PadRight(IVLength, '   ' );    
            
return  ASCIIEncoding.ASCII.GetBytes(sTemp);   
        }   
    
        
public   string  Encrypting( string  Source, string  Key)   
        {
            
// 使用UTF8编码装便成两个字节的汉字。
             byte [] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
            
// 在没有I/O文件下创建一个内存流为了过程能够被做。
            System.IO.MemoryStream ms = new  System.IO.MemoryStream();
            
// 设置私有的Key。
            mobjCryptoService.Key = GetLegalKey(Key);   
            mobjCryptoService.IV
= GetLegalIV();
            
// 创建一个加密从Service Provider实例。
            ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
            
// 创建一个加密的流为了转换一个使用加密的流。
            CryptoStream cs = new  CryptoStream(ms,encrypto,CryptoStreamMode.Write);
            
// 写出加密内容到内存流。
            cs.Write(bytIn,    0 ,   bytIn.Length);   
            cs.FlushFinalBlock();    
            ms.Close();   
            
byte [] bytOut = ms.ToArray();   

            
// 转换成64位为了能在XML中使用的内容。
             return  System.Convert.ToBase64String(bytOut);
        }   
    
        
public   string  Decrypting( string  Source, string  Key)   
        {
            
// 从64位转成字节数组。
             byte [] bytIn = System.Convert.FromBase64String(Source);
            
// 创建一个输入的内存流。
            System.IO.MemoryStream ms = new  System.IO.MemoryStream(bytIn, 0 ,bytIn.Length);

            
// 设置一个私有的Key。
            mobjCryptoService.Key = GetLegalKey(Key);   
            mobjCryptoService.IV
= GetLegalIV();   
    
            
// 创建一个加密从Service Provider实例。
            ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
   
            
// 创建一个加密的流为了转换一个使用加密的流。 
            CryptoStream cs = new  CryptoStream(ms,encrypto,CryptoStreamMode.Read); 

            
// 从加密流中读出结果。
            System.IO.StreamReader sr = new  System.IO.StreamReader(cs); 
            
return  sr.ReadToEnd();
        }   
    }   
}

B. 非对称密钥类(公钥加密、私钥解密)。

复杂些(因为RSA只能加密117位、解密128位,所以要分段加、解密。):

using  System;

namespace  IMServer
{
    
///   <summary>
    
///  类名称:jiamiceshi
    
///  类功能:加密解密类
    
///  开发人员:
    
///  开发时间:
    
///   </summary>
     public   class  jiamiceshi
    {
        
///   <summary>
        
///  解密函数
        
///   </summary>
         public  System.Security.Cryptography.RSACryptoServiceProvider rsa;
        
///   <summary>
        
///  加密函数
        
///   </summary>
         public  System.Security.Cryptography.RSACryptoServiceProvider rsa1;
        
///   <summary>
        
///  得到公钥标志
        
///   </summary>
         public   bool  flag = false ;

        
public  jiamiceshi()
        {
            rsa
= new  System.Security.Cryptography.RSACryptoServiceProvider();
            rsa1
= new  System.Security.Cryptography.RSACryptoServiceProvider();
            
        }

        
///   <summary>
        
///  发送服务器公钥
        
///   </summary>
        
///   <returns></returns>
         public   string  SendPublicKey()
        {
            
string  result = null ;
            
try
            {
                
// 导出公钥
                result = rsa.ToXmlString( false );
            }
            
catch (System.Security.Cryptography.CryptographicException e)
            {
                Console.WriteLine(e.Message);
            }
            
return  result;
        }

        
///   <summary>
        
///  得到客户端公钥    
        
///   </summary>
        
///   <param name="_publicKey"> 字符串 </param>
        
///   <returns></returns>
         public   bool  GetPublicKey( string  _publicKey)
        {
            
try
            {
                rsa1.FromXmlString(_publicKey);
                flag
= true ;
                
return  flag;
            }
            
catch (System.Security.Cryptography.CryptographicException e)
            {
                Console.WriteLine(e.Message);
            }
            
catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            
return   false ;
        }

        
///   <summary>
        
///  加密函数,注意最好返回二进制流。
        
///   </summary>
        
///   <param name="text"> 文本 </param>
        
///   <returns></returns>
         public   byte [] Encrypt( string  text)
        {
            
byte [] encbyte = null ;
            
try
            {
                
byte [] tempbyte = System.Text.Encoding.UTF8.GetBytes(text);  // 原始明文数据
                 int  templength = tempbyte.Length; // 原始明文长度
                
// 将原始明文扩展到117的整数倍
                 int  mod  =  templength  %   117 ; // 求余
                 byte [] mbyte = new   byte [templength + ( 117 - mod)]; // 扩展后的明文
                 for  ( int  i  =   0 ; i  <  templength; i ++ ) // 前半部分拷贝进来
                {
                    mbyte[i] 
=  tempbyte[i];           
                }
                
for  ( int  i  =  templength; i  <  mbyte.Length; i ++ ) // 后半部分都填空格 asc 32
                {
                    mbyte[i] 
= 32 ;
                }
                
// ok明文整理完璧
                
// 开始分割明文
                 int  div  =  mbyte.Length  /   117 ; // 每117个为一组对明文分组
                 if  ((mbyte.Length  %   117 !=   0 ) div  +=   1 ; // 此处可能永远到不了吧?
                 byte [][] divbyte  =   new   byte [div][]; // 存放分组明文
                 for  ( int  i  =   0 ; i  <  div; i ++ )
                {
                    divbyte[i] 
=   new   byte [ 117 ]; // 每一个分割都是117长度
                    Array.Copy(mbyte,i * 117 ,divbyte[i], 0 , 117 ); // 拷贝到第i个分割数据中
                }
                
// ok分割完毕开始加密
                 byte [][] divencbyte   =   new   byte [div][]; // 存放加密后的密文
                 for  ( int  i  =   0 ; i  <  div; i ++ )
                {
                    divencbyte[i] 
=   new   byte [ 128 ];
                    divencbyte[i] 
=  rsa1.Encrypt(divbyte[i], false );
                }
                
// 加密完毕
                
// 开始拼装
                encbyte = new   byte [div * 128 ]; // 拼装后的数组
                 for  ( int  i  =   0 ; i  <  div; i ++ )
                {
                    Array.Copy(divencbyte[i],
0 ,encbyte, 128 * i, 128 );
                }
                
// 拼装完毕
            }
            
catch (System.Security.Cryptography.CryptographicException e)
            {
                Console.WriteLine(e.Message);
            }
            
catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            
return  encbyte;
        }


        
///   <summary>
        
///  解密函数
        
///   </summary>
        
///   <param name="EncryptToData"> 二进制流 </param>
        
///   <returns></returns>
         public   string  DecryptMessage( byte [] EncryptToData)
        {
            
string  tempstr = null ;
            
try
            {
                
// 分割密文
                 int  div  =  EncryptToData.Length  /   128 ; // 每128个为一组对密文分组
                 if  ((EncryptToData.Length  %   128 !=   0 ) div  +=   1 ; // 此处可能永远到不了吧?
                 byte [][] divbyte  =   new   byte [div][]; // 存放分组密文
                 for  ( int  i  =   0 ; i  <  div; i ++ )
                {
                    divbyte[i] 
=   new   byte [ 128 ]; // 每一个分割都是128长度
                    Array.Copy(EncryptToData,i * 128 ,divbyte[i], 0 , 128 ); // 拷贝到第i个分割数据中
                }
                
// ok分割完毕开始解密
                
// 开始解密
                 byte [][] divdecbyte   =   new   byte [div][]; // 存放解密后的明文
                 for  ( int  i  =   0 ; i  <  div; i ++ )
                {
                    divdecbyte[i] 
=   new   byte [ 117 ];
                    divdecbyte[i] 
=  rsa.Decrypt(divbyte[i], false );
                }
                
// 解密完毕
                
// 开始拼装
                 byte [] decbyte = new   byte [div * 117 ]; // 拼装后的数组
                 for  ( int  i  =   0 ; i  <  div; i ++ )
                {
                    Array.Copy(divdecbyte[i],
0 ,decbyte, 117 * i, 117 );
                }
                
// 拼装完毕
                
// 形成字符串,并去掉空格
                tempstr = System.Text.Encoding.UTF8.GetString(decbyte);
            }
            
catch (System.Security.Cryptography.CryptographicException e)
            {
                Console.WriteLine(e.Message);
            }
            
catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            
return  tempstr.Trim();
        }
    }
}

完毕,希望和大家多多交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值