| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,学好外语很重要  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 应用开发 >> vb >> VB加密 >> 文章正文
用VB6实现中英文文本的私钥加密            【字体:
用VB6实现中英文文本的私钥加密
作者:未知    文章来源:-    点击数:    更新时间:2006-8-8

一. 私钥加密方案

---- 加密(Encryption)是信息保护的一种必不可少的手段。目前有两种基本的加密方法,即私钥加密和公钥加密。用VB既可用自定义算法实现简便的私钥加密,也可通过调用Crypto API接口实现复杂的公钥加密。对于加密数据,若在Internet/Intranet上传送,则完整性鉴别也是必需的。本文介绍一种私钥加密技术,不仅能加密英文文本,而且能有效加密汉字,还能进行数据完整性鉴别。本加解密原理图如下:



密文文=HASH(DateTime)+HASH(DateTime+Key)
+HASH(Text)+Encryption(Text,HASH(DateTime)
+HASH(DateTime+Key)+HASH(Text))

---- (2) 解密部分:


二. VB具体实现技术

---- 1. 基本加解密函数(XOR):

---- 在VB中提供了一个XOR函数,它既可对字符,也可对数字、布尔变量进行异或,两次异或的结果即为原值。因此,它是基本加解密函数。

---- 例如:Ascw("息")XOR 28值为24943,24943 XOR 28 值为24687,Chrw(24687) 值为"息"。

---- 2. 汉字的加密与解密方法

---- 在VB中,字符的处理相当复杂,特别是汉字和英文字符混合处理,其结果更是无法预料。在VB内部,字符全部作为Unicode处理,并且VB支持三种类型的字符集,并提供了相应的字符处理函数。

---- VB支持的三种类型字符集是:

---- ⑴ ANSI:一个字节表示一个字符,汉字被作为两个ANSI字符;

---- ⑵ DBCS:双字节字符集,0~128表示ASCII字符,ASCII字符长度为1个字节,汉字等东亚字符的长度为2个字节,汉字被作为一个DBCS字符;

---- ⑶ Unicode:用两个字节表示每个字符。ISO几乎为每种语言的每个字符和符号在0~65,535(216 -1)范围定义了一个数字,汉字被作为一个Unicode字符。

---- 在VB6中,字符串的处理函数有ANSI/DBCS版本、二进制版本和Unicode版本。因此,对于汉字的处理相当复杂。

---- 例如:

---- Asc(返回第一个字符的ANSI/DBCS字符代码);

---- AscB(返回第一个字节的值);

---- AscW(返回第一个Unicode字符之代码)。

---- 例如:Asc("息")之值为:-12382,Chr(-12382)之值为:息,AscW("息")之值为:24687,Chrw(24687)之值为:息。

---- 经过反复实验证实,使用Unicode字符集及Unicode字符集函数可较好的加密汉字。

---- 本加解密方案中,汉字和英文字符的加解密均使用下列函数:

AscW( ):返回第一个Unicode字符之代码,每个英文和汉字均作为一个字符,其长度为1;

Mid( ) :取子串,每个英文和汉字均作为一个字符;

ChrW( ) :返回该代码所对应的Unicode字符,字符为英文或汉字;

Len( ) 函数:返回字符串的长度,每个英文字符和汉字字符的长度均为1。
---- 其使用方法请见自定义函数Doxor( )中的语句:
---- Public Sub DoXor(ByRef msFileText as String)

本函数用于对msFileText中的字符串进行XOR 27操作,英文或汉字均作为一个字符来处理,

加密方调用该模块用于加密,解密方调用该模块用于解密。

使用Unicode函数AscW 、ChrW可正确处理所有汉字

使用ASC函数Asc 、Chr无法正确处理所有汉字
Dim intC As Integer
Dim intB As Integer
Dim lngI As Long

下面,用Rnd产生随机序列数,然后根据Int(Rnd * 2 ^ 7)得到一个对应整数,

再用该整数与msFileText中字符XOR.
For lngI = 1 To Len(msFileText)
intC = AscW(Mid(msFileText, lngI, 1))
intB = Int(Rnd * 2 ^ 7)
'选用< =127可正确处理汉字,ChrW(n):n 有一个范围
Mid(msFileText, lngI, 1) = ChrW(intC Xor intB)
Next lngI
End Sub

---- 在对包含有汉字的文本(明文、密文)文件(.txt)进行读、写处理时,也要考虑汉字的问题,主要是长度问题,用不同的语句/函数,读出的结果不一样,有的超出实际长度。具体处理办法是:使用ASCII格式:
---- ①读明文、读密文:

Open FileOldName For Binary As #1
sHead = Input(LOF(1), #1)
Close #1

---- 注意:不能用下述方法,因为它将汉字作为两个字符处理,导致读出的sHead超出实际长度(超出长度=汉字个数):
Open FileOldName For Binary As #1
sHead = Space(LOF(1))
Input #1, sHead
Get #1, , sHead
Close #1

---- ②写密文、写明文
Open FileNewName For Binary As #1
'存为AscwII格式
Put #1, , ET
Close #1

---- 3. 散列函数(HASH函数)
---- 散列函数(也叫哈希函数)是密码学和数学中的一个概念。其作用是能够基于给定的输入字串、文件或其它类型二进制数据产生一个独一无二值。此外,该函数采用的算法能够保证人们不能从它反向推得该值的原始信息。

---- 对于Hash函数,其初始值(种子值)的选择至关重要。为了保证产生和检查散列代码的双方使用相同的初始值,可以选择固定的伪随机初始值。

---- 在VB中提供了一个返回随机数值的函数Rnd( ),以及初始化随机数生成器的Randomize( ):

---- Rnd函数格式:Rnd[(number)]。若number< 0,每次都使用number作为随机数种子得到的相同结果。

[1] [2] [3] 下一页  

文章录入:enadd    责任编辑:enadd 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 用VB编写DirectX7.0游戏(下…

  • 用VB编写DirectX7.0游戏(上…

  • 使用OLE DB和ADO调用返回记录…

  • 使用VB调用Oracle程序包内的…

  • VB中用ADO对象动态创建数据库…

  • fffff

  • 如何用MSComm Control传Bina…

  • MultiLink的WinSock Server程…

  • 用VB制作浏览器

  • 用VB编写网络寻呼机

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |