设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3180|回复: 5
打印 上一主题 下一主题

[加解密/安全] 从位运算和进制转换谈起

[复制链接]
跳转到指定楼层
1#
发表于 2015-11-27 16:42:20 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 roych 于 2015-11-27 17:25 编辑

       一个叫白菜的网友私信我说如何转换二进制,我猜,他大体是想写加解密的模块吧。      
       说到加解密,不得不提底层运算,也就是我们常说的位运算。事实上,不管哪种加解密算法,最后都要涉及到位运算,进制转换。不同的加密方式只是在执行位运算和进制转换时使用的算法不同罢了。先贴一个鼎鼎有名的MD5加密运算【不可逆算法,即不可以被解密】:PS:别跟我说山东大学那个数学系女老师的事情,那个不叫解密,因为没有算法】:

       我们找到这一句:
       LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
       ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits))得到的应该是一个值,&H80000000
        当然也是一个十六进制的值了。就好比“你的年龄=18 Or 81”。是不是说,你的年龄要么是18岁,要么是81岁?当然不是了。先回顾下,我们常用的Or是不是这样写的:
       你的年龄=18 Or 你的年龄=81
       似乎多了点东西,对不对?是的。所以说,这就不是我们常用的逻辑运算,而是位运算了。提到位运算,就不得不说计算机的二进制跟逻辑电路。不过这里我不想掉书袋,有兴趣的版友可以自行查看这里
       1 And 1=1,1 And 0=0,0 And 0=0
       1 Or 1=1,1 Or 0=1,0 Or 0=0
       1 XOr 1=0,1 XOr 0=1,0 XOr 0=0
       理解这一点之后,我们可以来看看上面的问题了:
       你的年龄=18 Or 81
       我们知道,不管上面情况,计算机都是用二进制来存储数据的。因此,18和81(这里先假定为十进制数字)都会转为二进制数据,于是,18得到一个二进制:
        10010
        81得到一个二进制:
        1010001
       位数不一样,怎么Or?前面补零。
      00010010
      01010001
     根据上面的算法,很容易算出来:01010011,然后再转为10进制:=2^6+2^4+2^1+2^0=83。于是 18 Or 81得到的值是83,大家可以试试:
      Sub test()
                  Debug.Print 18 Or 81
      End Sub

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

6#
发表于 2015-11-30 11:32:13 | 只看该作者
先搬个板凳!
5#
发表于 2015-11-28 12:49:19 | 只看该作者
过来学习了、谢谢!
4#
发表于 2015-11-28 09:28:32 | 只看该作者
学习下
回复

使用道具 举报

3#
 楼主| 发表于 2015-11-27 17:24:25 | 只看该作者
本帖最后由 roych 于 2015-11-27 17:30 编辑

忘了占楼了{:soso_e117:}
接下来,把帮白菜写的代码贴上来了:
  1. '十进制转二进制
  2. Function D2B(ByVal Dec As Long) As String
  3.     '临时变量
  4.     Dim s As String
  5.    
  6.      Do While Dec > 0
  7.          s = Dec Mod 2 & s
  8.          Dec = Dec \ 2
  9.      Loop
  10.      D2B = s
  11. End Function
  12. '二进制转十进制
  13. Function B2D(ByVal Bstr As String) As Long
  14.     Dim i As Long
  15.     Dim l As Long
  16.         For i = 1 To Len(Bstr)
  17.             l = l + Mid(Bstr, i, 1) * (2 ^ (Len(Bstr) - i))
  18.         Next
  19.     B2D = l
  20. End Function
  21. '加密
  22. Function Encode(ByVal strCode As String)
  23.     Dim str
  24.     Dim i As Long
  25.     str = Split(strCode, "-")
  26.     For i = 0 To UBound(str)
  27.         str(i) = D2B(str(i))
  28.     Next
  29.     Encode = Join(str, "-")
  30. End Function
  31. '解密
  32. Function Decode(ByVal strCode As String)
  33.         Dim str
  34.     Dim i As Long
  35.     str = Split(strCode, "-")
  36.     For i = 0 To UBound(str)
  37.         str(i) = B2D(str(i))
  38.     Next
  39.     Decode = Join(str, "-")
  40. End Function
复制代码
主要是他的代码都是“数字-数字”格式的字符串,需要进行加密和解密。当时他的算法是打算一个个数字替换,我建议不必这么麻烦,不妨分割完字符串之后,直接转二进制再连接起来,于是就写了上面这个简单点的加解密算法,可能还算不上算法吧。不过可以给初学者参考下。
另外,这里没有加入错误处理语句,需要确保输入的是正确的十进制或者二进制数字。这里只是针对数字,事实上,如果需要针对任意字符串的话,可以用ASCII编码来处理,不过这就比较复杂了,各种加密算法都会有类似于这些的转码的写法。


2#
发表于 2015-11-27 16:58:34 | 只看该作者
完了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 04:41 , Processed in 0.089887 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表