RC2加密算法在C#的应用

2024-02-17 10:58

本文主要是介绍RC2加密算法在C#的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace Curllion
{
 public class Crypt
 {
  /// <summary>
  /// 新建一个大小为10261B的文件,以便将加密数据写入固定大小的文件。
  /// </summary>
  /// <param name="filePath">文件保存的地址,包含文件名</param>
  public static void InitBinFile(string filePath)
  {
   byte[] tmp = new byte[10261];
   try  //创建文件流,将其内容全部写入0
   {
    System.IO.FileStream writeFileStream = new FileStream(filePath,
     System.IO.FileMode.Create,
     System.IO.FileAccess.Write,
     System.IO.FileShare.None,512,false);

    for(int i = 0 ;i< 10261;i++)
     tmp[i] = 0; 
    writeFileStream.Write(tmp,0,10261);
    writeFileStream.Flush();
    writeFileStream.Close();
   }
   catch(System.IO.IOException)
   {
    MessageBox.Show("文件操作错误!","错误!",MessageBoxButtons.OK,MessageBoxIcon.Error);
   }
  }
  /// <summary>
  /// 将文本数据加密后写入一个文件,其中,这个文件是用InitBinFile建立的,这个文件将被分成十块,
  /// 用来分别保存10组不同的数据,第一个byte位保留,第2位到第21位分别用来存放每块数据的长度,但
  /// 一个byte的取值为0-127,所以,用两个byte来存放一个长度。
  /// </summary>
  /// <param name="toEncryptText">要加密的文本</param>
  /// <param name="filePath">要写入的文件</param>
  /// <param name="dataIndex">写入第几块,取值为1--10</param>
  /// <returns>是否操作成功</returns>
  public static bool EncryptToFile(string toEncryptText,string filePath,int dataIndex)
  {
   bool r = false;
   if(dataIndex > 10 && dataIndex < 1)
   {
    MessageBox.Show("数据索引的取值范围在1至10之间!","错误!",
     MessageBoxButtons.OK,MessageBoxIcon.Error);
    return r;
   }
   byte[] encrypted;  
   //初始化向量
   byte[] key = {106,51,25,141,157,142,23,111,234,159,187,154,215,34,37,204};   
   //密匙
   byte[] IV = {135,186,133,136,184,149,153,144};
   //创建UTF-16 编码,用来在byte[]和string之间转换
   System.Text.UnicodeEncoding textConverter = new UnicodeEncoding();
   //创建RC2服务
      RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider();
   //打开要写入的文件,主要是为了保持原文件的内容不丢失
   System.IO.FileStream tmpFileStream= new FileStream(filePath,
    System.IO.FileMode.Open,
    System.IO.FileAccess.Read,
    System.IO.FileShare.None,1024,true);

   byte[] index = new byte[10261];
   //将读取的内容写到byte数组
   tmpFileStream.Read(index,0,10261);
   tmpFileStream.Close();
   //定义基本的加密转换运算
   System.Security.Cryptography.ICryptoTransform Encryptor = rc2CSP.CreateEncryptor(key,IV);
   System.IO.MemoryStream msEncrypt = new MemoryStream();
   //在此加密转换流中,加密将从csEncrypt,加密后,结果在msEncrypt流中。
   System.Security.Cryptography.CryptoStream csEncrypt = new CryptoStream(msEncrypt,
    Encryptor,CryptoStreamMode.Write);
   //将要加密的文本转换成UTF-16 编码,保存在tmp数组。
   byte[] tmp = textConverter.GetBytes(toEncryptText);
   //将tmp输入csEncrypt,将通过Encryptor来加密。
   csEncrypt.Write(tmp,0,tmp.Length);
   //输出到msEnctypt
   csEncrypt.FlushFinalBlock();
   //将流转成byte[]
   encrypted = msEncrypt.ToArray();
   if(encrypted.Length>1024)
   {
    MessageBox.Show("加密后,数据长度大于1KB,无法保存");
    return false;
   }
   //得到加密后数据的大小,将结果存在指定的位置。
   index[dataIndex*2 - 1] = Convert.ToByte(Convert.ToString(encrypted.Length/128));
   index[dataIndex*2]     = Convert.ToByte(Convert.ToString(encrypted.Length%128));
   //将加密后的结果写入index(覆盖)
   for(int i=0;i<encrypted.Length;i++)
    index[1024*(dataIndex-1)+21+i]=encrypted[i];
   //建立文件流
   tmpFileStream = new FileStream(filePath,
    System.IO.FileMode.Truncate,
    System.IO.FileAccess.Write,
    System.IO.FileShare.None,1024,true);
   //写文件
   tmpFileStream.Write(index,0,10261);
   tmpFileStream.Flush();
   r = true;
   tmpFileStream.Close();
   return r;
  }
  /// <summary>
  /// 从一个文件中解密出一段文本,其中,这个文件是由InitBinFile建立的,并且由 EncryptToFile加密的
  /// </summary>
  /// <param name="filePath">要解密的文件</param>
  /// <param name="dataIndex">要从哪一个块中解密</param>
  /// <returns>解密后的文本</returns>
  public static string DecryptFromFile(string filePath,int dataIndex)
  {
   string r = "";
   if(dataIndex > 10 && dataIndex < 1)
   {
    MessageBox.Show("数据索引的取值范围在1至10之间!","错误!",
     MessageBoxButtons.OK,MessageBoxIcon.Error);
    return r;
   }
   byte[] decrypted;
   byte[] key = {106,51,25,141,157,142,23,111,234,159,187,154,215,34,37,204};
   byte[] IV = {135,186,133,136,184,149,153,144};
   System.Text.UnicodeEncoding textConverter = new UnicodeEncoding();
   RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider();
   System.IO.FileStream tmpFileStream = new FileStream(filePath,
    System.IO.FileMode.Open,
    System.IO.FileAccess.Read,
    System.IO.FileShare.None,1024,true);

   System.Security.Cryptography.ICryptoTransform Decryptor = rc2CSP.CreateDecryptor(key,IV);
   System.IO.MemoryStream msDecrypt = new MemoryStream();
   System.Security.Cryptography.CryptoStream csDecrypt = new CryptoStream(msDecrypt,
    Decryptor,CryptoStreamMode.Write);
   byte[] index = new byte[10261];

   tmpFileStream.Read(index,0,10261);
   int startIndex = 1024*(dataIndex-1)+21;
   int count      = index[dataIndex*2 - 1]*128 + index[dataIndex*2];
   byte[] tmp     = new byte[count];

   Array.Copy(index,1024*(dataIndex-1)+21,tmp,0,count);
   csDecrypt.Write(tmp,0,count);
   csDecrypt.FlushFinalBlock();
   decrypted = msDecrypt.ToArray();
   r = textConverter.GetString(decrypted,0,decrypted.Length);
   tmpFileStream.Close();
   return r;
  }
  /// <summary>
  /// 将一段文本加密后保存到一个文件
  /// </summary>
  /// <param name="toEncryptText">要加密的文本数据</param>
  /// <param name="filePath">要保存的文件</param>
  /// <returns>是否加密成功</returns>
  public static bool EncryptToFile(string toEncryptText,string filePath)
  {
   bool r = false;
   byte[] encrypted;
   byte[] key = {106,51,25,141,157,142,23,111,234,159,187,154,215,34,37,204};
   byte[] IV = {135,186,133,136,184,149,153,144};
   System.Text.UnicodeEncoding textConverter = new UnicodeEncoding();
   RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider();
   System.IO.FileStream tmpFileStream = new FileStream(filePath,
    System.IO.FileMode.OpenOrCreate,
    System.IO.FileAccess.Write,
    System.IO.FileShare.None,1024,true);

   System.Security.Cryptography.ICryptoTransform Encryptor = rc2CSP.CreateEncryptor(key,IV);
   System.IO.MemoryStream msEncrypt = new MemoryStream();
   System.Security.Cryptography.CryptoStream csEncrypt = new CryptoStream(msEncrypt,
    Encryptor,CryptoStreamMode.Write);

   byte[] tmp = textConverter.GetBytes(toEncryptText);
   csEncrypt.Write(tmp,0,tmp.Length);
   csEncrypt.FlushFinalBlock();   
   encrypted = msEncrypt.ToArray();
   tmpFileStream.Write(encrypted,0,encrypted.Length);
   tmpFileStream.Flush();
   r = true;
   tmpFileStream.Close();
   return r;
  }
  /// <summary>
  /// 将一个被加密的文件解密
  /// </summary>
  /// <param name="filePath">要解密的文件</param>
  /// <returns>解密后的文本</returns>
  public static string DecryptFromFile(string filePath)
  {
   string r = "";
   byte[] decrypted;
   byte[] key = {106,51,25,141,157,142,23,111,234,159,187,154,215,34,37,204};
   byte[] IV = {135,186,133,136,184,149,153,144};
   System.Text.UnicodeEncoding textConverter = new UnicodeEncoding();
   RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider();
   System.IO.FileStream tmpFileStream = new FileStream(filePath,
    System.IO.FileMode.Open,
    System.IO.FileAccess.Read,
    System.IO.FileShare.None,1024,true);
   System.Security.Cryptography.ICryptoTransform Decryptor = rc2CSP.CreateDecryptor(key,IV);
   System.IO.MemoryStream msDecrypt = new MemoryStream();
   System.Security.Cryptography.CryptoStream csDecrypt = new CryptoStream(msDecrypt,
    Decryptor,CryptoStreamMode.Write);

   byte[] tmp = new byte[tmpFileStream.Length];
   tmpFileStream.Read(tmp,0,tmp.Length);
   csDecrypt.Write(tmp,0,tmp.Length);
   csDecrypt.FlushFinalBlock();
   decrypted = msDecrypt.ToArray();    
   r = textConverter.GetString(decrypted,0,decrypted.Length);
   tmpFileStream.Close();
   return r;
  }
 }
}

这篇关于RC2加密算法在C#的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717561

相关文章

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元