CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  非技术类

VB中实现BASE64加密

楼主anyf(任何风)2005-02-04 21:15:53 在 VB / 非技术类 提问

以下是网上关于在VBscript中的一种BASE64的加密代码,过程是将将Unicode编码的字符串,转换成Ansi编码的字符串  
  再以BASE64加密,解密时再以BASE64解密再以Ansi编码转换回Unicode还原成原来的文本,如何将以下此代码  
  修改成适合在VB中调用的加密方式,试来试去都不成功,请大家指点.  
   
  sBASE_64_CHARACTERS   =   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"    
  sBASE_64_CHARACTERS   =   strUnicode2Ansi(sBASE_64_CHARACTERS)  
   
  Function   strUnicodeLen(asContents)  
  '计算unicode字符串的Ansi编码的长度  
  asContents1="a"&asContents  
  len1=len(asContents1)  
  k=0  
  for   i=1   to   len1  
  asc1=asc(mid(asContents1,i,1))  
  if   asc1<0   then   asc1=65536+asc1  
  if   asc1>255   then  
  k=k+2  
  else  
  k=k+1  
  end   if  
  next  
  strUnicodeLen=k-1  
  End   Function  
   
  Function   strUnicode2Ansi(asContents)  
  '将Unicode编码的字符串,转换成Ansi编码的字符串  
  strUnicode2Ansi=""  
  len1=len(asContents)  
  for   i=1   to   len1  
  varchar=mid(asContents,i,1)  
  varasc=asc(varchar)  
  if   varasc<0   then   varasc=varasc+65536  
  if   varasc>255   then  
  varHex=Hex(varasc)  
  varlow=left(varHex,2)  
  varhigh=right(varHex,2)  
  strUnicode2Ansi=strUnicode2Ansi   &   chrb("&H"   &   varlow   )   &   chrb("&H"   &   varhigh   )  
  else  
  strUnicode2Ansi=strUnicode2Ansi   &   chrb(varasc)  
  end   if  
  next  
  End   function  
   
  Function   strAnsi2Unicode(asContents)  
  '将Ansi编码的字符串,转换成Unicode编码的字符串  
  strAnsi2Unicode   =   ""  
  len1=lenb(asContents)  
  if   len1=0   then   exit   function  
  for   i=1   to   len1  
  varchar=midb(asContents,i,1)  
  varasc=ascb(varchar)  
  if   varasc   >   127   then    
  strAnsi2Unicode   =   strAnsi2Unicode   &   chr(ascw(midb(asContents,i+1,1)   &   varchar))  
  i=i+1  
  else  
  strAnsi2Unicode   =   strAnsi2Unicode   &   chr(varasc)  
  end   if  
  next  
  End   function  
   
  Function   Base64encode(asContents)    
  '将Ansi编码的字符串进行Base64编码  
  'asContents应当是ANSI编码的字符串(二进制的字符串也可以)  
  Dim   lnPosition    
  Dim   lsResult    
  Dim   Char1    
  Dim   Char2    
  Dim   Char3    
  Dim   Char4    
  Dim   Byte1    
  Dim   Byte2    
  Dim   Byte3    
  Dim   SaveBits1    
  Dim   SaveBits2    
  Dim   lsGroupBinary    
  Dim   lsGroup64    
  Dim   m4,len1,len2  
   
  len1=Lenb(asContents)  
  if   len1<1   then    
  Base64encode=""  
  exit   Function  
  end   if  
   
  m3=Len1   Mod   3    
  If   M3   >   0   Then   asContents   =   asContents   &   String(3-M3,   chrb(0))    
  '补足位数是为了便于计算  
   
  IF   m3   >   0   THEN    
  len1=len1+(3-m3)  
  len2=len1-3  
  else  
  len2=len1  
  end   if  
   
  lsResult   =   ""    
   
  For   lnPosition   =   1   To   len2   Step   3    
  lsGroup64   =   ""    
  lsGroupBinary   =   Midb(asContents,   lnPosition,   3)    
   
  Byte1   =   Ascb(Midb(lsGroupBinary,   1,   1)):   SaveBits1   =   Byte1   And   3    
  Byte2   =   Ascb(Midb(lsGroupBinary,   2,   1)):   SaveBits2   =   Byte2   And   15    
  Byte3   =   Ascb(Midb(lsGroupBinary,   3,   1))    
   
  Char1   =   Midb(sBASE_64_CHARACTERS,   ((Byte1   And   252)   \   4)   +   1,   1)    
  Char2   =   Midb(sBASE_64_CHARACTERS,   (((Byte2   And   240)   \   16)   Or   (SaveBits1   *   16)   And   &HFF)   +   1,   1)    
  Char3   =   Midb(sBASE_64_CHARACTERS,   (((Byte3   And   192)   \   64)   Or   (SaveBits2   *   4)   And   &HFF)   +   1,   1)    
  Char4   =   Midb(sBASE_64_CHARACTERS,   (Byte3   And   63)   +   1,   1)    
  lsGroup64   =   Char1   &   Char2   &   Char3   &   Char4    
   
  lsResult   =   lsResult   &   lsGroup64    
  Next    
   
  '处理最后剩余的几个字符  
  if   M3   >   0   then  
  lsGroup64   =   ""    
  lsGroupBinary   =   Midb(asContents,   len2+1,   3)    
   
  Byte1   =   Ascb(Midb(lsGroupBinary,   1,   1)):   SaveBits1   =   Byte1   And   3    
  Byte2   =   Ascb(Midb(lsGroupBinary,   2,   1)):   SaveBits2   =   Byte2   And   15    
  Byte3   =   Ascb(Midb(lsGroupBinary,   3,   1))    
   
  Char1   =   Midb(sBASE_64_CHARACTERS,   ((Byte1   And   252)   \   4)   +   1,   1)    
  Char2   =   Midb(sBASE_64_CHARACTERS,   (((Byte2   And   240)   \   16)   Or   (SaveBits1   *   16)   And   &HFF)   +   1,   1)    
  Char3   =   Midb(sBASE_64_CHARACTERS,   (((Byte3   And   192)   \   64)   Or   (SaveBits2   *   4)   And   &HFF)   +   1,   1)    
   
  if   M3=1   then  
  lsGroup64   =   Char1   &   Char2   &   ChrB(61)   &   ChrB(61)   '用=号补足位数  
  else  
  lsGroup64   =   Char1   &   Char2   &   Char3   &   ChrB(61)   '用=号补足位数  
  end   if  
   
  lsResult   =   lsResult   &   lsGroup64    
  end   if  
   
  Base64encode   =   lsResult    
   
  End   Function    
   
   
  Function   Base64decode(asContents)    
  '将Base64编码字符串转换成Ansi编码的字符串  
  'asContents应当也是ANSI编码的字符串(二进制的字符串也可以)  
  Dim   lsResult    
  Dim   lnPosition    
  Dim   lsGroup64,   lsGroupBinary    
  Dim   Char1,   Char2,   Char3,   Char4    
  Dim   Byte1,   Byte2,   Byte3    
  Dim   M4,len1,len2  
   
  len1=   Lenb(asContents)    
  M4   =   len1   Mod   4  
   
  if   len1   <   1   or   M4   >   0   then  
  '字符串长度应当是4的倍数  
  Base64decode   =   ""    
  exit   Function    
  end   if  
   
  '判断最后一位是不是   =   号  
  '判断倒数第二位是不是   =   号  
  '这里m4表示最后剩余的需要单独处理的字符个数  
  if   midb(asContents,   len1,   1)   =   chrb(61)   then   m4=3    
  if   midb(asContents,   len1-1,   1)   =   chrb(61)   then   m4=2  
   
  if   m4   =   0   then  
  len2=len1  
  else  
  len2=len1-4  
  end   if  
   
  For   lnPosition   =   1   To   Len2   Step   4    
  lsGroupBinary   =   ""    
  lsGroup64   =   Midb(asContents,   lnPosition,   4)    
  Char1   =   InStrb(sBASE_64_CHARACTERS,   Midb(lsGroup64,   1,   1))   -   1    
  Char2   =   InStrb(sBASE_64_CHARACTERS,   Midb(lsGroup64,   2,   1))   -   1    
  Char3   =   InStrb(sBASE_64_CHARACTERS,   Midb(lsGroup64,   3,   1))   -   1    
  Char4   =   InStrb(sBASE_64_CHARACTERS,   Midb(lsGroup64,   4,   1))   -   1    
  Byte1   =   Chrb(((Char2   And   48)   \   16)   Or   (Char1   *   4)   And   &HFF)    
  Byte2   =   lsGroupBinary   &   Chrb(((Char3   And   60)   \   4)   Or   (Char2   *   16)   And   &HFF)    
  Byte3   =   Chrb((((Char3   And   3)   *   64)   And   &HFF)   Or   (Char4   And   63))    
  lsGroupBinary   =   Byte1   &   Byte2   &   Byte3    
   
  lsResult   =   lsResult   &   lsGroupBinary    
  Next    
   
  '处理最后剩余的几个字符  
  if   M4   >   0   then    
  lsGroupBinary   =   ""    
  lsGroup64   =   Midb(asContents,   len2+1,   m4)   &   chrB(65)   'chr(65)=A,转换成值为0  
  if   M4=2   then   '补足4位,是为了便于计算    
  lsGroup64   =   lsGroup64   &   chrB(65)    
  end   if  
  Char1   =   InStrb(sBASE_64_CHARACTERS,   Midb(lsGroup64,   1,   1))   -   1    
  Char2   =   InStrb(sBASE_64_CHARACTERS,   Midb(lsGroup64,   2,   1))   -   1    
  Char3   =   InStrb(sBASE_64_CHARACTERS,   Midb(lsGroup64,   3,   1))   -   1    
  Char4   =   InStrb(sBASE_64_CHARACTERS,   Midb(lsGroup64,   4,   1))   -   1    
  Byte1   =   Chrb(((Char2   And   48)   \   16)   Or   (Char1   *   4)   And   &HFF)    
  Byte2   =   lsGroupBinary   &   Chrb(((Char3   And   60)   \   4)   Or   (Char2   *   16)   And   &HFF)    
  Byte3   =   Chrb((((Char3   And   3)   *   64)   And   &HFF)   Or   (Char4   And   63))    
   
  if   M4=2   then  
  lsGroupBinary   =   Byte1  
  elseif   M4=3   then  
  lsGroupBinary   =   Byte1   &   Byte2  
  end   if  
   
  lsResult   =   lsResult   &   lsGroupBinary    
  end   if  
   
  Base64decode   =   lsResult    
   
  End   Function  
  问题点数:20、回复次数:4Top

