C#加密概述

转载 2006年06月12日 13:12:00

C#加密概述

摘要:介绍Microsoft.NET下加密技术的过程和方法。
关键词:Microsoft.NET;加密技术

Microsoft.NET以其强大的性能,世界级的工具支持,操作简易性,扩展性,安全性等等优点,迅速的风靡全球,随着使用者的越来越多,加密与解密的问题就越来越受关注。C# 是.NET的关键性语言,它是整个.NET平台的基础,下面介绍一下.NET平台上C#语言的加密方法。
加密技术就是使用加密算法对数据进行加密,将有意义的字符编码成无意义的字符,在加密的状态下传输数据,然后由预定的接收方对数据进行解密,如果第三方截获了加密的数据,解密数据是很困难的,达到使不应该访问这些数据的人员无法读取它们的目的,帮助保护数据不被查看和修改,并且可以帮助在本不安全的信道上提供安全的通信方式。

title

概括的说,加密技术有以下三个目的:
1. 保密性:帮助保护用户的标识或数据不被读取;
2. 数据完整性:帮助保护数据不更改;
3. 身份验证:确保数据发自特定的一方。
为了达到上述目的,可以使用算法和惯例的组合(加密基元)来创建加密方案。加密基元有:私匙加密,公匙加密,加密签名,加密哈希。 下面介绍如何在.net下实现加密的过程和方法。
1.私匙加密
私匙加密算法使用单个私匙来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密数据,因此必须保护密钥不被未经授权的代理得到。私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。见下图:


title

私钥加密的优点是它的算法非常快(与公钥算法相比),特别适用于对较大的数据流执行加密转换。缺点是它假定双方已就密钥和 IV 达成协议,并且互相传达了密钥和 IV 的值。并且,密钥必须对未经授权的用户保密。
.NET Framework 提供了以下实现私钥加密算法的类:
· DESCryptoServiceProvider
· RC2CryptoServiceProvider
· RijndaelManaged
· TripleDESCryptoServiceProvider

私匙加密例子:
在Microsoft Visual Studio新建一个WindowsApplication,界面如下图。

title

在项目的*.cs文件中添加以下代码:
添加头文件:
using System.Collections;
using System.Security.Cryptography;
using System.IO;
添加文件加密的函数:
#region 文件加密函数
private bool MyEncrypt(String inName, String outName, byte[] desKey, byte[] desIV)
{ FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);
byte[] bin = new byte[100];
long rdlen = 0;
long totlen = fin.Length;
int len;
DES des = new DESCryptoServiceProvider();
CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
while(rdlen < totlen)
{ len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len; }
encStream.Close();
fout.Close();
fin.Close();
return true; }
#endregion
添加文件解密的函数:
#region 文件解密函数
private bool MyDecrypt(String inName, String outName, byte[] desKey, byte[] desIV)
{ FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);
byte[] bin = new byte[100];
long rdlen = 0;
long totlen = fin.Length;
int len;
DES des = new DESCryptoServiceProvider();
CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write);
while(rdlen < totlen)
{ len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len; }
encStream.Close();
fout.Close();
fin.Close();
return true; }
#endregion
在“加密”按钮上添加以下代码:
string key = this.textBox1.Text;
string IV="12345678";
byte[] deskey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
byte[] desIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV);
if (this.MyEncrypt(this.textBox2.Text, this.textBox3.Text, deskey, desIV))
{ MessageBox.Show("文件加密成功"); }
在“解密“按钮上添加以下代码:
string key = this.textBox1.Text;
string IV = "12345678";
byte[] deskey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
byte[] desIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV);
if (this.MyDecrypt(this.textBox2.Text, this.textBox3.Text, deskey, desIV))
{ MessageBox.Show("文件解密成功"); }
运行结果:
加密前: 加密后:

title

2.公匙加密
公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上是相关联的;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以提供给任何人,用于对要发送到私钥持有者的数据进行加密。两个密钥对于通信会话都是唯一的。公钥加密算法也称为不对称算法,原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据。见下图:

title


