标题: [文本处理] 文本加密与解密的bat程序,希望高手能给解决一下BUG [打印本页]
作者: yiyue7 时间: 2023-4-16 08:16 标题: 文本加密与解密的bat程序,希望高手能给解决一下BUG
这个程序可以加解密文本程序,但是加密后的字符再重新解密就会出现首尾颠倒的问题,例如加密123后的密文是:^hr但是解密后就成了312就是这个问题,有什么办法解决吗?求高手解决!
代码如下:- @echo off
- set "Symbol= !#$%%&'()*+,-./0123456789;:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"…—·,。"
- setlocal enabledelayedexpansion
- call :length Symbol
- set /a SymbolLen=%len%/2
- ::echo;"%Symbol%" 验证,共%SymbolLen%位数。
- ::%Symbol%改编自ASCII,百分号变两个,双引号放后面,添加了几个中文标点符号。
- if exist "%~1" set "Input=%~1"&goto InputFile
- :Input 输入
- cls
- echo;
- echo;
- echo; ﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
- echo; 采用转换法将输入字符转换为新字符;字符转数字,可扩展。
- echo; 每行最长支持4096字长;效率相对低些;可直接拖入文件编码。
- echo; 默认使用数字、大小写字母、英文标点符号、空格等编码。
- echo; ﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
- echo;
- set Input=
- set /p "Input= 请输入:"
- if not "!Input!"=="" (goto InputFile) else (goto Input)
- :InputFile 文件处理
- set num=0
- if exist "!Input!" (
- for /f "tokens=*" %%a in ("!Input!") do set "FileName=%%~na"&set "FilePath=%%~dpa"
- cd.>%~dp0!FileName!_Encode.txt&cd.>%~dp0!FileName!_Decode.txt
- for /f "usebackq tokens=*" %%a in ("!Input!") do set "Input=%%a"&echo;&set /a num+=1&echo; !num!.加密字符【!Input!】&call :length Input&call :Contrl Input
- ) else call :length Input&call :Contrl Input
- echo;
- title 》》编码完成。&echo;&echo; 编码完成!请按任意键返回 . . .
- pause>nul
- goto Input
- :Contrl 控制台,控制加密和解密的总体顺序。
- call :Encode %1
- ::##此处为加密调用,处理的是输入的字符Input。##
- if defined WordName call :Decode WordName
- ::##此处为解密调用,处理的是上次加密得到的结果WordName。##
- goto :eof
- :Encode
- title 》》正在加密,1000字符加解密用时50秒左右,请稍候 . . .
- call :WordToCode %1
- Rem echo; 加密编码【!CodeName!】
- ::##可在此处添加你的加密算法的具体引用和调节等。##
- set CodeName=!CodeName:~1,1000000!!CodeName:~0,1!
- ::##当前采用的是编码首字符移位到编码末尾之调整移位。##
- ::##注意:该编码对Symbol要求高,可能存在缺陷##
- call :CodeToWord CodeName
- echo; 新密码【!WordName!】
- if exist "!FilePath!" echo;!WordName!>>%~dp0!FileName!_Encode.txt
- goto :eof
-
- :Decode
- title 》》正在解密,字符越长需要的时间越长! . . .
- call :WordToCode %1
- Rem echo; 解密编码【!CodeName!】
- ::##可在此处添加你的解密算法的具体引用和调节等。##
- set CodeName=!CodeName:~-1,1!!CodeName:~0,-1!
- ::##当前采用的是编码首字符移位到编码末尾之恢复移位##
- call :CodeToWord CodeName
- echo; 原密码【!WordName!】
- if exist "!FilePath!" echo;!WordName!>>%~dp0!FileName!_Decode.txt
- goto :eof
- :length 计算字符长度 code by plp626
- set "$=!%1!#"
- set len=&for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
- endlocal&If %2. neq . (set/a%2=%len%)else set /a len=%len%*2
- setlocal
- goto :eof
- :WordToCode 字符转编码
- set CodeName=
- for /l %%i in (0,1,%len%) do (
- for /l %%a in (0,1,%SymbolLen%) do if not "!%1:~%%i,1!"=="" if "!Symbol:~%%a,1!"=="!%1:~%%i,1!" (
- if %%a geq 10 (set CodeName=%%a!CodeName!) else (set CodeName=0%%a!CodeName!)
- )
- )
- goto :eof
- ::%%i针对输入字符串的字数,%%a针对元码个数。
- ::echo "!Symbol:~%%a,1!"=="!%1:~%%i,1!" %%a==!CodeName!
- :CodeToWord 编码转字符
- set WordName=
- for /l %%i in (0,2,%len%) do (
- for /l %%a in (0,1,%SymbolLen%) do (
- if "!WordName!"=="!Input!" (set "WordName=!WordName!") else (
- if "!%1:~%%i,2!"=="%%a" set "WordName=!Symbol:~%%a,1!!WordName!"
- if "!%1:~%%i,2!"=="0%%a" set "WordName=!Symbol:~%%a,1!!WordName!"
- )
- )
- )
- goto :eof
复制代码
以上就是代码信息了,高手也可以改进优化一下,让其使用更好些,感谢!
作者: yiyue7 时间: 2023-4-16 08:39
也可以直接拖放文本文件到该bat程序上进行转换
作者: 77七 时间: 2023-4-16 11:07
本帖最后由 77七 于 2023-4-16 11:08 编辑
将第48行复制代码
改为
- set WordName2=!WordName:~1!!WordName:~0,1!
- echo; 解密结果【!WordName2!】
- echo; 加密结果【!WordName!】
复制代码
去掉第60行
复制代码
代码太深奥,看不明白。
简单的把结果移动下位置,这样直观显示每个字符串加密和解密的两种结果。
- 请输入:123
- 解密结果【hr^】
- 加密结果【^hr】
- 请输入:^hr
- 解密结果【123】
- 加密结果【312】
复制代码
第二次输入 对第一次加密结果解密
作者: yiyue7 时间: 2023-4-16 12:55
回复 3# 77七
非常感谢回复,在你的基础上稍作修改即可。
作者: yiyue7 时间: 2023-4-16 13:07
- @echo off
- set "Symbol= !#$%%&'()*+,-./0123456789;:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"…—·,。"
- setlocal enabledelayedexpansion
- call :length Symbol
- set /a SymbolLen=%len%/2
- if exist "%~1" set "Input=%~1"&goto InputFile
- :Input 输入
- cls
- set Input=
- set /p "Input=输入或拖放文本至此:"
- if not "!Input!"=="" (goto InputFile) else (goto Input)
- :InputFile 文件处理
- set num=0
- if exist "!Input!" (
- for /f "tokens=*" %%a in ("!Input!") do set "FileName=%%~na"&set "FilePath=%%~dpa"
- cd.>%~dp0!FileName!_转换.txt&cd.>%~dp0!FileName!_原码.txt
- for /f "usebackq tokens=*" %%a in ("!Input!") do set "Input=%%a"&echo;&set /a num+=1&echo; !num!.字符【!Input!】&call :length Input&call :Contrl Input
- ) else call :length Input&call :Contrl Input
- echo;
- title 编码完成。&echo;&echo; 转换完成!请按任意键返回 . . .
- pause>nul
- goto Input
- :Contrl 控制台,控制加密和解密的总体顺序。
- call :Encode %1
- if defined WordName call :Decode WordName
- goto :eof
- :Encode
- title 正在加密,1000字符加解密用时50秒左右,请稍候 . . .
- call :WordToCode %1
- set CodeName=!CodeName:~1,1000000!!CodeName:~0,1!
- call :CodeToWord CodeName
- set WordName2=!WordName:~1!!WordName:~0,1!
- echo; 转换【!WordName2!】
- if exist "!FilePath!" echo;!WordName2!>>%~dp0!FileName!_转换.txt
- goto :eof
- :Decode
- title 正在解密,字符越长需要的时间越长! . . .
- call :WordToCode %1
- Rem echo; 解密编码【!CodeName!】
- set CodeName=!CodeName:~-1,1!!CodeName:~0,-1!
- call :CodeToWord CodeName
- if exist "!FilePath!" echo;!WordName!>>%~dp0!FileName!_原码.txt
- goto :eof
- :length 计算字符长度
- set "$=!%1!#"
- set len=&for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
- endlocal&If %2. neq . (set/a%2=%len%)else set /a len=%len%*2
- setlocal
- goto :eof
- :WordToCode 字符转编码
- set CodeName=
- for /l %%i in (0,1,%len%) do (
- for /l %%a in (0,1,%SymbolLen%) do if not "!%1:~%%i,1!"=="" if "!Symbol:~%%a,1!"=="!%1:~%%i,1!" (
- if %%a geq 10 (set CodeName=%%a!CodeName!) else (set CodeName=0%%a!CodeName!)
- )
- )
- goto :eof
- :CodeToWord 编码转字符
- set WordName=
- for /l %%i in (0,2,%len%) do (
- for /l %%a in (0,1,%SymbolLen%) do (
- if "!WordName!"=="!Input!" (set "WordName=!WordName!") else (
- if "!%1:~%%i,2!"=="%%a" set "WordName=!Symbol:~%%a,1!!WordName!"
- if "!%1:~%%i,2!"=="0%%a" set "WordName=!Symbol:~%%a,1!!WordName!"
- )
- )
- )
- goto :eof
复制代码
作者: 77七 时间: 2023-4-16 17:12
本帖最后由 77七 于 2023-4-16 17:20 编辑
回复 5# yiyue7
3楼,关于从文本输入的代码我都没改。暂时保留第60行,不知道文本输入是否需要这一行。
运行你修改的
- 输入或拖放文本至此:123
- 转换【hr^】
- 输入或拖放文本至此:hr^
- 转换【231】
- 输入或拖放文本至此:231
- 转换【r^h】
复制代码
运行我修改的
- 请输入:hr^
- 解密结果【231】
- 加密结果【123】
- 原密码【hr^】
- 请输入:123
- 解密结果【hr^】
- 加密结果【^hr】
- 原密码【123】
- 请输入:^hr
- 解密结果【123】
- 加密结果【312】
- 原密码【^hr】
- 请输入:231
- 解密结果【r^h】
- 加密结果【hr^】
- 原密码【231】
复制代码
输入一个字符串,有加解密两种结果,我觉得符合逻辑,符不符合代码的初衷我就不知道了....但是修改后的效果使用起来没问题
从你修改的,参照我修改的,输入123 后得到 的hr^是123的解密结果,再输入 hr^ 再次得到了hr^的解密结果,逻辑出问题了,导致了字符串顺序问题。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |