郁闷天天有,今天特别多。。。望牛人来解惑~

fankun 2007-04-25 10:59:43
对字符串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
...全文
262 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2007-04-25
  • 打赏
  • 举报
回复
StrConv一下?
fankun 2007-04-25
  • 打赏
  • 举报
回复
在另外一帖有个兄弟的回复提醒了我。。
byte是0-255的单精度型,而string*1是0-255的整型。。

byte转成string*1会造成byte精度的丢失,这个就可能是为什么文件会部分损坏的原因了。。。
顿悟。。
谢谢各位兄弟。
sss2002 2007-04-25
  • 打赏
  • 举报
回复
显然,要 XOR、AND 类型的运算,应该用 BYTE ,而不是 STRING

rainstormmaster 2007-04-25
  • 打赏
  • 举报
回复
//到底丢失了哪一部分内容

不是string的部分,在强制转换成string后,全部丢失了
fankun 2007-04-25
  • 打赏
  • 举报
回复
老大,我用string*1和byte复制文件的时候没有加密啊,为什么只丢失一部分内容啊。。好郁闷哈。。txt会正常显示,jpg会导致变形,而exe就完全不能用了,,到底丢失了哪一部分内容,为什么会造成这部分内容的丢失呢。。??
string*1和byte有何不同。

师傅!拜谢了!!!
rainstormmaster 2007-04-25
  • 打赏
  • 举报
回复
//即使默认数组是用variant的4个字节来存贮元素的,为什么加密文件大小会多出4个字节。

不知你的结论从何而来?我测试的结果是无论是中文还是英文,加密文件的大小就是字串的长度*4,我的系统xp sp2,vb6 sp6.

//还有一个问题,,,filelen(file)和lof(file)文件大小里面包含了文件头信息吗。。。?

包含,指的就是文件的整个大小

//为什么我用byte复制的时候,能够把文件无损(这个里面肯定是包含了文件格式信息的)的全部复制过去。。string*1就会损坏呢??

//为什么我用byte复制的时候,能够把文件无损(这个里面肯定是包含了文件格式信息的)的全部复制过去。。string*1就会损坏呢??

算法的问题,加密后文件内容不再是纯文本,所以定义为string强制转换后会丢失内容

fankun 2007-04-25
  • 打赏
  • 举报
回复
用string*1复制文件也不是全部损坏,有些文件,比如文本txt就全部可读,而jpg只是导致图片变形。。郁闷。。。vb中string和byte到底在机制上有何不同。。
fankun 2007-04-25
  • 打赏
  • 举报
回复
先不管程序写得怎么样,
我的问题的是,即使默认数组是用variant的4个字节来存贮元素的,为什么加密文件大小会多出4个字节。
解密的时候,为什么中文的可以,E文的不行。。就这个程序而言哈。。
而且解密文件,如果全中文,为什么会多出17个字节,每次都这样的。。。郁闷。。
我在另外的帖子里比较了string*1 和byte复制文件的效果,,大小都是一样的,string*1会导致文件大小不变,而文件部分(特别是跟文件格式有关的)数据损坏,为什么??
还有一个问题,,,filelen(file)和lof(file)文件大小里面包含了文件头信息吗。。。?
为什么我用byte复制的时候,能够把文件无损(这个里面肯定是包含了文件格式信息的)的全部复制过去。。string*1就会损坏呢??
ZOU_SEAFARER 2007-04-25
  • 打赏
  • 举报
回复
所以建议txts = Text1.Text '这里把汉字等字符都转为BYTE,这样不管怎么疑惑都不会超过256
k = Len(txts)


arr(i) = Asc(arr(i)) Xor 256 要是存在汉字就够了,!!
呵呵,汉字的ASCiI就不是0 - 255 了哦!
rainstormmaster 2007-04-25
  • 打赏
  • 举报
回复
另外,程序中是和256进行xor运算,导致了加密后文件大小的异常,建议和byte类型的数进行xor运算
rainstormmaster 2007-04-25
  • 打赏
  • 举报
回复
正确的做法是:
先用StrConv将字串转为byte数组,然后xor,最后写入文件
rainstormmaster 2007-04-25
  • 打赏
  • 举报
回复
你从哪里找来的代码?

这样的代码没法看,算法部分先不说,ReDim arr(1)这样的用法尤其笨拙,事实上用
Erase arr即可释放数组占用的资源

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