首页 资讯 电脑入门 操作系统 上网 办公 技巧 硬件 软件 网络 图像 多媒体 程序 数据库 网页网站 网游 安全 加密 企业

.NET加密技术要求密钥有确定的长度

巧巧电脑网络 2010-09-15 赛迪网 洪玮   收藏此文 
net加密技术要求密钥有确定的长度,例如,DES(Data Encryption Standard)函数要求密钥的长度是64位,Rijndael则要求128、192或256位长度的密钥。密钥越长,加密强度越高。对于DES之外的加密算法,查询LegalKeySizes属性即可得到它允许的密钥长度。

.NET加密技术要求密钥有确定的长度,例如,DES(Data Encryption Standard)函数要求密钥的长度是64位,Rijndael则要求128、192或256位长度的密钥。密钥越长,加密强度越高。对于DES之外的加密算法,查询LegalKeySizes属性即可得到它允许的密钥长度,包括MinSize(支持的最小密钥长度)、MaxSize(最大密钥长度)、 SkipSize(增量)。SkipSize表示密钥最大长度和最小长度之间可用长度的间隔,例如,Rijndael算法的SkipSize值是64位。

利用下面的代码可以得到密钥的长度信息:

' 创建DES加密对象

Dim des As New DESCryptoServiceProvider()

Dim fd() As KeySizes

fd = des.LegalKeySizes() 'tells us the size(s), in bits

MsgBox("加密类型=" & des.ToString() & Chr(13) & "minsize = " & fd(0).MinSize & Chr(13) & _

"maxsize = " & fd(0).MaxSize & Chr(13) & "skipsize = " & fd(0).SkipSize)

运行上面的代码,得到的结果是64、64、0。如果把加密对象的声明改成TripleDESCryptoServiceProvider(),得到的结果是128、192、64。

说明:DES算法要求输入一个8字节的密码,但实际使用的密钥只有56位(7个字节),每一个字节的最后一位不用(它作为校验位使用,但不用于实际的加密过程)。

下面的代码开始生成本文示例程序的密钥:

Public Class Form1

Inherits System.Windows.Forms.Form

' 保存密钥的8字节的数组

Private TheKey(7) As Byte

' 在向量中放入一些随机数据

Private Vector() As Byte = {&H12, &H44, &H16, &HEE, &H88, &H15, &HDD, &H41}

首先,代码定义了保存密钥和初始向量(请参见稍后的详细说明)的两个变量。向量的初值这里用随机数据填充,当然,通过密码和Hash算法也可以获得向量的初值。下面的过程从用户输入的密码创建出密钥:

Sub CreateKey(ByVal strKey As String)

' 保存密钥的字节数组

Dim arrByte(7) As Byte

Dim AscEncod As New ASCIIEncoding()

Dim i As Integer = 0

AscEncod.GetBytes(strKey, i, strKey.Length, arrByte, i)

' 获得密码的Hash值

Dim hashSha As New SHA1CryptoServiceProvider()

Dim arrHash() As Byte = hashSha.ComputeHash(arrByte)

' 将Hash值保存到密钥

For i = 0 To 7

TheKey(i) = arrHash(i)

Next i

End Sub

用户的密码(strKey)传入到CreateKey过程,分解成一组ASCII值保存到一个字节数组。把这个字节数组传递给 SHA1CryptoServiceProvider类的ComputeHash方法,返回一个Hash值。把这个Hash值保存到TheKey数组,供以后的加密/解密过程使用(注意SHA1CryptoServiceProvider实际能够支持160位,但本文示例程序只用到64位)。

那么,初始向量究竟起什么作用呢?这个字节数组有8个元素,就象密钥一样,但向量和密钥的作用是不同的,向量用来避免DES之类的算法一个特有的问题。在DES之类的算法中,原始数据被分成8字节一块然后分别处理。DES在加密一块数据时,要用到前一块数据的模式,也就是说,如果改动了原始数据中第一块的某个字符,所有后继的块的内容都将随之改变,从而避免了一系列相连接的块中出现重复块的问题。

例如,假设你一时高兴,发了一个邮件,内容只有几个重复的单词“Melanie! Melanie! Melanie! Melanie!”,在密钥和块序列中前一块的共同作用下,加密之后的密文不会出现重复现象。然而,进一步考虑这个加密过程可以发现,如果用同一个密钥加密多个邮件,且邮件开头的问候语都相同,则邮件开头的一部分很容易受到攻击。由于这个原因,我们用初始向量来模拟前一个块。

本文加密/解密工具中的下面这段代码示范了如何加密文件:

Sub Encrypt(ByVal inName As String , ByVal outName As String )

Try

' 创建缓冲区

Dim storage(4096) As Byte

' 已经写入的字节数量

Dim totalBytesWritten As Long = 8

' 每次写入的字节数量

Dim packageSize As Integer

' 声明文件流

Dim fin As New FileStream(inName, FileMode.Open, FileAccess.Read)

Dim fout As New FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write)

fout.SetLength(0)

' 源文件的大小

Dim totalFileLength As Long = fin.Length

' 创建加密对象

Dim des As New DESCryptoServiceProvider()

Dim crStream As New CryptoStream(fout, _

des.CreateEncryptor(TheKey, Vector), _

CryptoStreamMode.Write)

' 输出加密后的文件

While totalBytesWritten < totalFileLength

packageSize = fin.Read(storage, 0, 4096)

crStream.Write(storage, 0, packageSize)

totalBytesWritten = Convert.ToInt32(totalBytesWritten + _

packageSize / des.BlockSize * des.BlockSize)

End While

crStream.Close()

Catch e As Exception

MsgBox(e.Message)

End Try

End Sub

注意这段代码创建了三个文件流:fin,表示明文形式的原始文件;fout,加密结果文件;crStream,加密流,用来把DES加密的结果转入输出文件fout。增加一个crStream流的好处是不必把结果保存到临时文件或缓冲区。

加密过程与解密过程的唯一重要区别是,执行解密时,我们将使用DESCryptoServiceProvider对象的另一个方法CreateDecryptor,除此之外,两者其余的处理步骤(包括参数,文件流,等等)基本相同。

回顾文章:详解加密技术概念、加密方法以及应用

现代的电脑加密技术就是适应了网络安全的需要而应运产生的,它为我们进行一般的电子商务活动提供了安全保障,如在网络中进行文件传输、电子邮件往来和进行合同文本的签署等。使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。

本类最热图文
Google
巧巧电脑网络编辑信箱  告诉我们您想看的专题或文章