返回列表 发帖

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

最近在做字符串的练习,练了几个就想着把几个小的给组合起来,就有了一个简易明文转换器的想法。大家一起来看看啊,欢迎提建议!!
代码更新历史:
     2008.11.16  更新了密码表的产生问题,可以随机生成62个不同字符(0-9,a-z,A-Z)的密码表(感谢pusofalse的建议)!COPY
     感谢pusofalse关于第三段中效率问题的建议,我运行了一下,效率可以提高很多,但是字母输出却全为大写字母,原因为此句   If defined .!var!   中对于.!var!的判断,小写字母和大写字母在此不区分。很好的思路,学习了。还在思考如何能兼顾效率和输出。欢迎大家提建议!再次感谢pusofalse!!COPY
@echo off     
:begin
color 0e
mode con cols=60 lines=26
setlocal enabledelayedexpansion
echo.
echo                     ╭────────╮
echo     ╭───────┤ 简易明文加密器 ├───────╮
echo     │              ╰────────╯              │
echo     │                                                │
echo     │       本程序能把指定输入的字符串进行三种运算,  │
echo     │                                                │
echo     │  ①进行反序排列 ②对于字母大写换小写,小写换   │
echo     │                                                │
echo     │  大写 ③按照转换表进行对应加密。暂只支持0-9,   │
echo     │                                                │
echo     │  a-z,A-Z的转换。转换表每次随机产生,需要查看   │
echo     │                                                │
echo     │  的话请直接输入回车。                          │
echo     │                                                │
echo     │       此代码是我在做字符串处理的练习时偶然想   │
echo     │                                                │
echo     │  到的,肯定还有不足之处,大家一起来讨论!      │
echo     │                                                │
echo     │                              code by lhjoanna  │
echo     │                                                │
echo     ╰────────────────────────╯         
set code=
set /a m=0
set /a u=0
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 (
   set /a m+=1
   set  x!m!=%%i
)
:loop
   set /a num=!random!%%62+1
   if not defined _x!num! (
     call set _x!num!=%%x!num!%%
     call set "code=!code! %%_x!num!%%"
     set /a u+=1
  )
if !u! lss 62 goto loop
set /a number=0
for /l %%i in (1 1 62) do (
  set /a number+=1
  set _x!number!=
)
set /p input=请输入:
if "%input%" equ "" (
    call :_help
    pause>nul
    goto begin
)
call :_help
echo     输      入:%input%
:a
set str=!str!!input:~-1!
set input=!input:~0,-1!
if defined input goto a
echo     反      序:!str!
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"
set str=!str: =#!
:b
set "str1=!str1!!str:~,1! "&set str=!str:~1!
if defined str goto b
for %%i in (!str1!) do (
    set flag=1
    for %%j in (!code_!) do (
        if /i "%%i"=="%%j" if not "%%i"=="%%j" set str=!str!%%j&set flag=0
    )
    if !flag! equ 1 set str=!str!%%i
)
set "str=!str:#= !"
echo     大小写转换:!str!
set /a a=0,b=0
for %%i in (!code!) do (
   set /a a+=1
   set n!a!=%%i
)
set str_str=!str!
:c
set /a b=0
set _flag=1
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 (
   set /a b+=1
   call set s=%%n!b!%%
   if "%%j" equ "!str_str:~0,1!" set t=!t!!s!&set _flag=0&goto d
)
:d
if !_flag! equ 1 set t=!t!!str_str:~,1!
set "str_str=!str_str:~1!"
if defined str_str goto c
echo.&echo     最终结果:  !t!
set str=
set t=
set str1=
pause>nul
goto begin
:_help
cls
color 0a
set /a c=0
echo.&echo                      明暗文密码表
echo     ────────────────────────
set /a a=0,b=0
for %%i in (!code!) do (
   set /a a+=1
   set n!a!=%%i
)
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 (
   set /a c+=1
   call set s=%%n!c!%%
   set /p=      %%j--!s!<nul
   set /a num_1=!c!%%5
   if !num_1! equ 0 echo.
)
echo.
echo     ────────────────────────
echo.&echo.COPY
2

评分人数

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

TOP

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

TOP

试下这样?、、、
@echo off
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"
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"
For /l %%i in (0 2 123) do (call set ".%%var:~%%i,1%%=%%str:~%%i,1%%")
set /p text=Input:
:loop
If defined text (
   set "var=%text:~,1%"
   setlocal enabledelayedexpansion
   If defined .!var! (set "var=!.%text:~,1%!")
   <nul set /p= !var!
   endlocal
   set "text=%text:~1%" & goto loop
)
echo. & pauseCOPY
另,如果能用随机密码表的话,加密可能更加牢固些了。

[ 本帖最后由 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!的判断,小写字母和大写字母在此不区分。
@echo off
setlocal ENABLEDELAYEDEXPANSION
rem 标记大写字母
set CAP=ABCDEFGHIJKLMNOPQRSTUVWXYZ
for /l %%n in (0,1,25) do (set CAP_!CAP:~%%n,1!=!CAP:~%%n,1!)
echo 大小写字母分类器
set /p lts=要分类的字母:
set cap=
set notcap=
set other=
:fenlei
if "!lts!"=="" goto ok
set lt=!lts:~0,1!
set lts=!lts:~1!
if "!lt!"=="!" set other=!other!^^!
if "!lt!"=="=" set other=!other!=
if "!lt!"==":" set other=!other!:
if "!CAP_%lt%!"=="" (
  set other=!other!!lt!
  goto fenlei
)
if "!CAP_%lt%!"=="!lt!" (
  set cap=!cap!!lt!
) else (
  set notcap=!notcap!!lt!
)
goto fenlei
:ok
echo 大写字母有:!cap!
echo 小写字母有:!notcap!
echo 不是字母的有:!other!
pauseCOPY

TOP

返回列表