重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Option Explicit
创新互联-专业网站定制、快速模板网站建设、高性价比应县网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式应县网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖应县地区。费用合理售后完善,十载实体公司更值得信赖。
Private Const strEncryption As String = "aa" 'XOR加密/解密函数
Public Function XOREncryption(ByVal vstrDataIn As String, Optional ByVal vstrCodeKey As String = "") As String
Dim lonDataPtr As Long
Dim intXORValue1 As Integer
Dim intXORValue2 As Integer
Dim strDataOut As String
If Len(vstrCodeKey) 2 Then
vstrCodeKey = strEncryption
End If
Mid(vstrCodeKey, 2, 1) = Chr(1)
For lonDataPtr = 1 To Len(vstrDataIn)
'第一个XOR的值来自加密字符串
intXORValue1 = Asc(Mid$(vstrDataIn, lonDataPtr, 1))
'第二个XOR的值来自需要加密的数据(字符串)
intXORValue2 = Asc(Mid$(vstrCodeKey, ((lonDataPtr Mod Len(vstrCodeKey)) + 1), 1))
'两个值被XOR后成为一个需要被解密的字符
strDataOut = strDataOut + Chr(intXORValue1 Xor intXORValue2)
Next lonDataPtr
'返回被加密/解密后的数据(是一个字符串)
XOREncryption = strDataOut
End Function
Private Sub Command1_Click()
Dim a As String
a = XOREncryption("abc")
Print "加密后字符为:" a
Print "还原字符:" XOREncryption(a)
End Sub
因为VB本身是不存在“二进制数”这么一种数据类型的,你如果直接算 1000001 XOR 01111111,VB会把1000001和01111111按10进制数来看待的,所以结果是2078214!
你应该先把1000001和01111111都转化为10进制数,再来XOR!
补充一下:
VB中16进制数和8进制数有特殊的表示方法,比如:
x = HABCD '这是16进制
x = O3456 '这是8进制,注意后面的是字母O!
但是,变量x中存储的是经过VB转化后的10进制数,因为VB并没有“16进制数”、“8进制数”这样的数据类型,凡是数值类型(Integer、Long、Double、Single等等)全部是10进制的!
而二进制数则连这样的特殊表示方法也没有,
x = 1000
你说这个1000是二进制还是10进制?总不能说由0和1组成的就是二进制吧?要是你老板要发1000元工资给你,却说这是个二进制数,那么你就只能得到8元钱了!
根据你对题目的补充作出的补充回答:
我不知道是哪个脑残的老师出的题目,两个数进行异或运算,运算结果与这两个数的进制是没有半毛钱关系的,比如:
10进制:20 Xor 30 = 10
16进制:H14 Xor H1E = H0A = 10进制的10
看见没有,结果不是都是10吗?所以你说的“必须用二进制进行异或运算”是错误的,除非是你的脑残老师一定要你们这么做。
所以这条题目最简单的解决办法就是把秘钥01111111转为10进制数(即127),然后用它与大写字母的ASCII码进行异或运算,最后把运算结果再转为字符即可。下面是个例子:
s = "ABCDEFGHIJKLM"
Print "加密前的字符串:"; s
t = ""
For i = 1 To Len(s)
t = t Chr(Asc(Mid(s, i, 1)) Xor 127)
Next
Print "加密后的字符串:"; t
如果非得按题目要求转为二进制数再来异或,那就复杂10倍也不止了。首先,要把加密前的字符串逐个取出来,转为ASCII码,再转为二进制数(注意,二进制数要放在一个字符串变量中,因为我前面已经说了,VB中没有专门的二进制数类型的,所以如果放在数值变量中,VB会按10进制数来看待的),然后逐位与01111111进行异或运算(就是依次从上述储存二进制数的字符串变量中取出每一位数与01111111对应的位进行异或运算,如果相同就是0,不同就是1),比如:
01000001
01111111
-------------
00111110
把得出的运算结果再转为10进制数(上面例子中就是62),然后通过这个数再得出加密后的字符。你会发现,经过这么复杂运算得到的字符,跟我上面的代码运算的结果其实是一样的!
1. 简化运算有专门的运算符,AndAlso,OrElse
2.没用过,似乎是位运算,分别为位与,位或,位异或
xor表示双重作用,
textstyle = textstyle Xor FontStyle.Italic
就是说,在原来的基础上实现双重功能结合,比如你原来的字体是 加粗的,在运行这句语句后,就实验了加粗和倾斜的功能了,如果不用xor,实现就很麻烦了
改成:
For i As Integer = 0 To buffer.Length - 1
checksum = checksum Xor Asc(buffer(i))
Next