这个程序可以加解密文本程序,但是加密后的字符再重新解密就会出现首尾颠倒的问题,例如加密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
复制代码 以上就是代码信息了,高手也可以改进优化一下,让其使用更好些,感谢! |