Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> VBA  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701941
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

RC4、MD5、转16进制字符串结合运用加密字符串

作者:cg1  摘自:access911.net  :cg1  更新日期:2006-12-13  浏览人次:

 

本文解决两个问题:
1、RC4 生成的密文可能是乱码,不便于显示和复制
2、RC4 生成的密文可以随意修改,并且还原后虽然与原始明文不同,但是仍然具有含义

本文是对本站多篇资料的整合运用,您可以参阅文中列出的参考地址。

很多网友对本站的 URL 链接很感兴趣。问我
http://access911.net/index.asp?u1=a&u2=72FABE1E15DCEDF3
中 u2 后面的字符串是怎么生成的,有什么作用?
72FABE1E15DCEDF3 其实是对 12356 这个记录 ID 加密的结果,这样可以让对方无法直接从 123456 猜测并尝试 234567 的记录 ID。
细心的网友也许还记得,2001年前本站 URL 地址时直接用 1234 作为记录ID 的,但2001年以后上述字符串加密方式在本站已经开始使用了,我也在多篇文章中介绍过,比如:

    4 种常用加密算法-2-RC4《VBA》
    http://access911.net/index.asp?u1=a&u2=73FAB51E13DC

    4 种常用加密算法-3-md5《VBA》
    http://access911.net/index.asp?u1=a&u2=73FAB51E12DC


实例下载:
http://access911.net/down/eg/eg_911_rc4_md5.rar
 (48KB)

RC4 所生成的多数在 GB 码下是乱码,所以不能直接用来在网页中标识记录ID,所以我对其进行了16进制编码,这点在本站的文章中也已经介绍过了

    新手来看:如何进行二进制到六十二进制向十进制的转换?《函数》
    http://access911.net/index.asp?u1=a&u2=71FAB61E13DCE8F3

以下是比较专用的16进制转换代码:
'===========================================================
' 过程及函数名:  StrToHex
' 版本号      :  1.0
' 说明        :  本函数作用:将普通字符串编码为16进制字符串
' 引用        :  --
' 输入参数    :  Words 文本,需编码的字符串
' 输出值      :  --
' 返回值      :  String 文本,编码后的16进制字符串
'                 出错时返回 "" (零长度字符串)
' 调用演示    :  StrToHex "哈哈哈"
'                 (或请直接看 test 过程。)
' 最后修改日期:  2006-12-13 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEDF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Public Function StrToHex(ByVal Words As String) As String
'本函数在不改动 RC4 编码的基础上,对 RC4 的结果进行再编码
'因此在效率上比将本编码直接加入 RC4 函数的方式稍慢

    Dim i As Long
    Dim strResult As String
 On Error GoTo StrToHex_Err
    
    For i = 1 To LenB(Words)
        strResult = strResult & Right("00" & CStr(Hex(AscB(MidB(Words, i, 1)))), 2)
    Next
    
    StrToHex = LCase(strResult)
    
    
    
    Exit Function
StrToHex_Err:
    '出错时直接返回零长度字符串
    Debug.Print Err.Number & Err.Description
    StrToHex = ""
    
End Function

'===========================================================
' 过程及函数名:  HexToStr
' 版本号      :  1.0
' 说明        :  本函数作用:将16进制字符串解码为普通字符串
' 引用        :  --
' 输入参数    :  Words 文本,需解码的字符串
' 输出值      :  --
' 返回值      :  String 文本,解码后的普通文本
'                 出错时返回 "" (零长度字符串)
' 调用演示    :  HexToStr "312d7a41fcf4b8803d991d929d25d1c8e249e562153efe1dc65b"
'                 (或请直接看 test 过程。)
' 最后修改日期:  2006-12-13 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEDF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Public Function HexToStr(ByVal Words As String) As String
'本函数在不改动 RC4 编码的基础上,对 RC4 的结果进行再编码
'因此在效率上比将本编码直接加入 RC4 函数的方式稍慢

    Dim i As Long
    Dim strResult As String
On Error GoTo HexToStr_Err
    
    For i = 1 To Len(Words) Step 2
        strResult = strResult & ChrB(CLng("&H" & Mid(Words, i, 2)))
    Next
    
    HexToStr = strResult
    
    
    Exit Function
