找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25530|回复: 9

[问题求助] [已解决]VBS加密解密字符串的问题

[复制链接]
发表于 2015-7-14 19:04:51 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2015-7-14 20:40:23 | 显示全部楼层
这加密算法只是简单地单表置换,而且实现得很不好,最奇葩的是 s2 和 s1 居然还无法一一对应,所以会出错
至于解密,把 s1 和 s2 对换进行逆运算就行了
 楼主| 发表于 2015-7-15 12:52:18 | 显示全部楼层
回复 2# CrLf


    我的目的是想加密一段字符串(这个字符串包含所有字符),在运行时又解密,不知怎样做才好
发表于 2015-7-15 13:36:56 | 显示全部楼层
回复 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")
复制代码
发表于 2015-7-15 14:17:43 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2015-7-15 17:58:12 | 显示全部楼层
回复 5# yu2n

特殊字符不能处理
  1. 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/*-+.~!@#$%^&*()_{}|:"<>?=[];',.\
复制代码
发表于 2015-7-15 23:03:59 | 显示全部楼层
回复 6# 328612167

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

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

示例:加入1234567890的支持:
  1.   sSrc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  2.   sDes = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
复制代码
改为
  1.   sSrc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  2.   sDes = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789"
复制代码
 楼主| 发表于 2015-7-16 18:24:45 | 显示全部楼层
回复 2# CrLf


我的目的是想加密一段字符串(这个字符串可能包含以下所有字符)
  1. 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/*-+.~!@#$%^&*()_{}|:"<>?=[];',.\
复制代码
不知有没有别的加密方式,还得解密
发表于 2015-7-17 08:11:02 | 显示全部楼层
本帖最后由 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 ...

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2015-7-17 11:27:30 | 显示全部楼层
回复 9# yu2n


    你这个很完善。我之前是在我的那个代码上改的,所以出错了。多谢大神指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 10:42 , Processed in 0.020076 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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