郁闷天天有,今天特别多。。。望牛人来解惑~
对字符串xor加密的几点疑惑。。详细问题见程序注释Option Explicit
Option Base 1
Private Sub set_Click()
Dim arr()
Dim i As Long, k As Long
Dim ss As String, txts As String
If Len(Text1.Text) = 0 Then Exit Sub ' 检测文本框
ss = "d:\arr.txt " '加密字符存放的文件
If Dir(ss) <> " " Then Kill ss '如果加密文件存在就删除
txts = Text1.Text
k = Len(txts)
For i = 1 To k
ReDim Preserve arr(i)
arr(i) = Mid$(txts, i, 1)
arr(i) = Asc(arr(i)) Xor 256 '取出字符串,进行简单的异或
Next
Open ss For Binary As #1
Put #1, , arr() '把加密后的字符串写入文件????《1》为什么:加密文件大小= (字符串大小)x4+4
Close #1
MsgBox " yes! "
ReDim arr(1)
End Sub
Private Sub get_Click()
Dim arr(), brr()
Dim i As Long, k As Long
Dim ss As String, sss As String
ss = "d:\brr.txt "
sss = "d:\arr.txt "
If Dir(sss) = " " Then Exit Sub
If Dir(ss) <> " " Then Kill ss
k = FileLen( "d:\arr.txt ")
Open sss For Binary As #2
ReDim Preserve arr(k)
Get #2, , arr() '取出文件中的数据
Close #2
For i = 1 To UBound(arr)
ReDim Preserve brr(i)
arr(i) = arr(i) Xor 256 '对数据解密
brr(i) = Chr(arr(i)) '转换为字符
Next
Open ss For Binary As #3 '《2》中文的字符都能解密,但是E文有些反而不能,为什么???
Put #3, , brr() ' 如果加密为全中文,解密文件大小=加密文件x5+17字节
Close #3 '《3》如果加密为全英文,解密文件大小=加密文件x5 ????这又是为什么?
MsgBox "yes! "
ReDim arr(1): ReDim brr(1)
End Sub
[解决办法]
StrConv一下?
[解决办法]
你从哪里找来的代码?
这样的代码没法看,算法部分先不说,ReDim arr(1)这样的用法尤其笨拙,事实上用
Erase arr即可释放数组占用的资源
[解决办法]
正确的做法是:
先用StrConv将字串转为byte数组,然后xor,最后写入文件
[解决办法]
所以建议txts = Text1.Text '这里把汉字等字符都转为BYTE,这样不管怎么疑惑都不会超过256
k = Len(txts)
arr(i) = Asc(arr(i)) Xor 256 要是存在汉字就够了,!!
呵呵,汉字的ASCiI就不是0 - 255 了哦!
[解决办法]
//即使默认数组是用variant的4个字节来存贮元素的,为什么加密文件大小会多出4个字节。
不知你的结论从何而来?我测试的结果是无论是中文还是英文,加密文件的大小就是字串的长度*4,我的系统xp sp2,vb6 sp6.
//还有一个问题,,,filelen(file)和lof(file)文件大小里面包含了文件头信息吗。。。?
包含,指的就是文件的整个大小
//为什么我用byte复制的时候,能够把文件无损(这个里面肯定是包含了文件格式信息的)的全部复制过去。。string*1就会损坏呢??
//为什么我用byte复制的时候,能够把文件无损(这个里面肯定是包含了文件格式信息的)的全部复制过去。。string*1就会损坏呢??
算法的问题,加密后文件内容不再是纯文本,所以定义为string强制转换后会丢失内容
[解决办法]
//到底丢失了哪一部分内容
不是string的部分,在强制转换成string后,全部丢失了
[解决办法]
显然,要 XOR、AND 类型的运算,应该用 BYTE ,而不是 STRING