随着个人数据保护意识的加强,编程人员都希望通过采用加密算法来增强所开发的应用程序的保护功能。“加密”其实是双刃剑,需要编程人员掌握加密算法及其编程技巧,将导致整个应用程序开发难度加大,增加了编程工作量。基于此,我们探讨了在VB6.0中创建ActiveX控件,设计并实现了一个基于对称加密算法与非对称加密算法的通用加密控件,只要将控件嵌入编程环境,即可达到不用编写加密代码就可以实现加密的功能。

一、DES和RSA加密算法介绍

DES加密算法是通过密钥对64位的二进制信息进行加密,即把明文的64位信息文件加密成密文的64位信息。由于DES加密算法是公开的,所以加密强度取决于密钥的保密程度。加密后
的信息可用加密时所用的同一密钥通过求逆变换还原成对应的明文。

RSA加密算法的加密密钥叫做公开密钥,解密密钥叫做私人密钥。RSA的密钥生成:先找出p、q、r三个数,其中p,q是两个相异的质数,r是与(p-1)(q-1)互质的数,p、q、r这三个
数便是私人密钥。进一步再找数m,使得r=1 mod (p-1)(q-1)。这个m一定存在,因为r与(p-1)(q-1)互质,用辗转相除法可以求得,最后计算n=pq,m,n这两个数便是公开密钥。

二、含有DES和RSA两种加密算法的控件设计与实现

在各类不同的加密算法中,DES算法和RSA算法是最具影响力的两种算法,如果在控件中能同时嵌入这两种加密算法,则可以更有效地抵抗各种密码攻击,提高保密程度。在制作控件时,首先需要把含有两种加密算法的VB程序在标准EXE工程中调试成功,其中最重要的是每种算法在VB中的程序实现。

1、DES在VB6.0的编程实现

DES算法数据流程的具体框架是不固定的,其一次迭代的具体流程如图1所示。

DES和RSA加密算法不写程序代码的加密方案

本加密算法的编程实现首先要进行文件二进制形式的转化,因为DES加密算法就是对二进制形式进行加密处理的。数据处理前还必须解决密钥表的生成实现,而在加密运算中,乘积变换和模2运算的实现是比较困难的。部分实现如下所述。

转化文件为二进制形式的部分程序:

If (Not FileExist(SourccFilc)) Then

Call Err.Raise(vbObjcctError,,"Errorprocedurc (Sourcefik does not exist).’检验原文件

End If

Filenr = FreeFile

Opcn SourccFile For Binary As #Filcnr

RcDim ByteArray(0 To LOF(Filcnr)-1)

Get #Filenr,,ByteArray()

Closc #Filenr

生成密钥表的部分程序:

Public Propcrty Let kcy(New_Valuc As String)

If (m_KeyValuc=New_Value) thcn Exit Propcrty

m_ KeyValue=New_Value

Call Bytc2Bin(StrConv(New_Value~vbFromUnicodc),if(Len(New_Valuc)>8, 8, Len(New_Valuc)),

KcyBin())’转为二进制数组

Fora=0 T0 55

KcySchedulc(a) - KcyBin(m_PCl(a))

Next

乘积变换实现的部分程序:

Fori=l T0 16

ERxorK(O)=R(31) Xor m_Key(0,i)

ERxorK(I)=R(O) Xor m_Key(1,i)

ERxorK(2)-R(1) Xor m_Key(2,i)

ERxorK(3)-R(2) Xor m_Key(3,i)

ERxorK(4).R(3) Xor m_Key(4,i)

ERxorK(5);R(4) Xor m_Key(5,i)

.....

ERxorK(47)=R(O) Xor m_Kcy(47,i)

解密即为求逆变换。

2、RSA在VB6.O的编程实现

RSA的实现主要是公钥和私钥的随机生成,明文就是在此基础上的取模运算,算法流程如图2所示。

DES和RSA加密算法不写程序代码的加密方案

随机生成公钥和私钥的部分程序:

Public Sub GcnKcy()

Randomize

top:

p IRnd* 1000 \1

If IsPrimc(p)t False Then GoTo top

Sel_q:

q=Rnd * 1000\1

If IsPrime(q) = Falsc Then GoTo Sel_q

n=p*q\1

phi= (P-1)*(q-1)\1

d=Rnd *n\1

Ifd =0 or n=0or d=1 Then GoTo top

e= Euler(phi,d)

Elself Mult(x,d,n)1 255 Then

keys(1)=e

kcys(2)=d

keys(3)=n

End If

其中IsPrime()函数是验证参数是否为素数。Euler()函数是利用公式求另一密钥。

Mult0函数是验证sk或pk是否与pq为互素。

3、 ActiveX控件的制作

在“文件甜菜单“新建工程”选项中,选择“ActiveX控件”,对弹出的名为Usercontrol设计窗口进行操作来建立Acti,veX控件。先对已完成的标准EXE工程中的对象和代码进行复制,再编写UserControl的触发事件Initialize,然后对控件进行测试。为了能在设计中同时测试控件,需增加一个“标准EXE”工程。在添加工程中建立一个标准EXE工程,与ActiveX工程组成一个工程组,将测试工程名设为TestProject,并把TestProject工程设为启动工程。此时,工具箱上就增加了一个名为UserControll.的控件,最后生成相应的ocx文件。

三、控件的应用实例

用VB编写一个档案管理系统,希望对文件进行加密。文件加密工作只须把生成的ActiveX控件当作一个类的对象来引用,省去了编写加密代码的烦琐工作,很方便地实现了文件和数据的加密功能。此处以数据加密为例,来检验加密和解密的效果。

当选择用DES加密算法时,输入“我是谁”,加密后为“潭c人77掺M一龋?0?”,解密后为“我是谁”。当选择用RSA算法时,随机生成公钥和私钥,输入“who am I",加密后为“MzYyMSszNzEOKzM4MDYrMzA20SszMzAOKzM5NDErMzA20SsyMzU3",解密后为“who amI”。这说明系统可以实现加密的功能。本控件的使用,明显会使整个档案管理系统
的开发难度减小,也相对减轻了编程人员的工作量,所以本控件的制作,是有普遍意义的。

信息保护已越来越受到人们的重视,很多应用程序的开发都需要设计加密功能。本设计含有RSA和DES加密算法的ActiveX控件可以在多种编程环境中直接加载引用,便捷地建立了高可靠性的加密保护,很好地解决了应用程序开发时加密算法设计和加密代码需重复编写的问题。

小知识之ActiveX控件

ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(如今的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和java applet功能类似。