HexToStr_Err:
    '出错时直接返回零长度字符串
    Debug.Print Err.Number & Err.Description
    HexToStr = ""
    
End Function


在编码后我们又遇到直接修改 16 值字符串的其中某几位仍然能够用 RC4 正常解码,这样还是能够通过猜测得到记录 ID号,于是就又用 MD5 对其进行了校验,代码如下:


'===========================================================
' 过程及函数名:  StrEncode
' 版本号      :  1.0
' 说明        :  本函数作用:对明文用 RC4 加密加入MD5校验码并
'                 转换为16进制字符串
' 引用        :  --
' 输入参数    :  SourceWords 文本,需加密的明文
'                 KeyWords 文本,密码
'                 CheckCodeLength 长整,校验码位数
' 输出值      :  --
' 返回值      :  Variant 型,16进制字符串,编码后的密文,
'                 出错时返回 Null 值
' 调用演示    :  StrEncode "a","b",3
'                 (或请直接看 test 过程。)
' 最后修改日期:  2006-12-13 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEDF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Public Function StrEncode(ByVal SourceWords As String, _
                        ByVal KeyWords As String, _
                        Optional CheckCodeLength As Long) As Variant
    Dim strResult As String
    Dim strMD5 As String
    Dim strCheckCode1 As String
    Dim strCheckCode2 As String
    
On Error GoTo StrEncode_Err
    Dim m As New clsMD5
    
    strMD5 = m.md5(SourceWords)
    If CheckCodeLength > Len(strMD5) Or _
        CheckCodeLength <= 0 Then
        CheckCodeLength = 3
    End If
    strCheckCode1 = Left(strMD5, CheckCodeLength)
    strCheckCode2 = Right(strMD5, Len(strMD5) - CheckCodeLength)
    
    
    strResult = StrToHex(RC4(SourceWords, KeyWords))
    strResult = strCheckCode1 & strResult & strCheckCode2


    StrEncode = strResult
    
    
    Exit Function
StrEncode_Err:
    Debug.Print Err.Number, Err.Description
    StrEncode = Null
End Function


'===========================================================
' 过程及函数名:  StrDecode
' 版本号      :  1.0
' 说明        :  本函数作用:对带有MD5校验码的密文用 RC4 解密
' 引用        :  --
' 输入参数    :  SourceWords 文本,需解密的密文
'                 KeyWords 文本,密码
'                 CheckCodeLength 长整,校验码位数
' 输出值      :  --
' 返回值      :  Variant 型,16进制字符串,解码后的明文,
'                 出错时返回 Null 值
' 调用演示    :  StrDecode "312d7a41fcf4b8803d991d929d25d1c8e249e562153efe1dc65b","b",3
'                 (或请直接看 test 过程。)
' 最后修改日期:  2006-12-13 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEDF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Public Function StrDecode(ByVal SourceWords As String, _
                        ByVal KeyWords As String, _
                        Optional CheckCodeLength As Long) As Variant
    Dim strResult As String
    Dim strMD5 As String
    Dim strCheckCode1 As String
    Dim strCheckCode2 As String
On Error GoTo StrDecode_Err
    Dim m As New clsMD5
    
    '注意,以下代码只是为了得到头校验码和尾校验码的长度,没有其他具体作用
    '很多网友将 MD5 的输出值截短,所以这里要加一段生成MD5码的代码

    strMD5 = m.md5("http://access911.net")
    If CheckCodeLength > Len(strMD5) Or _
        CheckCodeLength <= 0 Then
        CheckCodeLength = 3
    End If
    strCheckCode1 = Left(SourceWords, CheckCodeLength)
    strCheckCode2 = Right(SourceWords, Len(strMD5) - CheckCodeLength)
    '上述 strCheckCode1 和 strCheckCode2 中的具体值没有作用,但其长度有作用
        
    '先取出16进制的 RC4 密文

    strResult = Mid(SourceWords, _
                    Len(strCheckCode1) + 1, _
                    Len(SourceWords) - Len(strCheckCode1) - Len(strCheckCode2))
    strResult = HexToStr(strResult)             '再转换为普通文本的 RC4 密文
    strResult = RC4(strResult, KeyWords)        '对 R4 密文解密
        
    '真正获取校验码的代码在这里
    strMD5 = m.md5(strResult)
    strCheckCode1 = Left(SourceWords, CheckCodeLength)
    strCheckCode2 = Right(SourceWords, Len(strMD5) - CheckCodeLength)
    
    
    
    
    '用 MD5 校验码校验刚才解密的 RC4 明文,核对是否正确
    If Left(strMD5, Len(strCheckCode1)) = strCheckCode1 _
        And Right(strMD5, Len(strCheckCode2)) = strCheckCode2 Then
        StrDecode = strResult
    Else
        StrDecode = Null
    End If
    
    
   
    
    
    
    Exit Function
