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

[加密解密] 批处理版简易明文加密器

最近在做字符串的练习,练了几个就想着把几个小的给组合起来,就有了一个简易明文转换器的想法。大家一起来看看啊,欢迎提建议!!
  1. 代码更新历史:
  2.      2008.11.16  更新了密码表的产生问题,可以随机生成62个不同字符(0-9,a-z,A-Z)的密码表(感谢pusofalse的建议)!
复制代码
  1.      感谢pusofalse关于第三段中效率问题的建议,我运行了一下,效率可以提高很多,但是字母输出却全为大写字母,原因为此句   If defined .!var!   中对于.!var!的判断,小写字母和大写字母在此不区分。很好的思路,学习了。还在思考如何能兼顾效率和输出。欢迎大家提建议!再次感谢pusofalse!!
复制代码
  1. @echo off     
  2. :begin
  3. color 0e
  4. mode con cols=60 lines=26
  5. setlocal enabledelayedexpansion
  6. echo.
  7. echo                     ╭────────╮
  8. echo     ╭───────┤ 简易明文加密器 ├───────╮
  9. echo     │              ╰────────╯              │
  10. echo     │                                                │
  11. echo     │       本程序能把指定输入的字符串进行三种运算,  │
  12. echo     │                                                │
  13. echo     │  ①进行反序排列 ②对于字母大写换小写,小写换   │
  14. echo     │                                                │
  15. echo     │  大写 ③按照转换表进行对应加密。暂只支持0-9,   │
  16. echo     │                                                │
  17. echo     │  a-z,A-Z的转换。转换表每次随机产生,需要查看   │
  18. echo     │                                                │
  19. echo     │  的话请直接输入回车。                          │
  20. echo     │                                                │
  21. echo     │       此代码是我在做字符串处理的练习时偶然想   │
  22. echo     │                                                │
  23. echo     │  到的,肯定还有不足之处,大家一起来讨论!      │
  24. echo     │                                                │
  25. echo     │                              code by lhjoanna  │
  26. echo     │                                                │
  27. echo     ╰────────────────────────╯         
  28. set code=
  29. set /a m=0
  30. set /a u=0
  31. for %%i in (0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  32.    set /a m+=1
  33.    set  x!m!=%%i
  34. )
  35. :loop
  36.    set /a num=!random!%%62+1
  37.    if not defined _x!num! (
  38.      call set _x!num!=%%x!num!%%
  39.      call set "code=!code! %%_x!num!%%"
  40.      set /a u+=1
  41.   )
  42. if !u! lss 62 goto loop
  43. set /a number=0
  44. for /l %%i in (1 1 62) do (
  45.   set /a number+=1
  46.   set _x!number!=
  47. )
  48. set /p input=请输入:
  49. if "%input%" equ "" (
  50.     call :_help
  51.     pause>nul
  52.     goto begin
  53. )
  54. call :_help
  55. echo     输      入:%input%
  56. :a
  57. set str=!str!!input:~-1!
  58. set input=!input:~0,-1!
  59. if defined input goto a
  60. echo     反      序:!str!
  61. set "code_=a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
  62. set str=!str: =#!
  63. :b
  64. set "str1=!str1!!str:~,1! "&set str=!str:~1!
  65. if defined str goto b
  66. for %%i in (!str1!) do (
  67.     set flag=1
  68.     for %%j in (!code_!) do (
  69.         if /i "%%i"=="%%j" if not "%%i"=="%%j" set str=!str!%%j&set flag=0
  70.     )
  71.     if !flag! equ 1 set str=!str!%%i
  72. )
  73. set "str=!str:#= !"
  74. echo     大小写转换:!str!
  75. set /a a=0,b=0
  76. for %%i in (!code!) do (
  77.    set /a a+=1
  78.    set n!a!=%%i
  79. )
  80. set str_str=!str!
  81. :c
  82. set /a b=0
  83. set _flag=1
  84. for %%j in (0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  85.    set /a b+=1
  86.    call set s=%%n!b!%%
  87.    if "%%j" equ "!str_str:~0,1!" set t=!t!!s!&set _flag=0&goto d
  88. )
  89. :d
  90. if !_flag! equ 1 set t=!t!!str_str:~,1!
  91. set "str_str=!str_str:~1!"
  92. if defined str_str goto c
  93. echo.&echo     最终结果:  !t!
  94. set str=
  95. set t=
  96. set str1=
  97. pause>nul
  98. goto begin
  99. :_help
  100. cls
  101. color 0a
  102. set /a c=0
  103. echo.&echo                      明暗文密码表
  104. echo     ────────────────────────
  105. set /a a=0,b=0
  106. for %%i in (!code!) do (
  107.    set /a a+=1
  108.    set n!a!=%%i
  109. )
  110. for %%j in (0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  111.    set /a c+=1
  112.    call set s=%%n!c!%%
  113.    set /p=      %%j--!s!<nul
  114.    set /a num_1=!c!%%5
  115.    if !num_1! equ 0 echo.
  116. )
  117. echo.
  118. echo     ────────────────────────
  119. echo.&echo.
复制代码
2

评分人数

加密那段似乎存在效率问题~
心绪平和,眼藏静谧。

TOP

恩,是啊。加密那段对于每个字符都要最多执行62次(即为z的情况),如果全是0则每个字符只执行一次。全是z的话7、8个字符的字符串就要执行几百次,是有效率问题啊。我在想有没有更好的解决方法,大家一起来讨论吧。

TOP

