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

[文本处理] 文本加密与解密的bat程序,希望高手能给解决一下BUG

这个程序可以加解密文本程序,但是加密后的字符再重新解密就会出现首尾颠倒的问题,例如加密123后的密文是:^hr但是解密后就成了312就是这个问题,有什么办法解决吗?求高手解决!
代码如下:
  1. @echo off
  2. set "Symbol= !#$%%&'()*+,-./0123456789;:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"…—·,。"
  3. setlocal enabledelayedexpansion
  4. call :length Symbol
  5. set /a SymbolLen=%len%/2
  6. ::echo;"%Symbol%"  验证,共%SymbolLen%位数。
  7. ::%Symbol%改编自ASCII,百分号变两个,双引号放后面,添加了几个中文标点符号。
  8. if exist "%~1" set "Input=%~1"&goto InputFile
  9. :Input 输入
  10. cls
  11. echo;
  12. echo;
  13. echo;  ﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
  14. echo;                   采用转换法将输入字符转换为新字符;字符转数字,可扩展。
  15. echo;                 每行最长支持4096字长;效率相对低些;可直接拖入文件编码。
  16. echo;                     默认使用数字、大小写字母、英文标点符号、空格等编码。
  17. echo;  ﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
  18. echo;
  19. set Input=
  20. set /p "Input=          请输入:"
  21. if not "!Input!"=="" (goto InputFile) else (goto Input)
  22. :InputFile 文件处理
  23. set num=0
  24. if exist "!Input!" (
  25.     for /f "tokens=*" %%a in ("!Input!") do set "FileName=%%~na"&set "FilePath=%%~dpa"
  26.     cd.>%~dp0!FileName!_Encode.txt&cd.>%~dp0!FileName!_Decode.txt
  27.     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
  28. ) else call :length Input&call :Contrl Input
  29. echo;
  30. title 》》编码完成。&echo;&echo;          编码完成!请按任意键返回 . . .
  31. pause>nul
  32. goto Input
  33. :Contrl 控制台,控制加密和解密的总体顺序。
  34. call :Encode %1
  35. ::##此处为加密调用,处理的是输入的字符Input。##
  36. if defined WordName call :Decode WordName
  37. ::##此处为解密调用,处理的是上次加密得到的结果WordName。##
  38. goto :eof
  39. :Encode
  40. title 》》正在加密,1000字符加解密用时50秒左右,请稍候  . . .
  41. call :WordToCode %1
  42. Rem echo;        加密编码【!CodeName!】
  43. ::##可在此处添加你的加密算法的具体引用和调节等。##
  44. set CodeName=!CodeName:~1,1000000!!CodeName:~0,1!
  45. ::##当前采用的是编码首字符移位到编码末尾之调整移位。##
  46. ::##注意:该编码对Symbol要求高,可能存在缺陷##
  47. call :CodeToWord CodeName
  48. echo;          新密码【!WordName!】
  49. if exist "!FilePath!" echo;!WordName!>>%~dp0!FileName!_Encode.txt
  50. goto :eof
  51. :Decode
  52. title 》》正在解密,字符越长需要的时间越长!  . . .
  53. call :WordToCode %1
  54. Rem echo;        解密编码【!CodeName!】
  55. ::##可在此处添加你的解密算法的具体引用和调节等。##
  56. set CodeName=!CodeName:~-1,1!!CodeName:~0,-1!
  57. ::##当前采用的是编码首字符移位到编码末尾之恢复移位##
  58. call :CodeToWord CodeName
  59. echo;          原密码【!WordName!】
  60. if exist "!FilePath!" echo;!WordName!>>%~dp0!FileName!_Decode.txt
  61. goto :eof
  62. :length 计算字符长度 code by plp626
  63. set "$=!%1!#"
  64. 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!
  65. endlocal&If %2. neq . (set/a%2=%len%)else set /a len=%len%*2
  66. setlocal
  67. goto :eof
  68. :WordToCode 字符转编码
  69. set CodeName=
  70. for /l %%i in (0,1,%len%) do (
  71.     for /l %%a in (0,1,%SymbolLen%) do if not "!%1:~%%i,1!"=="" if "!Symbol:~%%a,1!"=="!%1:~%%i,1!" (
  72.          if %%a geq 10 (set CodeName=%%a!CodeName!) else (set CodeName=0%%a!CodeName!)
  73.     )
  74. )
  75. goto :eof
  76. ::%%i针对输入字符串的字数,%%a针对元码个数。
  77. ::echo "!Symbol:~%%a,1!"=="!%1:~%%i,1!" %%a==!CodeName!
  78. :CodeToWord 编码转字符
  79. set WordName=
  80. for /l %%i in (0,2,%len%) do (
  81.     for /l %%a in (0,1,%SymbolLen%) do (
  82.         if  "!WordName!"=="!Input!" (set "WordName=!WordName!") else (
  83.             if  "!%1:~%%i,2!"=="%%a" set "WordName=!Symbol:~%%a,1!!WordName!"
  84.             if  "!%1:~%%i,2!"=="0%%a"  set "WordName=!Symbol:~%%a,1!!WordName!"
  85.         )
  86.     )
  87. )
  88. goto :eof
复制代码
以上就是代码信息了,高手也可以改进优化一下,让其使用更好些,感谢!

本帖最后由 77七 于 2023-4-16 17:20 编辑

回复 5# yiyue7


   3楼,关于从文本输入的代码我都没改。暂时保留第60行,不知道文本输入是否需要这一行。