1 楼thirdapple(.:RNPA:.陨落雕 - 芝兰宝树)回复于 2005-02-04 22:04:59 得分 10

Base64是编码,不是加密……是用64个字符表示文件的一种方法,防止在传送email的时候丢失数据……Top

2 楼sworddx(.:RNPA:. hillin)回复于 2005-02-04 22:17:48 得分 0

同意陨落雕观点。Top

3 楼leekkeek(期待者)回复于 2005-02-05 08:16:19 得分 0

up,学习Top

4 楼_l_(蠢瓜)(每天最多回答2个问题)回复于 2005-02-05 09:21:34 得分 10

TEXT   TO   JPG  
    Base64DecodeFile(App.Path   &   "\11.TXT",   App.Path   &   "\11.jpg")  
   
   
  模块里的  
   
  '----------------------------------------  
  '-   发送邮件代码   jinesc   2004年5月26日整理  
   
  '----------------------------------------  
   
  Option   Explicit  
   
   
   
  '   ConnectToServer(strServer,   wsk,   strSrvPort)  
  '   ConnectToServer   "pop.microsoft.com",   Winsock1,   25  
  '   Normally   leave   out   the   last   arguement   and   let   the   Winsock   control   use  
  '   the   default   port.  
   
   
  '   ExtractArgument(ArgNum,   srchstr,   Delim)  
  '   ExtractArgument(3,   "No   1,   No   2,   No   3",   ",")   Would   return   No   3  
  '   I   did   not   have   time   to   sort   out   the   variable   names   in   this   function,  
  '   so   if   you   can   be   bothered   to,   please   send   it   to   me   at   sam@vbsquare.com  
   
    Function   ExtractArgument(ArgNum   As   Integer,   srchstr   As   String,   Delim   As   String)   As   String  
   
          On   Error   GoTo   Err_ExtractArgument  
           
          Dim   ArgCount   As   Integer  
          Dim   LastPos   As   Integer  
          Dim   Pos   As   Integer  
          Dim   Arg   As   String  
           
          Arg   =   ""  
          LastPos   =   1  
          If   ArgNum   =   1   Then   Arg   =   srchstr  
          Do   While   InStr(srchstr,   Delim)   >   0  
                  Pos   =   InStr(LastPos,   srchstr,   Delim)  
                  If   Pos   =   0   Then  
                          If   ArgCount   =   ArgNum   -   1   Then   Arg   =   Mid(srchstr,   LastPos)  
                          Exit   Do  
                  Else  
                          ArgCount   =   ArgCount   +   1  
                          If   ArgCount   =   ArgNum   Then  
                                  Arg   =   Mid(srchstr,   LastPos,   Pos   -   LastPos)  
                                  Exit   Do  
                          End   If  
                  End   If  
                  LastPos   =   Pos   +   1  
          Loop  
          ExtractArgument   =   Arg  
           
          Exit   Function  
           
  Err_ExtractArgument:  
  '       MsgBox   "Error   "   &   Err   &   ":   "   &   Error  
          Resume   Next  
  End   Function  
   
  '   SendMail(strFrom,   strTo,   strSubject,   strBody,   wsk,   strAttachName,   txtEncodedFile)  
  '   SendMail   "me@mymail.com",   "you@yourmail.com",   "Test   Message",   "Body",   Winsock1,   "myfile.ext",   txtEncodedFile  
  '   If   you   omit   the   last   two   arguements   then   no   file   is   attached  
  '   Before   attaching   a   file,   you   must   first   encode   it   using   the   Base64EncodeFile   function  
   
   
  '   Wait(WaitTime)  
  '   Wait   0.5  
   
  Public   Sub   Wait(WaitTime)  
   
          Dim   StartTime   As   Double  
           
          StartTime   =   Timer  
           
          Do   While   Timer   <   StartTime   +   WaitTime  
                  If   Timer   >   86395   Or   Timer   =   0   Then   Exit   Do  
                  DoEvents  
          Loop  
           
  End   Sub  
   
   
   
   
  Public   Function   Base64EncodeFile(Infile   As   String,   Outfile   As   String)  
  Dim   FnumIn   As   Integer,   FnumOut   As   Integer  
  Dim   mInByte(3)   As   Byte,   mOutByte(4)   As   Byte  
  Dim   myByte   As   Byte  
  Dim   i   As   Integer,   LineLen   As   Integer,   j   As   Integer  
  FnumIn   =   FreeFile()  
  Open   Infile   For   Binary   As   #FnumIn  
  FnumOut   =   FreeFile()  
  Open   Outfile   For   Binary   As   #FnumOut  
  While   Not   EOF(FnumIn)  
          i   =   0  
          Do   While   i   <   3  
          Get   #FnumIn,   ,   myByte  
          If   Not   EOF(FnumIn)   Then  
                  mInByte(i)   =   myByte  
                  i   =   i   +   1  
          Else  
                  Exit   Do  
          End   If  
          Loop  
  Base64EncodeByte   mInByte,   mOutByte,   i  
  For   j   =   0   To   3  
          Put   #FnumOut,   ,   mOutByte(j)  
  Next   j  
  LineLen   =   LineLen   +   1  
  If   LineLen   *   4   >   70   Then  
          Put   #FnumOut,   ,   vbCrLf  
          LineLen   =   0  
  End   If  
  Wend  
  Close   FnumOut  
  Close   FnumIn  
   
  End   Function  
   
   
    Sub   Base64EncodeByte(mInByte()   As   Byte,   mOutByte()   As   Byte,   Num   As   Integer)  
  Dim   tByte   As   Byte  
  Dim   i   As   Integer  
   
  If   Num   =   1   Then  
          mInByte(1)   =   0  
          mOutByte(2)   =   0  
  ElseIf   Num   =   2   Then  
          mInByte(2)   =   0  
  End   If  
           
  tByte   =   mInByte(0)   And   &HFC  
  mOutByte(0)   =   tByte   /   4  
  tByte   =   ((mInByte(0)   And   &H3)   *   16)   +   (mInByte(1)   And   &HF0)   /   16  
  mOutByte(1)   =   tByte  
  tByte   =   ((mInByte(1)   And   &HF)   *   4)   +   ((mInByte(2)   And   &HC0)   /   64)  
  mOutByte(2)   =   tByte  
  tByte   =   (mInByte(2)   And   &H3F)  
  mOutByte(3)   =   tByte  
   
  For   i   =   0   To   3  
          If   mOutByte(i)   >=   0   And   mOutByte(i)   <=   25   Then  
                  mOutByte(i)   =   mOutByte(i)   +   Asc("A")  
          ElseIf   mOutByte(i)   >=   26   And   mOutByte(i)   <=   51   Then  
                  mOutByte(i)   =   mOutByte(i)   -   26   +   Asc("a")  
          ElseIf   mOutByte(i)   >=   52   And   mOutByte(i)   <=   61   Then  
                  mOutByte(i)   =   mOutByte(i)   -   52   +   Asc("0")  
          ElseIf   mOutByte(i)   =   62   Then  
                  mOutByte(i)   =   Asc("+")  
          Else  
                  mOutByte(i)   =   Asc("/")  
          End   If  
  Next   i  
   
  If   Num   =   1   Then  
          mOutByte(2)   =   Asc("=")  
          mOutByte(3)   =   Asc("=")  
  ElseIf   Num   =   2   Then  
          mOutByte(3)   =   Asc("=")  
  End   If  
   
  End   Sub  
   
  Public   Sub   Base64DecodeByte(mInByte()   As   Byte,   mOutByte()   As   Byte,   ByteNum   As   Integer)  
  Dim   tByte   As   Byte  
  Dim   i   As   Integer  
  ByteNum   =   0  
  For   i   =   0   To   3  
          If   mInByte(i)   >=   Asc("A")   And   mInByte(i)   <=   Asc("Z")   Then  
                  mInByte(i)   =   mInByte(i)   -   Asc("A")  
          ElseIf   mInByte(i)   >=   Asc("a")   And   mInByte(i)   <=   Asc("z")   Then  
                  mInByte(i)   =   mInByte(i)   -   Asc("a")   +   26  
          ElseIf   mInByte(i)   >=   Asc("0")   And   mInByte(i)   <=   Asc("9")   Then  
                  mInByte(i)   =   mInByte(i)   -   Asc("0")   +   52  
          ElseIf   mInByte(i)   =   Asc("+")   Then  
                  mInByte(i)   =   62  
          ElseIf   mInByte(i)   =   Asc("/")   Then  
                  mInByte(i)   =   63  
          Else  
                  ByteNum   =   ByteNum   +   1  
                  mInByte(i)   =   0  
          End   If  
    Next   i  
   
  tByte   =   (mInByte(0)   And   &H3F)   *   4   +   (mInByte(1)   And   &H30)   /   16  
  mOutByte(0)   =   tByte  
  tByte   =   (mInByte(1)   And   &HF)   *   16   +   (mInByte(2)   And   &H3C)   /   4  
  mOutByte(1)   =   tByte  
  tByte   =   (mInByte(2)   And   &H3)   *   64   +   (mInByte(3)   And   &H3F)  
  mOutByte(2)   =   tByte  
  End   Sub  
   
  Public   Function   Base64DecodeFile(Infile   As   String,   Outfile   As   String)  
  Dim   FnumIn   As   Integer,   FnumOut   As   Integer  
  Dim   mInByte(4)   As   Byte,   mOutByte(3)   As   Byte  
  Dim   myByte   As   Byte  
  Dim   i   As   Integer,   LineLen   As   Integer,   j   As   Integer  
  Dim   ByteNum   As   Integer  
  FnumIn   =   FreeFile()  
  Open   Infile   For   Binary   As   #FnumIn  
  FnumOut   =   FreeFile()  
  Open   Outfile   For   Binary   As   #FnumOut  
   
  While   Not   EOF(FnumIn)  
          i   =   0  
          Do   While   i   <   4  
          Get   #FnumIn,   ,   myByte  
          If   Not   EOF(FnumIn)   Then  
                  If   myByte   <>   &HA   And   myByte   <>   &HD   Then  
                          mInByte(i)   =   myByte  
                          i   =   i   +   1  
                  End   If  
          Else  
                  Exit   Do  
          End   If  
          Loop  
          Base64DecodeByte   mInByte,   mOutByte,   ByteNum  
           
          For   j   =   0   To   2   -   ByteNum  
                  Put   #FnumOut,   ,   mOutByte(j)  
          Next   j  
  Wend  
  Close   FnumOut  
  Close   FnumIn  
   
  End   Function  
   
   
   
   
  Top

相关问题

  • 找寻DES加密算法在VB中的实现
  • vb加密
  • VB如何实现对文本文件的加密?
  • vb代码加密怎样实现?急急!!(不胜感激)
  • 关于vb实现des加密的问题
  • 在JSP中如何实现MD5加密?
  • 在c#中如何实现MD5加密?
  • 在delphi中怎样实现SHA1加密?
  • 在VB中用MD5加密問題。
  • [求助]:VB实现RSA加密软件设计(模数选择模块,加密模块,解密模块)

关键词

  • 编码
  • 加密
  • ascontents
  • minbyte
  • moutbyte
  • midb
  • lsgroupbinary
  • varasc
  • sbase
  • lsgroup

得分解答快速导航

  • 帖主:anyf
  • thirdapple
  • _l_

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo