.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);
  }
 }
}

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,可以基于 Windows 序列号实现软件加密: ```vb.net '获取Windows序列号 Dim wmi As Object = GetObject("winmgmts:") Dim sn As String = "" For Each item In wmi.InstancesOf("Win32_OperatingSystem") sn = item.SerialNumber Next '使用序列号生成加密密钥 Dim key As String = "mysecretkey" + sn '使用密钥对数据进行加密 Dim plainText As String = "Hello world" Dim encryptedText As String = EncryptString(plainText, key) '使用密钥对数据进行解密 Dim decryptedText As String = DecryptString(encryptedText, key) 'Show结果 Console.WriteLine("Plain Text: " + plainText) Console.WriteLine("Encrypted Text: " + encryptedText) Console.WriteLine("Decrypted Text: " + decryptedText) '加密函数 Private Function EncryptString(ByVal plainText As String, ByVal key As String) As String Dim plainBytes As Byte() = Encoding.UTF8.GetBytes(plainText) Dim keyBytes As Byte() = Encoding.UTF8.GetBytes(key) Dim cryptoProvider As New DESCryptoServiceProvider cryptoProvider.Mode = CipherMode.ECB cryptoProvider.Padding = PaddingMode.PKCS7 Dim memoryStream As New MemoryStream Dim cryptoStream As New CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(keyBytes, keyBytes), CryptoStreamMode.Write) cryptoStream.Write(plainBytes, 0, plainBytes.Length) cryptoStream.FlushFinalBlock() Return Convert.ToBase64String(memoryStream.ToArray) End Function '解密函数 Private Function DecryptString(ByVal encryptedText As String, ByVal key As String) As String Dim encryptedBytes As Byte() = Convert.FromBase64String(encryptedText) Dim keyBytes As Byte() = Encoding.UTF8.GetBytes(key) Dim cryptoProvider As New DESCryptoServiceProvider cryptoProvider.Mode = CipherMode.ECB cryptoProvider.Padding = PaddingMode.PKCS7 Dim memoryStream As New MemoryStream(encryptedBytes) Dim cryptoStream As New CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(keyBytes, keyBytes), CryptoStreamMode.Read) Dim plainBytes(encryptedBytes.Length - 1) As Byte Dim decryptedByteCount As Integer = cryptoStream.Read(plainBytes, 0, encryptedBytes.Length) Return Encoding.UTF8.GetString(plainBytes, 0, decryptedByteCount) End Function ``` 以上代码使用 DES 对称加密算法进行加密,密钥由自定义的字符串和 Windows 序列号拼接而成。实际应用中,为了更好的安全性,可以使用更高强度的加密算法和更复杂的密钥生成算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值