试下这样?、、、
  1. @echo off
  2. set "var=0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z"
  3. set "str=4 5 6 7 8 9 0 1 2 3 h i j k l m n o p q r s t u v w x y z a b c d e f g H I J K L M N O P Q R S T U V W X Y Z A B C D E F G"
  4. For /l %%i in (0 2 123) do (call set ".%%var:~%%i,1%%=%%str:~%%i,1%%")
  5. set /p text=Input:
  6. :loop
  7. If defined text (
  8.    set "var=%text:~,1%"
  9.    setlocal enabledelayedexpansion
  10.    If defined .!var! (set "var=!.%text:~,1%!")
  11.    <nul set /p= !var!
  12.    endlocal
  13.    set "text=%text:~1%" & goto loop
  14. )
  15. echo. & pause
复制代码
另,如果能用随机密码表的话,加密可能更加牢固些了。

[ 本帖最后由 pusofalse 于 2008-11-16 08:22 编辑 ]
心绪平和,眼藏静谧。

TOP

回复 4楼 的帖子

谢谢版主的代码,我运行过了,还有一点小问题问题在顶楼列出。再次致谢~~

TOP

用随机密码表扰乱明文,输出结果看起来完全就像是直接echo字符串常量lkamsd的,这个常量随便写就可以。唯有当输入的字符串稍长,或者是一篇完整的英文文章时才有规律可循。对于字符串的处理,批处理也是不太擅长,比如对特殊字符><!%|&^"的处理等。if defined .!var! 的确不能区分大小写,在想两全的方法。
可能会有帮助:
重命名含特殊字符的文件:
http://bbs.bathome.net/thread-1251-1-1.html
用维热纳尔方阵给文本加密:
http://bbs.bathome.net/viewthrea ... C%C8%C8%C4%C9%B6%FB
心绪平和,眼藏静谧。

TOP

请问,如何实现我这样的加密思路?

我有一段文字:
  “批处理是一种简化的脚本语言“

要加密下,想这样加密:
  从一篇大概能包含上面字符的文件中,转换成我上面段文字。就是所谓的明文加密吧?
  例:
     1.txt 一个文件是加密密码字典。
  1.txt的第1行第3个是:批
  1.txt的第3行第15个是:处
  1.txt的第5行第13个是:理
  1.txt的第12行第15个是:是
  1.txt的第2行第14是:一
  1.txt的第5行第17是:种
  1.txt的第34行第16是:简
  1.txt的第13行第23:化
  1.txt的第78行第13:的
  1.txt的第123行第23:脚
  1.txt的第98行第13:本
  1.txt的第12行第18是:语
  1.txt的第34行第20:言

转换后的明文密码是:
1,3 3,15 5,13 12,15 2,14 5,17 34,16 13,23 78,13 123,23 98,13 12,18 34,20

-------------------------------------------------------------------------------------------------------------

如果不限于用dos批命令,我想可以用这样原理来做:
首先加密软件载入txt密码字典到内存:
比如:一个 1.txt字典文件,含这样内容:
【白腹树袋熊的学名来自两个希腊字,杜鹃树和兔子。
作为一种已知的生物,这种树居有袋目哺乳动物,一生大部分时间在地上度过。
它们在野外生存数量很少,属濒危物种。】

那么在内存中这样描述:
白=1,1 (第一行第一个)
腹=1,2 (第一行第二个)
树=1,3 (第一行第三个)
。。。
作=2,1 (第二行第一个)
。。。
后面重复的字符忽略编码,也就是已经编码的字符再次遇到不再编码,比如第二行的“的”。

在加密的时候,先调入字典入内存,然后调入需要加密的文字入内存,2相比较,生成1,12.2,15.3,22.12,14 之类的加密码文本输出电脑。

还有个设想:
如果觉得一串数字看了碍眼,可以把字典内容“倒转编码”,再次用数字串对比编码生成汉字输出电脑。当然这些汉字肯定是语义昏乱~~~

TOP

本帖最后由 0000 于 2017-1-13 15:05 编辑
感谢pusofalse关于第三段中效率问题的建议,我运行了一下,效率可以提高很多,但是字母输出却全为大写字母,原因为此句&nbsp; &nbsp;If defined .!var!&nbsp; &nbsp;中对于.!var!的判断,小写字母和大写字母在此不区分。
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. rem 标记大写字母
  4. set CAP=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  5. for /l %%n in (0,1,25) do (set CAP_!CAP:~%%n,1!=!CAP:~%%n,1!)
  6. echo 大小写字母分类器
  7. set /p lts=要分类的字母:
  8. set cap=
  9. set notcap=
  10. set other=
  11. :fenlei
  12. if "!lts!"=="" goto ok
  13. set lt=!lts:~0,1!
  14. set lts=!lts:~1!
  15. if "!lt!"=="!" set other=!other!^^!
  16. if "!lt!"=="=" set other=!other!=
  17. if "!lt!"==":" set other=!other!:
  18. if "!CAP_%lt%!"=="" (
  19.   set other=!other!!lt!
  20.   goto fenlei
  21. )
  22. if "!CAP_%lt%!"=="!lt!" (
  23.   set cap=!cap!!lt!
  24. ) else (
  25.   set notcap=!notcap!!lt!
  26. )
  27. goto fenlei
  28. :ok
  29. echo 大写字母有:!cap!
  30. echo 小写字母有:!notcap!
  31. echo 不是字母的有:!other!
  32. pause
复制代码

TOP

返回列表