运行你修改的
  1. 输入或拖放文本至此:123
  2.         转换【hr^】
  3. 输入或拖放文本至此:hr^
  4.         转换【231】
  5. 输入或拖放文本至此:231
  6.         转换【r^h】
复制代码


运行我修改的
  1. 请输入:hr^
  2.           解密结果【231】
  3.           加密结果【123】
  4.           原密码【hr^】
  5. 请输入:123
  6.           解密结果【hr^】
  7.           加密结果【^hr】
  8.           原密码【123】
  9. 请输入:^hr
  10.           解密结果【123】
  11.           加密结果【312】
  12.           原密码【^hr】
  13. 请输入:231
  14.           解密结果【r^h】
  15.           加密结果【hr^】
  16.           原密码【231】
复制代码


输入一个字符串,有加解密两种结果,我觉得符合逻辑,符不符合代码的初衷我就不知道了....但是修改后的效果使用起来没问题
从你修改的,参照我修改的,输入123 后得到 的hr^是123的解密结果,再输入 hr^ 再次得到了hr^的解密结果,逻辑出问题了,导致了字符串顺序问题。
bat小白,请多指教!谢谢!

TOP

  1. @echo off
  2. set "Symbol= !#$%%&'()*+,-./0123456789;:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"…—·,。"
  3. setlocal enabledelayedexpansion
  4. call :length Symbol
  5. set /a SymbolLen=%len%/2
  6. if exist "%~1" set "Input=%~1"&goto InputFile
  7. :Input 输入
  8. cls
  9. set Input=
  10. set /p "Input=输入或拖放文本至此:"
  11. if not "!Input!"=="" (goto InputFile) else (goto Input)
  12. :InputFile 文件处理
  13. set num=0
  14. if exist "!Input!" (
  15.     for /f "tokens=*" %%a in ("!Input!") do set "FileName=%%~na"&set "FilePath=%%~dpa"
  16.     cd.>%~dp0!FileName!_转换.txt&cd.>%~dp0!FileName!_原码.txt
  17.     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
  18. ) else call :length Input&call :Contrl Input
  19. echo;
  20. title 编码完成。&echo;&echo;        转换完成!请按任意键返回 . . .
  21. pause>nul
  22. goto Input
  23. :Contrl 控制台,控制加密和解密的总体顺序。
  24. call :Encode %1
  25. if defined WordName call :Decode WordName
  26. goto :eof
  27. :Encode
  28. title 正在加密,1000字符加解密用时50秒左右,请稍候  . . .
  29. call :WordToCode %1
  30. set CodeName=!CodeName:~1,1000000!!CodeName:~0,1!
  31. call :CodeToWord CodeName
  32. set WordName2=!WordName:~1!!WordName:~0,1!
  33. echo;        转换【!WordName2!】
  34. if exist "!FilePath!" echo;!WordName2!>>%~dp0!FileName!_转换.txt
  35. goto :eof
  36. :Decode
  37. title 正在解密,字符越长需要的时间越长!  . . .
  38. call :WordToCode %1
  39. Rem echo;        解密编码【!CodeName!】
  40. set CodeName=!CodeName:~-1,1!!CodeName:~0,-1!
  41. call :CodeToWord CodeName
  42. if exist "!FilePath!" echo;!WordName!>>%~dp0!FileName!_原码.txt
  43. goto :eof
  44. :length 计算字符长度
  45. set "$=!%1!#"
  46. 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!
  47. endlocal&If %2. neq . (set/a%2=%len%)else set /a len=%len%*2
  48. setlocal
  49. goto :eof
  50. :WordToCode 字符转编码
  51. set CodeName=
  52. for /l %%i in (0,1,%len%) do (
  53.     for /l %%a in (0,1,%SymbolLen%) do if not "!%1:~%%i,1!"=="" if "!Symbol:~%%a,1!"=="!%1:~%%i,1!" (
  54.          if %%a geq 10 (set CodeName=%%a!CodeName!) else (set CodeName=0%%a!CodeName!)
  55.     )
  56. )
  57. goto :eof
  58. :CodeToWord 编码转字符
  59. set WordName=
  60. for /l %%i in (0,2,%len%) do (
  61.     for /l %%a in (0,1,%SymbolLen%) do (
  62.         if  "!WordName!"=="!Input!" (set "WordName=!WordName!") else (
  63.             if  "!%1:~%%i,2!"=="%%a" set "WordName=!Symbol:~%%a,1!!WordName!"
  64.             if  "!%1:~%%i,2!"=="0%%a"  set "WordName=!Symbol:~%%a,1!!WordName!"
  65.         )
  66.     )
  67. )
  68. goto :eof
复制代码

TOP

回复 3# 77七


    非常感谢回复,在你的基础上稍作修改即可。

TOP

本帖最后由 77七 于 2023-4-16 11:08 编辑

将第48行
  1. echo;          新密码【!WordName!】
复制代码


改为
  1. set WordName2=!WordName:~1!!WordName:~0,1!
  2. echo;          解密结果【!WordName2!】
  3. echo;          加密结果【!WordName!】
复制代码


去掉第60行
  1. echo;          原密码【!WordName!】
复制代码


代码太深奥,看不明白。
简单的把结果移动下位置,这样直观显示每个字符串加密和解密的两种结果。

  1. 请输入:123
  2.           解密结果【hr^】
  3.           加密结果【^hr】
  4. 请输入:^hr
  5.           解密结果【123】
  6.           加密结果【312】
复制代码


第二次输入 对第一次加密结果解密
bat小白,请多指教!谢谢!

TOP

也可以直接拖放文本文件到该bat程序上进行转换

TOP

返回列表