[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【挑战】批处理实现摩尔斯码加解密

&&今天突然想起早几天看过的一部电影《风声》,里面描述的是地下**党是

如何利用摩尔斯密码跟敌人斗智斗勇的。在这里就不得简单先描述下摩尔斯码

了:摩尔斯码就是由双方以一定规律事先约定好的一组密码,它其实是由母本

和密文两部分组成的,而密文是根据母本上的排列规律来生成的。要破解这样

的密码,不得到母本基本上是不可能的。所以本人就想用批来模拟这一加密和

解密过程的实现。

    于是,我从网上找了个常用汉字简体表,再用批全部打乱生成了一个母本

homebook.txt如附件,母本中共有7176个汉字,分成了36版(部分),1-35版

每版10行,每行5列,每列4个字共200个字,36版也是如此排列,只是只有176

个字。而每个字就对应了一个四位的以“-”号格开的摩尔码(密文)如:段字

对应的摩尔码是30-9-1-1,30版9行1列第1个字(其实这一系列批处理比本挑战

题更麻烦)。

    现在我要求大家完成两个挑战:

    挑战一 根据homebook.txt将我给出的两组密文还原成原文(汉字),密

文如下(解密):

    1、17-5-5-1 8-2-2-4 17-10-4-4 9-8-3-1 3-2-5-3 21-7-1-2 15-9-1-3

    2、24-5-3-1 10-5-3-4 28-5-1-2 3-2-5-3 21-7-1-2 7-10-4-4 25-5-4-4

32-1-5-3 31-3-5-3 25-7-1-2 12-2-4-1 3-2-5-1

    挑战二 根据hommebook.txt将我给出的两句原文编译成密文(摩尔码),

原文如下(加密):

    1、我想他肯定知道这个地方有段好难走的路

    2、当敌人冲过来后你就拉响前面的警报

    要求不要生成临时文件,代码的效率要高,不得使用第三方工具,满分40

分,只完成一步不得分,以思路为重,酌情加分。

链接: https://pan.baidu.com/s/1SqJmvTQXSSuGdhpK7bmsJw 提取码: n3g7
2

评分人数

***共同提高***

自动化与手工操作的参与量,是为自己拿捏。

TOP

回复 37楼 的帖子

高手一出手,就知有没有,terse的代码一直有着简洁高效的特点,学习了。

但加密时,各字之间完全可以真接用空格格开,就不用折半法来判断字符长度了。
***共同提高***

TOP

这样是否能再提速点
加密:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "s1=我想他肯定知道这个地方有段好难走的路"
  3. set "s2=当敌人冲过来后你就拉响前面的警报行"
  4. for /l %%a in (1,1,2) do (
  5.     set /a "m=8189,x=0,l=0"
  6.     for /l %%b in (1,1,14) do (
  7.         set /a "l=(m+x)/2"
  8.         for %%i in (!l!) do if "!s%%a:~%%i!" equ "" (set /a m=l) else set /a x=l
  9.     )
  10.         set /a "_l%%a=l"
  11.         for /l %%b in (0,1,!l!) do set str=!str! !s%%a:~%%b,1!
  12.     )
  13.         for /f "tokens=1-18 delims=:-" %%a in ('findstr /nr "%str%" homebooka.txt') do (
  14.         set /a a=%%a/14+1,n=-1
  15.         for %%v in (%%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r) do (
  16.                 set /a "n+=1,c=n%%21/4+1,d=n%%4+1"
  17.                 if "!str:%%v=!" neq "!str!" if not defined %%v set "%%v=!a!-%%b-!c!-!d!"
  18.             )
  19.     )
  20.         for /l %%a in (1,1,2) do (
  21.             set "var="
  22.             for /l %%b in (0,1,!_l%%a!) do for %%c in ("!s%%a:~%%b,1!") do set "var=!var! !%%~c!"
  23.             echo 原文:!s%%a!
  24.             echo 密文:!var!
  25.      )
  26. pause
复制代码
解密:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "s1=17-5-5-1 8-2-2-4 17-10-4-4 9-8-3-1 3-2-5-3 21-7-1-2 15-9-1-3"
  3. set "s2=24-5-3-1 10-5-3-4 28-5-1-2 3-2-5-3 21-7-1-2 7-10-4-4 25-5-4-4 32-1-5-3 31-3-5-3 25-7-1-2 12-2-4-1 3-2-5-1"
  4. for /l %%a in (1,1,2) do (
  5.     for %%b in (!s%%a!) do (
  6.         for /f "tokens=1-4 delims=- " %%i in ("%%b") do (
  7.             set %%i-%%j=i&set "%%b=j"
  8.     )))
  9.     for /f "tokens=1-18 delims=:-        " %%a in ('findstr /nr ":" homebooka.txt') do (
  10.         set /a a=%%a/14+1,n=-1
  11.         if defined !a!-%%b (
  12.         for %%v in (%%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r) do (
  13.                 set /a "n+=1,c=n%%21/4+1,d=n%%4+1"
  14.                 if defined !a!-%%b-!c!-!d! set "!a!-%%b-!c!-!d!=%%v"
  15.            )
  16.     )
  17. )
  18.      for /l %%a in (1,1,2) do (
  19.          set "var="
  20.          for %%b in (!s%%a!) do set "var=!var!!%%b!"
  21.              echo 原文:!s%%a!
  22.              echo 密文:!var!
  23.     )
  24. pause
复制代码
1

评分人数

    • batman: 好,只是晚到了点PB + 40

TOP

用到call不好意思

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%i in ('type homebook.txt') do set/a h+=1&set s!h!=%%j
:hom
set/p str=str:
echo !time!
set str=!str:-= !
for %%i in (!str!) do (set/a s+=1
if !s!==1 set/a h="(%%i-1)*13"
if !s!==2 set/a h+=%%i+2
if !s!==3 set/a l="(%%i-1)*4*2"
if !s!==4 (set/a l+=%%i*2-1&call set/p=%%s!h!:~!l!,1%%<nul
set/a s=0,h=0,l=0))
echo.&echo.!time!&goto hom

原密文:
17-5-5-1 8-2-2-4 17-10-4-4 9-8-3-1 3-2-5-3 21-7-1-2 15-9-1-3
24-5-3-1 10-5-3-4 28-5-1-2 3-2-5-3 21-7-1-2 7-10-4-4 25-5-4-4
32-1-5-3 31-3-5-3 25-7-1-2 12-2-4-1 3-2-5-1

[ 本帖最后由 qwd 于 2009-11-28 04:03 编辑 ]

TOP

看过《风声》了,开始是兴奋,中途是愤怒,最后是无限的感动,真的被感动了... ...
于是我也努力写了摩尔斯密码的vbs版,纪念下这部经典国产影片,和女主角--晓梦... ..
由于把母本整合进了脚本,所以直接发附件。
1

评分人数

    • batman: 为爱国情怀叫好加分!PB + 20

TOP

是时候把它弄出来了

&&针对这一摩尔码加解密,本人弄了个vbs+批版的,当然为了方便先生成了一个list.txt。

该工具可以同时将转译结果显示出来并输入到剪贴板中,你只要在文本中右键或ctrl+v就

可以输出结果到文本。
  1. dim path,strinput,stroutput,counter
  2. counter=2
  3. do
  4. on error resume next
  5. if counter=1 then
  6.    exit do
  7.    else
  8.    strinput=inputbox("请输入要转译的文字或编码,退出请点取消","转译工具")
  9.    if strinput=false then
  10.       wscript.quit
  11.       else
  12.       set wshshell=createobject("wscript.shell")
  13.       path=wshshell.currentdirectory
  14.       set objie=createobject("internetexplorer.application")
  15.       set objfso=createobject("scripting.filesystemobject")
  16.       set objtext=objfso.opentextfile("temp.txt",2,true)
  17.       objtext.write strinput
  18.       objtext.close
  19.       set objtext=objfso.opentextfile("temp.bat",2,true)
  20.       objtext.writeline "@echo off&setlocal enabledelayedexpansion"
  21.       objtext.writeline "set /p input=<temp.txt&del /q temp.txt&set "&chr(34)&"k= "&chr(34)
  22.       objtext.writeline "if "&chr(34)&"%input:-=%"&chr(34)&" neq "&chr(34)&"%input%"&chr(34)&" set "&chr(34)&"k="&chr(34)&"&set "&chr(34)&"str=%input%"&chr(34)&"&goto next"
  23.       objtext.writeline ":lp"
  24.       objtext.writeline "set "&chr(34)&"str=%str% %input:~,1%"&chr(34)
  25.       objtext.writeline "set "&chr(34)&"input=%input:~1%"&chr(34)
  26.       objtext.writeline "if defined input goto lp"
  27.       objtext.writeline ":next"
  28.       objtext.writeline "for /f "&chr(34)&"tokens=1,2"&chr(34)&" %%a in ('findstr /r "&chr(34)&"%str%"&chr(34)&" list.txt') do ("
  29.       objtext.writeline "if "&chr(34)&"%k%"&chr(34)&" equ "&chr(34)&""&chr(34)&" ("
  30.       objtext.writeline "set "&chr(34)&"%%a=%%b"&chr(34)
  31.       objtext.writeline ") else ("
  32.       objtext.writeline "set "&chr(34)&"%%b=%%a"&chr(34)
  33.       objtext.writeline "))"
  34.       objtext.writeline "for %%a in (%str%) do set /p=!%%a!%k%<nul>>temp.txt"
  35.       objtext.close
  36.       wshshell.run "temp.bat",0
  37.       wscript.sleep 1000
  38.       set objtext=objfso.opentextfile("temp.txt",1)
  39.       stroutput=objtext.readall
  40.       objtext.close
  41.       objie.navigate("about:blank")
  42.       objie.document.parentwindow.clipboarddata.setdata "text", stroutput
  43.       objie.quit
  44.       wshshell.popup stroutput,2,"转译结果"
  45.       objfso.deletefile("temp.bat")
  46.       objfso.deletefile("temp.txt")
  47.       set objfo=nothing
  48.       set objie=nothing
  49.       set swshshell=nothing  
  50.       end if
  51.    end if
  52. loop
复制代码
注:转译的时间长是因为防出错加入了wscript.sleep 1000,你可以修改这个1000的值来加快速度
***共同提高***

TOP

解密平均0.10 s
加密平均0.20 s 多数为0.19s
鉴定为:
       都玩刷屏呢……  不加PB了。

[ 本帖最后由 523066680 于 2009-11-25 14:12 编辑 ]

TOP

我的方法再提提速速

  1. @echo off&setlocal enabledelayedexpansion
  2. set sati=!time!
  3. set Ban=0
  4. for /f "tokens=* delims=*" %%a in (homebook.txt) do (
  5.         set str=%%a
  6.         if "!str:~-1!" equ "版" (set /a Ban+=1) else (
  7.                 for /f "tokens=1,2,*" %%b in ("!ban! !str:-=!") do (set Ban%%b=!Ban%%b!%%d@)
  8.         )
  9. )
  10. ::前面读取母本到变量
  11. for /f "tokens=*" %%a in (密文.txt) do (
  12.         set 原文=
  13.         for %%b in (%%a) do (
  14.                 for /f "tokens=1-4 delims=-" %%1 in ("%%b") do (
  15.                         for /f "tokens=1-10 delims=@" %%0 in ("!Ban%%1!") do (
  16.                                 set vv=1%%02%%13%%24%%35%%46%%57%%68%%79%%810%%9
  17.                         )
  18.                         for /f "tokens=1-5" %%0 in ("!vv:*%%2=!") do (
  19.                                 set vv=1%%02%%13%%24%%35%%4
  20.                         )
  21.                         set "str=@!vv:*%%3=!"
  22.                         set 原文=!原文!!str:~%%4,1!
  23.                 )
  24.         )
  25.         echo;!原文!
  26. )
  27. ::解密
  28. echo;!sati!
  29. echo;!time!
  30. set sati=!time!
  31. for /f "tokens=*" %%a in (原文.txt) do (
  32.         set sour=%%a
  33.         set/a z=8180,x=0,y=0
  34.         for /l %%a in (1,1,14) do (set/a "y=(z-x)/2+x"
  35.             for %%b in (!y!) do if "!sour:~%%b,1!" equ "" (set/a z=y) else (set/a x=y)
  36.         )
  37.         set 密文=
  38.         echo !sour! [!x!]
  39.         for /l %%b in (0,1,!x!) do (
  40.                 for %%c in ("!sour:~%%b,1!") do (
  41.                         for /l %%d in (1,1,!ban!) do (
  42.                                 if "!Ban%%d:%%~c=!" neq "!Ban%%d!" set str=!Ban%%d!&set zban=%%d
  43.                         )
  44.                         for /f "tokens=1-10 delims=@" %%0 in ("!str!") do (
  45.                                 set vv=1%%0@1@2%%1@2@3%%2@3@4%%3@4@5%%4@5@6%%5@6@7%%6@7@8%%7@8@9%%8@9@10%%9@10@
  46.                         )
  47.                         for /f "tokens=1,2 delims=@" %%0 in ("!vv:*%%~c=!") do (
  48.                                 set zhang=%%1
  49.                                 set vv=!vv:*%%1=!
  50.                         )
  51.                         for /f "tokens=1-5" %%0 in ("!vv!") do (
  52.                                 set vv=1%%0 @1@2%%1 @2@3%%2 @3@4%%3 @4@5%%4 @5@
  53.                         )
  54.                         for /f "tokens=1,2 delims=@" %%0 in ("!vv:*%%~c=!") do (
  55.                                 set zlie=%%1
  56.                         )
  57.                                 set vv=!vv:*%%~c=!
  58.                                 set vv=!vv: =1234!
  59.                                 set zzhi=!vv:~3,1!
  60.                
  61.                         set 密文=!密文! !zban!-!zhang!-!zlie!-!zzhi!
  62.                 )
  63.         )
  64.         echo;!密文!
  65. )
  66. ::加密
  67. echo;!sati!
  68. echo;!time!
  69. pause
  70. goto :eof
复制代码

TOP

回复 30楼 的帖子

1.恩,我觉得如果是我知识范围内的东西,应该是cpu . cup是杯子
2.是不是说时间呀,
  我拿到256M的机子试过的。
  batman那个代码对应新的homebook的 速度是0.30秒左右 ,
  用旧homebook 会上秒。

TOP

28楼的肯定是双核cup

虽然批处理运行很“霸时间”,但是双核的cup不管怎样,一个进程只会用一个cup去执行。

[ 本帖最后由 netbenton 于 2009-11-25 12:27 编辑 ]

TOP

回复 28楼 的帖子

其实不修改母本也能正确处理“版、第、行”三个字,只是如上所说要大费一番周章,
如可以通过findstr正则来处理,但这样会影响到处理的效率,所以本人考虑再三还是将
母本进行了处理,以免不必要的麻烦。
另外,楼上的机子怎么比我的慢这么多。。。

[ 本帖最后由 batman 于 2009-11-25 11:43 编辑 ]
***共同提高***

TOP

1。我的第二次加密测试过,遇到"版 第 行"不会错的。
   因为我for 的时候提取的参考字符是 "第x版" "第x行" 后面的那些信息,如果刚好是第x版 则提取为空
   接着我后面还有个判断 -- [字符] 是否存在于 [提取的参考字符]   于是只有遇到密文对应的行才会转换。
(另外本人大胆在前面使用字符串 1 化 +1 的方式来计算 字符串长度…… 虽然体积大,
    虽然耗时0.01 秒到0.02秒,不过为了前面设置的时候可以统一,我觉得值了。)

2。netbenton的经过测试遇到这三个字转换也正常的。

3。关于字典嘛,确实做适当的调整会比较方便批处理

4。batman代码测试新homebook.txt  本机0.30 秒 左右

[ 本帖最后由 523066680 于 2009-11-25 10:02 编辑 ]

TOP

因为本人的失误使得findstr的运用受到限制,如查找“第、版、行”三个字时会出现错误,所以母本中的第?版,第?行中的汉字都应去掉,现重新上传母本上来,请各位对照修改自己的代码,对不起了。
***共同提高***

TOP

解密暂时还不能突破前面代码的效率,但加密肯定是突破了(本机测试11毫秒左右):
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str1=我 想 他 肯 定 知 道 这 个 地 方 有 段 好 难 走 的 路"
  3. set "str2=当 敌 人 冲 过 来 后 你 就 拉 响 前 面 的 警 报 行"
  4. for /f "tokens=1-3 delims=:" %%a in ('findstr /n /r "%str1% %str2%" homebook.txt') do (
  5.     set /a x=%%a%%14,a=%%a/14,b=%%b&set "vars=%%c"
  6.     if !x! neq 0 set /a a+=1
  7.     for %%a in (%str1% %str2%) do (
  8.         if "!vars:%%a=!" neq "!vars!" (
  9.            set "var=!vars!"
  10.            set /a n=0&set "temp=!var:*%%a=!"
  11.            if defined temp for /f "delims=" %%a in ("!temp!") do set "var=!var:%%a=!"
  12.            set "var=!var:-= !"&for %%a in (!var!) do set /a n+=1
  13.            set /a c=n/4+1,d=n%%4
  14.            if !d! equ 0 set /a c-=1,d=4
  15.            set "%%a=!a!-!b!-!c!-!d!"
  16.         )
  17.     )      
  18. )
  19. for %%a in (1 2) do (
  20.     echo 原文:!str%%a!&set /p=密文:<nul
  21.     for %%b in (!str%%a!) do set /p=!%%b! <nul
  22.     echo.
  23. )
  24. pause>nul
复制代码
多亏了随风提出的set "var=!var:*字=!"的思路,用的是新homebook.txt(见楼下)

[ 本帖最后由 batman 于 2009-11-25 04:10 编辑 ]
1

评分人数

***共同提高***

TOP

返回列表