Board logo

标题: [问题求助] [已解决]VBS加密解密字符串的问题 [打印本页]

作者: 328612167    时间: 2015-7-14 19:04     标题: [已解决]VBS加密解密字符串的问题

本帖最后由 328612167 于 2015-7-21 11:23 编辑

这是我在网上找的一段加密解密字符串的代码,但有些问题搞不定
问题1:会出错
问题2:终端代码的解密原理是什么
  1. s="1862332/*-+."’这是要加密的字符串
  2. s=ChgStr(s,1):msgbox s,,"加密后"
  3. s=ChgStr(s,0):msgbox s,,"解密后"
  4. Function ChgStr(str,flag)'flag:1为加密,非1为解密
  5.     s1="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/*-+.~!@#$%^&*()_{}|:"<>?=[];',.\"
  6.     s2="SGk7B4arX8UFecwJ9O6y2ihWMNKDp1ZE0gsmlTAQ5HYLjVIzqfuobvCxtPR3nd"
  7.     If Not flag=1 Then t=s1:s1=s2:s2=t
  8.     For i=1 To Len(str)
  9.         before=Mid(str,i,1)
  10.         For j=1 To 62
  11.         after=Replace(before,Mid(s1,j,1),Mid(s2,j,1))
  12.         If Not before=after Then ChgStr=ChgStr&after:Exit For
  13.         Next
  14.     Next
  15. End Function
复制代码

作者: CrLf    时间: 2015-7-14 20:40

这加密算法只是简单地单表置换,而且实现得很不好,最奇葩的是 s2 和 s1 居然还无法一一对应,所以会出错
至于解密,把 s1 和 s2 对换进行逆运算就行了
作者: 328612167    时间: 2015-7-15 12:52

回复 2# CrLf


    我的目的是想加密一段字符串(这个字符串包含所有字符),在运行时又解密,不知怎样做才好
作者: yu2n    时间: 2015-7-15 13:36

回复 3# 328612167

QWERTY密码:加密与解密
http://demon.tw/programming/qwerty-abcdef.html

  1. 'Author: Demon
  2. 'Website: http://demon.tw
  3. 'Date: 2012/2/9
  4. Function FromQwerty(str)
  5.     Dim d, s, t, i, c, r
  6.     s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  7.     t = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
  8.     Set d = CreateObject("Scripting.Dictionary")
  9.     For i = 1 To 52
  10.         d(Mid(t, i, 1)) = Mid(s, i, 1)
  11.     Next
  12.     For i = 1 To Len(str)
  13.         c = Mid(str, i, 1)
  14.         If d.Exists(c) Then
  15.             r = r & d(c)
  16.         Else
  17.             r = r & c
  18.         End If
  19.     Next
  20.     FromQwerty = r
  21. End Function
  22. WScript.Echo FromQwerty("OLSQFR")
  23. 'Author: Demon
  24. 'Website: http://demon.tw
  25. 'Date: 2012/2/9
  26. Function ToQwerty(str)
  27.     Dim d, s, t, i, c, r
  28.     s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  29.     t = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
  30.     Set d = CreateObject("Scripting.Dictionary")
  31.     For i = 1 To 52
  32.         d(Mid(s, i, 1)) = Mid(t, i, 1)
  33.     Next
  34.     For i = 1 To Len(str)
  35.         c = Mid(str, i, 1)
  36.         If d.Exists(c) Then
  37.             r = r & d(c)
  38.         Else
  39.             r = r & c
  40.         End If
  41.     Next
  42.     ToQwerty = r
  43. End Function
  44. WScript.Echo ToQwerty("I LOVE YOU")
复制代码

作者: yu2n    时间: 2015-7-15 14:17

本帖最后由 yu2n 于 2015-7-15 14:39 编辑

重复造个轮子……
  1. '加密
  2. Msgbox Qwerty("ABCDEF", 0)
  3. '解密
  4. Msgbox Qwerty("O SGCT NGX", 1)
  5. 'Qwerty() 如果 QWERTY 对应 ABCDEF 的话,那么其他字母的对应关系就是分别按照键盘顺序和字母顺序排列……
  6. Function Qwerty(ByVal str, ByVal mode)
  7.   Dim sSrc, sDes, sTmp, arrSrc(), arrDes(), arrTmp(), a, b
  8.   sSrc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  9.   sDes = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
  10.   If mode<>0 Then sTmp=sSrc : sSrc=sDes : sDes=sTmp
  11.   ReDim arrSrc(Len(sSrc)) : ReDim arrDes(Len(sSrc)) : ReDim arrTmp(Len(str))
  12.   For a=0 To Len(sSrc)-1
  13.     arrSrc(a)=Mid(sSrc, a+1, 1) : arrDes(a)=Mid(sDes, a+1, 1)
  14.   Next
  15.   For b=0 To Len(str)-1
  16.     arrTmp(b)=Mid(str, b+1, 1)
  17.     For a=0 To Len(sSrc)-1
  18.       If arrTmp(b)=arrSrc(a) Then arrTmp(b)=arrDes(a) : Exit For
  19.     Next
  20.   Next
  21.   Qwerty=Join(arrTmp,"")
  22. End Function