StrDecode_Err:
    Debug.Print Err.Number, Err.Description
    StrDecode = Null
    
    
End Function



RC4 、MD5加密方式本站也有过文章介绍,请自行参考

    4 种常用加密算法-2-RC4《VBA》
    http://access911.net/index.asp?u1=a&u2=73FAB51E13DC

    4 种常用加密算法-3-md5《VBA》
    http://access911.net/index.asp?u1=a&u2=73FAB51E12DC


具体调用及演示代码如下:
'===========================================================
' 过程及函数名:  test
' 版本号      :  --
' 说明        :  演示
' 引用        :  --
' 输入参数    :  --
' 输出值      :  --
' 返回值      :  --
' 调用演示    :  --
' 最后修改日期:  2006-12-13 16:22:00
' 示例地址    :  http://access911.net/?kbid;72FABE1E15DCEDF3
' 作者        :  cg1
' 网站        :  http://access911.net
' 电子邮件    :  access911@gmail.com
' 版权        :  作者保留一切权力,
'                 请在公布本代码时将本段说明一起公布,谢谢!
'===========================================================

Function test()
'请将鼠标停留在这里,并按 F5 键运行演示代码
'结果将打印在“立即窗口”,按 CTRL + G 可以打开或者关闭立即窗口

    Dim strPassWord As String
    strPassWord = "sdfasd"
    
    
    Debug.Print "RC4 直接加密                                                ", _
                    RC4("数据!@@##@", strPassWord)
    Debug.Print "RC4 直接解密                                                ", _
                    RC4(RC4("数据!@@##@", strPassWord), strPassWord)
    Debug.Print "RC4 直接加密后转16进制                                      ", _
                    StrToHex(RC4("数据!@@##@", strPassWord))
    Debug.Print "RC4 从16进制转回后解密                                      ", _
                    RC4(HexToStr("6c1f1e9fe0b8f53deb1d8ebb7d37aa9c"), strPassWord)
    
    Debug.Print "RC4 直接加密数字后转16进制                                  ", _
                    StrToHex(RC4("11552", strPassWord))
    Debug.Print "RC4 直接加密数字后转16进制 发现更改某位密文仍然能够正常解密 ", _
                    RC4(HexToStr("2d7a41fcf4b8803d99"), strPassWord)
    Debug.Print "RC4 加密后加 MD5 校验位                                     ", _
                    StrEncode("11552", strPassWord, 2)
    Debug.Print "RC4 解密经过 MD5 校验的密文                                 ", _
                    StrDecode("312d7a41fcf4b8803d991d929d25d1c8e249e562153efe1dc65b", strPassWord, 2)
    Debug.Print "RC4 解密经过 MD5 校验的密文,但用户删除了几位(无法解密)   ", _
                    StrDecode("312d7a41fcf4b8803d991d929d25d1c8e249e562153efe1dc6", strPassWord, 2)
    
End Function



本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     关于 ACCESS 加密及密码破解问题的理解(再论)
     关于 ACCESS 加密及密码破解问题的理解
     使用TransferDatabase导入外部加密的数据库文件时,怎样自动输入密码?不用ODBC数据
     Access安全吗?Access安全性之QA详解
     如何加密Access数据库?
     4 种常用加密算法-6-rsa
     4 种常用加密算法-4-BASE64
     4 种常用加密算法-3-md5
     4 种常用加密算法-2-RC4
     4 种常用加密算法-1-CFS
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利