公钥算法的缺点(相对于私匙算法)是无法像私钥算法那样将数据链接起来成为流,原因是它只可以加密少量数据。因此,不对称操作不使用与对称操作相同的流模型。公匙加密算法使用固定的缓冲区大小,而私钥加密算法使用长度可变的缓冲区。
公匙加密具有更大的密钥空间,因此不大容易受到对每个可能密钥都进行尝试的穷举攻击。由于不必保护公钥,因此它易于分发。公钥算法可用于创建数字签名以验证数据发送方的身份。但是,公钥算法非常慢(与私钥算法相比),不适合用来加密大量数据。公钥算法仅对传输很少量的数据有用。
.NET Framework 提供以下实现公钥加密算法的类:
· DSACryptoServiceProvider
· RSACryptoServiceProvider
公匙加密例子:
在Microsoft Visual Studio新建一个WindowsApplication,界面如下图。

title

在项目的*.cs文件中添加以下代码:
添加头文件:
using System.Security.Cryptography;
using System.IO;
using System.Collections;
在“得到钥匙信息”按钮添加以下代码:
crypt = new RSACryptoServiceProvider();
publickey = crypt.ToXmlString(false);
richTextBox1.Text = "导出秘匙的情况下:/n" + publickey + "/n";
privatekey = crypt.ToXmlString(true);
string info = "仅仅导出公匙的情况下:/n" + privatekey + "/n";
richTextBox1.AppendText(info);
crypt.Clear();
在“读取私匙”按钮添加以下代码:
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Text File (*.txt)|*.txt|All File (*.*)|*.* ";
open.ShowDialog();
StreamReader sr = new StreamReader(open.FileName, UTF8Encoding.UTF8);
readprivatekey = sr.ReadToEnd();
sr.Close();
在“读取公匙”按钮添加以下代码:
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Text File (*.txt)|*.txt|All File (*.*)|*.* ";
open.ShowDialog();
StreamReader sr = new StreamReader(open.FileName, UTF8Encoding.UTF8);
readprivatekey = sr.ReadToEnd();
sr.Close();
在“使用公匙加密”按钮添加以下代码:
crypt = new RSACryptoServiceProvider();
UTF8Encoding enc = new UTF8Encoding();
bytes = enc.GetBytes(textBox1.Text);
crypt.FromXmlString(readpublickey);
bytes = crypt.Encrypt(bytes, false);
string encryttext = enc.GetString(bytes);
richTextBox2.Text = encryttext ;
在“使用私匙解密”按钮添加以下代码:
UTF8Encoding enc = new UTF8Encoding();
byte[] decryptbyte;
crypt.FromXmlString(readprivatekey);
decryptbyte = crypt.Decrypt(bytes, false);
string encryttext = enc.GetString(decryptbyte);
richTextBox3.Text = encryttext ;
当得到钥匙信息,分别保存公匙和私匙后,就在“加密解密文字”的选项卡片里输入要加密的文字,再分别读取私匙和公匙,当按下“使用公匙加密”按钮时,就会在richTextBox2中显示出加密后的乱码,当按下“使用私匙解密”按钮时,就会在richTextBox3中显示出加密前的文字。
3.数字签名
数字签名用来验证发送方的身份并帮助保护数据的完整性。见公匙加密的图,使用由用户A生成的公钥,用户B可以通过将数字签名与用户A的数据和公钥进行比较,从而验证是否是用户A发送了该数据。
为了使用公钥加密对消息进行数字签名,用户A首先将哈希算法应用于该消息以创建消息摘要。该消息摘要是数据的紧凑且唯一的表示形式。然后,用户A用她的私钥加密该消息摘要以创建他的个人签名。在收到消息和签名时,用户B使用用户A的公钥解密签名以恢复消息摘要,并使用与用户A所使用的相同的哈希算法来散列消息。如果用户B计算的消息摘要与从用户B那里收到的消息摘要完全一致,用户B就可以确定该消息来自私钥的持有人,并且数据未被修改过。
请注意,由于发送方的公钥为大家所周知,并且它通常包含在数字签名格式中,因此任何人都可以验证签名。此方法不保守消息的机密;若要使消息保密,还必须对消息进行加密。
.NET Framework 提供以下实现数字签名算法的类:
l DSACryptoServiceProvider
l RSACryptoServiceProvider
4.哈希值
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希计算都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。
消息身份验证代码 (MAC) 哈希函数通常与数字签名一起用于对数据进行签名,而消息检测代码 (MDC) 哈希函数则用于数据完整性。
双方(用户A,B)可按下面的方式使用哈希函数来确保数据的完整性。如果用户A对用户B编写一条消息并创建该消息的哈希,则用户B可以在稍后散列该消息并将他的哈希与原始哈希进行比较。如果两个哈希值相同,则该消息没有被更改;如果值不相同,则该消息在用户A编写它之后已被更改。为了使此系统发挥作用,用户A必须对除用户B外的所有人保密原始的哈希值。
.NET Framework 提供以下实现数字签名算法的类:
l HMACSHA1
l MACTripleDES
l MD5CryptoServiceProvider
l SHA1Managed
l SHA256Managed
l SHA384Managed
l SHA512Managed
5.随机数生成
随机数生成是许多加密操作不可分割的组成部分。例如,加密密钥需要尽可能地随机,以便使生成的密钥很难再现。加密随机数生成器必须生成无法以计算方法推算出(低于 p < .05 的概率)的输出;即,任何推算下一个输出位的方法不得比随机猜测具有更高的成功概率。.NET Framework 中的类使用随机数生成器生成加密密钥。
RNGCryptoServiceProvider类是随机数生成器算法的实现。