复制代码

作者: 328612167    时间: 2015-7-15 17:58

回复 5# yu2n

特殊字符不能处理
  1. 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/*-+.~!@#$%^&*()_{}|:"<>?=[];',.\
复制代码

作者: yu2n    时间: 2015-7-15 23:03

回复 6# 328612167

Qwerty() 函数本身就没打算支持数字和特殊字符。支持了还叫 Qwerty() ?

当然,稍作修改,即可加入数字、特殊字符支持。

示例:加入1234567890的支持:
  1.   sSrc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  2.   sDes = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
复制代码
改为
  1.   sSrc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  2.   sDes = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789"
复制代码

作者: 328612167    时间: 2015-7-16 18:24

回复 2# CrLf


我的目的是想加密一段字符串(这个字符串可能包含以下所有字符)
  1. 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/*-+.~!@#$%^&*()_{}|:"<>?=[];',.\
复制代码
不知有没有别的加密方式,还得解密
作者: yu2n    时间: 2015-7-17 08:11

本帖最后由 yu2n 于 2015-7-17 10:22 编辑

回复 8# 328612167

a-Z,0-9 都教给你了,加几个特殊字符应该不难?

只需要 sSrc、sDes 保证唯一对应关系即可,随机打乱顺序……

纯英文、纯数字、特殊字符、汉字……原理都是一样的。

下面是英文、纯数字、特殊字符的对应。
  1. 将纯英文
  2.   sSrc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  3.   sDes = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
  4. 改为英文、纯数字、特殊字符
  5.   sSrc = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/*-+.~!@#$%^&*()_{}|:""<>?=[];',.\"
  6.   sDes = "/*-+.~!@#$%^&*()_{}|:""<>?=[];',.\0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
复制代码
不罗嗦,下面贴代码:
  1. Option Explicit
  2. '加密
  3. Msgbox "Hello Word 加密后:" & MyEncryption("Hello Word", 0)
  4. '解密
  5. Msgbox "{7EEH \HK6 解密后:" & MyEncryption("{7EEH \HK6", 1)
  6. Function MyEncryption(ByVal str, ByVal mode)
  7.   Dim sSrc, sDes, sTmp, arrSrc(), arrDes(), arrTmp(), a, b
  8.   sSrc = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/*-+.~!@#$%^&*()_{}|:""<>?=[];',.\"
  9.   sDes = "/*-+.~!@#$%^&*()_{}|:""<>?=[];',.\0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  10.   If mode<>0 Then sTmp=sSrc : sSrc=sDes : sDes=sTmp
  11.   ReDim arrSrc(Len(sSrc)) : ReDim arrDes(Len(sSrc)) : ReDim arrTmp(Len(str))
  12.   For a=0 To Len(sSrc)-1
  13.     arrSrc(a)=Mid(sSrc, a+1, 1) : arrDes(a)=Mid(sDes, a+1, 1)
  14.   Next
  15.   For b=0 To Len(str)-1
  16.     arrTmp(b)=Mid(str, b+1, 1)
  17.     For a=0 To Len(sSrc)-1
  18.       If arrTmp(b)=arrSrc(a) Then arrTmp(b)=arrDes(a) : Exit For
  19.     Next
  20.   Next
  21.   MyEncryption=Join(arrTmp,"")
  22. End Function
复制代码
结果:
  1. Microsoft (R) Windows Script Host Version 5.7
  2. 版权所有(C) Microsoft Corporation 1996-2001。保留所有权利。
  3. Hello Word 加密后:{7EEH \HK6
  4. {7EEH \HK6 解密后:Hello Word
复制代码
I wrote a new program? No. 我只是在纯英文字符对应关系里面加了数字、特殊字符而已。Well, say no more you don't understand ...
作者: 328612167    时间: 2015-7-17 11:27

回复 9# yu2n


    你这个很完善。我之前是在我的那个代码上改的,所以出错了。多谢大神指点




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2