`

.NET加密技术应用

    博客分类:
  • .NET
阅读更多

using System;
using System.Text;
using System.Security;
using System.Security.Cryptography;
using System.IO;
namespace EncryptClasses
{
 /// <summary>
 /// 此处定义的是DES加密,为了便于今后的管理和维护
 /// 请不要随便改动密码,或者改变了密码后请一定要
 /// 牢记先前的密码,否则将会照成不可预料的损失
 /// </summary>
 public class DESEncrypt
 {
  #region "member fields"
  private string iv="12345678";
  private string key="12345678";
  private Encoding encoding=new UnicodeEncoding();
  private DES des;
  #endregion
  /// <summary>
  /// 构造函数
  /// </summary>
  public DESEncrypt()
  {
   des=new DESCryptoServiceProvider();
  }
  #region "propertys"
  /// <summary>
  /// 设置加密密钥
  /// </summary>
  public string EncryptKey
  {
   get{return this.key;}
   set
   {
      this.key=value;
   }
  }
  /// <summary>
  /// 要加密字符的编码模式
  /// </summary>
  public Encoding EncodingMode
  {
   get{return this.encoding;}
   set{this.encoding=value;}
  }
  #endregion
  #region "methods"
  /// <summary>
  /// 加密字符串并返回加密后的结果
  /// </summary>
  /// <param name="str"></param>
  /// <returns></returns>
  public string EncryptString(string str)
  {
   byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
   byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);//得到加密密钥
   byte[] toEncrypt=this.EncodingMode.GetBytes(str);//得到要加密的内容
   byte[] encrypted;
   ICryptoTransform encryptor=des.CreateEncryptor(keyb,ivb);
   MemoryStream msEncrypt=new MemoryStream();
   CryptoStream csEncrypt=new CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write);
   csEncrypt.Write(toEncrypt,0,toEncrypt.Length);
   csEncrypt.FlushFinalBlock();
   encrypted=msEncrypt.ToArray();
   csEncrypt.Close();
   msEncrypt.Close();
   return this.EncodingMode.GetString(encrypted);
  }
  /// <summary>
  /// 加密指定的文件,如果成功返回True,否则false
  /// </summary>
  /// <param name="filePath">要加密的文件路径</param>
  /// <param name="outPath">加密后的文件输出路径</param>
  public void EncryptFile(string filePath,string outPath)
  {
   bool isExist=File.Exists(filePath);
   if(isExist)//如果存在
   {
    byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
    byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
    //得到要加密文件的字节流
    FileStream fin=new FileStream(filePath,FileMode.Open,FileAccess.Read);
    StreamReader reader=new StreamReader(fin,this.EncodingMode);
    string dataStr=reader.ReadToEnd();
    byte[] toEncrypt=this.EncodingMode.GetBytes(dataStr);
    fin.Close();
    FileStream fout=new FileStream(outPath,FileMode.Create,FileAccess.Write);
    ICryptoTransform encryptor=des.CreateEncryptor(keyb,ivb);
    CryptoStream csEncrypt=new CryptoStream(fout,encryptor,CryptoStreamMode.Write);
    try
    {
     //加密得到的文件字节流
     csEncrypt.Write(toEncrypt,0,toEncrypt.Length);
     csEncrypt.FlushFinalBlock();
    }
    catch(Exception err)
    {
     throw new ApplicationException(err.Message);
    }
    finally
    {
     try
     {
      fout.Close();
      csEncrypt.Close();
     }
     catch
     {
      ;
     }
    }
   }
   else
   {
    throw new FileNotFoundException("没有找到指定的文件");
   }
  }
  /// <summary>
  /// 文件加密函数的重载版本,如果不指定输出路径,
  /// 那么原来的文件将被加密后的文件覆盖
  /// </summary>
  /// <param name="filePath"></param>
  public void EncryptFile(string filePath)
  {
   this.EncryptFile(filePath,filePath);
  }
  /// <summary>
  /// 解密给定的字符串
  /// </summary>
  /// <param name="str">要解密的字符</param>
  /// <returns></returns>
  public string DecryptString(string str)
  {
   byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
   byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
   byte[] toDecrypt=this.EncodingMode.GetBytes(str);
   byte[] deCrypted=new byte[toDecrypt.Length];
   ICryptoTransform deCryptor=des.CreateDecryptor(keyb,ivb);
   MemoryStream msDecrypt=new MemoryStream(toDecrypt);
   CryptoStream csDecrypt=new CryptoStream(msDecrypt,deCryptor,CryptoStreamMode.Read);
   try
   {
    csDecrypt.Read(deCrypted,0,deCrypted.Length);
   }
   catch(Exception err)
   {
    throw new ApplicationException(err.Message);
   }
   finally
   {
    try
    {
     msDecrypt.Close();
     csDecrypt.Close();
    }
    catch{;}
   }
   return this.EncodingMode.GetString(deCrypted);
  }
  /// <summary>
  /// 解密指定的文件
  /// </summary>
  /// <param name="filePath">要解密的文件路径</param>
  /// <param name="outPath">解密后的文件输出路径</param>
  public void DecryptFile(string filePath,string outPath)
  {
   bool isExist=File.Exists(filePath);
   if(isExist)//如果存在
   {
    byte[] ivb=Encoding.ASCII.GetBytes(this.iv);
    byte[] keyb=Encoding.ASCII.GetBytes(this.EncryptKey);
    FileInfo file=new FileInfo(filePath);
    byte[] deCrypted=new byte[file.Length];
    //得到要解密文件的字节流
    FileStream fin=new FileStream(filePath,FileMode.Open,FileAccess.Read);
    //解密文件
    try
    {
     ICryptoTransform decryptor=des.CreateDecryptor(keyb,ivb);
     CryptoStream csDecrypt=new CryptoStream(fin,decryptor,CryptoStreamMode.Read);
     csDecrypt.Read(deCrypted,0,deCrypted.Length);
    }
    catch(Exception err)
    {
     throw new ApplicationException(err.Message);
    }
    finally
    {
     try
     {
      fin.Close();
     }
     catch{;}
    }
    FileStream fout=new FileStream(outPath,FileMode.Create,FileAccess.Write);
    fout.Write(deCrypted,0,deCrypted.Length);
    fout.Close();
   }
   else
   {
    throw new FileNotFoundException("指定的解密文件没有找到");
   }
  }
  /// <summary>
  /// 解密文件的重载版本,如果没有给出解密后文件的输出路径,
  /// 则解密后的文件将覆盖先前的文件
  /// </summary>
  /// <param name="filePath"></param>
  public void DecryptFile(string filePath)
  {
   this.DecryptFile(filePath,filePath);
  }
  #endregion
 }
 /// <summary>
 /// MD5加密类,注意经MD5加密过的信息是不能转换回原始数据的
 /// ,请不要在用户敏感的信息中使用此加密技术,比如用户的密码,
 /// 请尽量使用对称加密
 /// </summary>
 public class MD5Encrypt
 {
  private MD5 md5;
  public MD5Encrypt()
  {
   md5=new MD5CryptoServiceProvider();
  }
  /// <summary>
  /// 从字符串中获取散列值
  /// </summary>
  /// <param name="str">要计算散列值的字符串</param>
  /// <returns></returns>
  public string GetMD5FromString(string str)
  {
   byte[] toCompute=Encoding.Unicode.GetBytes(str);
   byte[] hashed=md5.ComputeHash(toCompute,0,toCompute.Length);
   return Encoding.ASCII.GetString(hashed);
  }
  /// <summary>
  /// 根据文件来计算散列值
  /// </summary>
  /// <param name="filePath">要计算散列值的文件路径</param>
  /// <returns></returns>
  public string GetMD5FromFile(string filePath)
  {
   bool isExist=File.Exists(filePath);
   if(isExist)//如果文件存在
   {
    FileStream stream=new FileStream(filePath,FileMode.Open,FileAccess.Read);
    StreamReader reader=new StreamReader(stream,Encoding.Unicode);
    string str=reader.ReadToEnd();
    byte[] toHash=Encoding.Unicode.GetBytes(str);
    byte[] hashed=md5.ComputeHash(toHash,0,toHash.Length);
    stream.Close();
    return Encoding.ASCII.GetString(hashed);
   }
   else//文件不存在
   {
    throw new FileNotFoundException("指定的文件没有找到");
   }
  }
 }
 /// <summary>
 /// 用于数字签名的hash类
 /// </summary>
 public class MACTripleDESEncrypt
 {
  private MACTripleDES mact;
  private string __key="ksn168ch";
  private byte[] __data=null;
  public MACTripleDESEncrypt()
  {
   mact=new MACTripleDES();
  }
  /// <summary>
  /// 获取或设置用于数字签名的密钥
  /// </summary>
  public string Key
  {
   get{return this.__key;}
   set
   {
    int keyLength=value.Length;
    int[] keyAllowLengths=new int[]{8,16,24};
    bool isRight=false;
    foreach(int i in keyAllowLengths)
    {
     if(keyLength==keyAllowLengths[i])
     {
      isRight=true;
      break;
     }
    }
    if(!isRight)
     throw new ApplicationException("用于数字签名的密钥长度必须是8,16,24值之一");
    else
     this.__key=value;
   }
  }
  /// <summary>
  /// 获取或设置用于数字签名的用户数据
  /// </summary>
  public byte[] Data
  {
   get{return this.__data;}
   set{this.__data=value;}
  }
  /// <summary>
  /// 得到签名后的hash值
  /// </summary>
  /// <returns></returns>
  public string GetHashValue()
  {
   if(this.Data==null)
    throw new NotSetSpecialPropertyException("没有设置要进行数字签名的用户"+
                                         "数据(property:Data)");
   byte[] key=Encoding.ASCII.GetBytes(this.Key);
   this.mact.Key=key;
   byte[] hash_b=this.mact.ComputeHash(this.mact.ComputeHash(this.Data));
   return Encoding.ASCII.GetString(hash_b);
  }
 }
}
 
分享到:
评论

相关推荐

    Visual Studio .NET加密技术剖析系列课程\Visual Studio .NET加密技术剖析系列课程(3):非对称加密技术_PDF

    在Visual Studio .NET加密技术剖析系列课程中,我们还会探讨如何在应用程序中集成这些加密机制,包括如何安全地存储和管理私钥,以及如何处理可能出现的安全隐患。此外,课程还将涉及PKCS#7标准,这是一个用于打包和...

    .NET加密技术剖析对称加密技术

    .NET加密技术是软件开发中确保数据安全的重要环节,它涵盖了多种加密算法和方法,用于保护敏感信息不被未经授权的人员访问。对称加密技术是一种常见的加密手段,它以其高效和简单的特点,在.NET框架中得到了广泛应用...

    Visual Studio .NET加密技术剖析系列课程(2):对称加密技术

    在.NET框架中,C#语言提供了丰富的加密技术,用于数据的安全保护。本课程重点讨论的是对称加密技术,这是加密领域中最基础且广泛使用的手段。对称加密算法的核心特点是加密和解密使用相同的密钥,这使得其在处理大量...

    vb.net加密解密源代码

    这个名为"vb.net加密解密源代码"的项目,是利用Visual Studio 2008开发的一个小型应用程序,提供了对数据进行加解密的功能。下面我们将详细探讨相关的知识点。 1. **VB.NET基础**: VB.NET是微软公司开发的一种...

    Visual Studio .NET加密技术剖析系列课程(1):加密技术理论概观

    在本系列课程“Visual Studio .NET加密技术剖析”中,我们将深入探讨.NET框架下的加密技术,特别是针对C#编程环境的应用。加密技术是网络安全的重要组成部分,它为数据提供了隐私保护和完整性验证。在这个第一部分中...

    Visual Studio .NET加密技术剖析系列课程(2):对称加密技术_PDF

    本课程“Visual Studio .NET加密技术剖析系列课程(2):对称加密技术”专注于讲解对称加密这一关键概念,它是数据加密的基础之一。 对称加密是一种历史悠久且广泛应用的加密方式,其核心特点是加密和解密使用同一...

    asp.net加密元件,反加密(源代码)

    本资源"asp.net加密元件,反加密(源代码)"提供了一套详细的加密和解密机制,特别适用于ASP.NET Web服务(webservice)中的应用。下面我们将深入探讨这些知识点: 1. ASP.NET 加密: ASP.NET 提供了多种加密选项,...

    .Net加密解密方法

    在.NET框架中,加密和解密是网络安全的重要组成部分,用于保护数据的安全性和隐私。本文将深入探讨ASP.NET中自定义加密解密的方法,以及如何根据用户...理解并正确应用这些技术,对于构建安全的Web应用程序至关重要。

    .net加密解密算法demo

    通过分析和运行这个示例,开发者能够掌握如何在实际项目中应用加密技术,保护用户的隐私和数据安全。同时,自定义关键字的功能允许用户根据自己的业务需求调整加密策略,增加了灵活性。对于那些需要在.NET环境中处理...

    【ASP.NET编程知识】ASP.NET加密口令的方法实例.docx

    在 ASP.NET 应用程序中,我们可以使用 XML 加密和解密技术来保护 XML 数据。XML 加密和解密可以使用 System.Security.Cryptography 命名空间中的类来实现。 五、ASP.NET 加密解密技巧 在 ASP.NET 应用程序中,我们...

    .NET加密数据报完整实例源码

    在阅读和学习这个.NET加密数据报的完整实例源码时,你需要关注上述知识点的实现细节,并理解它们在实际项目中的应用场景。通过深入分析和实践,你将能够熟练掌握C#中的加密技术,提升你的编程技能。

    asp.net 加密解密工具!

    三、ASP.NET加密解密工具的使用 在ASP.NET中,可以使用System.Security.Cryptography命名空间中的类来实现加密和解密操作。例如,使用AES加密: ```csharp using System.IO; using System.Text; using System....

    国密SM4,layui前端 和.net core后台 加密解密 .net加密解密

    1. SM4对称加密算法及其在.NET Core和JavaScript中的实现。 2. LayUI前端框架的使用,以及前端加密库如CryptoJS的集成。 3. C#的System.Security.Cryptography命名空间和SM4CryptoServiceProvider类的应用。 4. 前后...

    asp.net加密解密示例

    在ASP.NET中,主要使用两种加密技术:对称加密和非对称加密。 1. 对称加密: 对称加密使用相同的密钥进行加密和解密。常见的对称加密算法有DES、3DES、AES等。例如,使用AES(高级加密标准)时,可以使用`System....

    .NET文件加密及其播放器

    在本文中,我们将深入探讨.NET框架下的文件加密技术以及如何创建一个能够解密并播放加密文件的播放器。 首先,我们来了解.NET文件加密。在C#中,我们可以使用内置的安全类来实现文件的加密。这些类主要存在于System...

    vb.netProject1.rar_project_vb.net 加密_vb.net 加密解密_文件加密

    在VB.NET编程环境中,开发一个项目常常涉及到各种技术与知识点的综合运用。在这个"vb.netProject1.rar"项目中,开发者构建了一个具有文件加密、排序和解密功能的小型应用程序。这个项目对于学习和理解VB.NET语言以及...

    .NET加密解密实现

    本文将深入探讨.NET加密解密的实现,包括基础概念、常用算法、加密库以及具体的编码示例。 首先,理解加密的基本原理至关重要。加密是将明文数据转化为看似随机的密文,以防止未经授权的访问。解密则是逆过程,将...

    Microsoft .NET企业级应用架构设计.pdf

    本书详细讲解了.NET的安全模型,包括身份验证、授权、加密和解密等,以及如何利用ASP.NET的身份验证和授权机制来保护应用程序。 最后,书中还讨论了.NET中的测试和调试技术,包括单元测试、集成测试和性能测试,...

    一类简单的数据加密方法.rar_vb.net 加密_加密_加密简单_程序加密_简单数据加密

    在实际应用中,除了这些简单的加密方法外,更推荐使用标准的加密库,如AES(高级加密标准)或RSA(公钥加密技术)。这些算法已被广泛验证,安全性和效率都较高。VB.NET提供了System.Security.Cryptography库,封装了...

Global site tag (gtag.js) - Google Analytics