.NET已经把加密时所用到的算法都封装起来了,可以很方便的调用,且安全性很高,大大缩短软件开发的周期。

相关文章推荐

C#文件加密

你可以从此处下载源码 CSharp将任何文件转成字符串保存到数据库及文件加密 一、加密类DESFileClass.cs   using System; using System.Colle...
  • xjzdr
  • xjzdr
  • 2011年10月30日 09:43
  • 1228

C#调用加密狗代码

  • 2007年07月03日 11:26
  • 338KB
  • 下载

【Java编码准则】の #02不要在客户端存储未加密的敏感信息

当构建CS模式的应用程序时,在客户端侧存储敏感信息(例如用户私要信息)可能导致非授权的信息泄漏。      对于Web应用程序来说,最常见的泄漏问题是在客户端使用cookies存放服务器端获取的敏感信...
  • ACE1985
  • ACE1985
  • 2014年06月21日 22:08
  • 1323

【Android平台中的安全编程】の #00-不要在外部存储(SD卡)中存放未加密的敏感信息

Android提供了几种保存持久化应用数据的选择,其中之一就是外部存储(/sdcard, /mnt/sdcard)。外部存储包括设备内部的微型或标准大小的SD卡,挂载到PC上的Android设备存储卡...
  • ACE1985
  • ACE1985
  • 2014年06月10日 00:43
  • 2153

【Java编码准则】の #12不要使用不安全或者强度弱的加密算法

安全性要求高的应用程序必须避免使用不安全的或者强度弱的加密算法,现代计算机的计算能力使得攻击者通过暴力破解可以攻破强度弱的算法。例如,数据加密标准算法DES是极度不安全的,使用类似EFF(Electr...
  • ACE1985
  • ACE1985
  • 2014年06月21日 23:46
  • 3013

C#中的MDI编程实例讲解

多文档界面就是所谓的MDI,他是从Windows 2.0下的Microsoft Excel电子表格程序开始引入的,这是因为Excel电子表格用户有时需要同时操作多份表格,MDI正好为这种操作多表格提供...
  • cca313
  • cca313
  • 2012年06月06日 11:55
  • 571

建立第一个directX程序——在C#下利用DirectSound实现声音播放

//转自:http://blog.csdn.net/cutebab0888/article/details/1143310 这是给directX初学者的教程,如果你是大虾,大可不必理...

C#变量类型:引用类型和值类型

C#是一种类型安全的语言。每一个变量都要求定义为一个特定的类型,并且要求存储在变量中的值只能是这种类型的值。 变量既能保存值类型,也可以保存引用类型,还可以是指针。这一课将讲述前两种类型,关于指...
  • slj_win
  • slj_win
  • 2014年08月25日 10:12
  • 568

如何用C#在Excel中生成图表

一 如何用C#在Excel中生成图表C#源代码程序 exc.Charts.Add(oMissing,oMissing,1,oMissing);        exc.ActiveChart.Ch...
  • postfxj
  • postfxj
  • 2012年02月11日 08:36
  • 6800
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#加密概述
举报原因:
原因补充:

(最多只允许输入30个字)