Board logo

标题: [文本处理] 用bat对字符串进行加密 [打印本页]

作者: crazy2023    时间: 2023-1-28 19:43     标题: 用bat对字符串进行加密

能不能对输入的一串字符利用某种算法进行加密,生成密文,最后能通过某个字符串(密钥进行解密)?
作者: czjt1234    时间: 2023-1-28 19:57

certutil.exe 可以对文件base64加密解密
作者: HOPE2021    时间: 2023-1-28 20:27

回复 2# czjt1234
certutil 只是对文件进行编码,不用密钥也能解开……

最起码也得用“异或”算法进行加密/解密
作者: 谐夜落风    时间: 2023-1-28 21:49

期待有肝帝把异或算法用批处理这个脚本语言搓出来。
批处理又没法获得一串数据的二进制形式,怎么异或呢?还要生成密钥……不如网上直接下个加密文本的软件吧,别在批处理上折腾了。
作者: HOPE2021    时间: 2023-1-28 22:19

本帖最后由 HOPE2021 于 2023-1-29 07:06 编辑

回复 4# 谐夜落风
请将此实例另存为 EnCode.Bat,加密和解密都可以使用此脚本进行操作,只有相同的密码才能保证解密成功。
兼容性说明:
Windows Vista 及更高版本的 Windows 操作系统
速度说明:较慢,不建议处理 4 KB 以上内容
附注:此程序处理较大文件时可能产生未知 Bug
参数说明:
  1. Encode InFile OutFile PasFile
  2.   InFile  明文文件
  3.   OutFile 密文文件
  4.   Pasword 密码(范围:-2,147,483,648 到 2,147,483,647)(若为 0 则等同于不加密)
复制代码
代码:
  1. @Echo Off
  2. If "%~3" == "" (
  3. @Call :Usage
  4. @Exit /B 1
  5. )
  6. @Goto :Main
  7. :Main
  8. If Not Exist "%~1" (
  9. Echo.错误:无法访问明文文件
  10. @Exit /B 2
  11. )
  12. SetLocal EnableExtensions DisableDelayedExpansion
  13. For /F "Delims= Skip=1" %%_ in ('Certutil -hashFile "%~1" SHA256') Do (
  14. If Not Defined strHashInFile Set strHashInFile=%%_
  15. )
  16. For /F "Delims=" %%_ in ('Dir /B %~1') Do (
  17. Set lngFileSize=%%~z_
  18. )
  19. Certutil -EnCodeHex -F "%~1" %strHashInFile%.tmp
  20. SetLocal EnableExtensions EnableDelayedExpansion
  21. For /F "Tokens=1,2 Delims= " %%_ in ('Type "%strHashInFile%.tmp"') Do (
  22. Set /A lngTemp=0x%%_
  23. Set Line[!lngTemp!]=%%`
  24. )
  25. Set /A "lngTemp=lngFileSize"
  26. For /L %%_ in (0,16,%lngTemp%) Do (
  27. Set Line[%%_]=!Line[%%_]:~0,48!
  28. )
  29. Set lngIndex=0
  30. For /L %%_ in (0,16,%lngTemp%) Do (
  31. For %%# in (!Line[%%_]!) Do (
  32. If "%%#" Neq "" (
  33. Set /A bytData[!lngIndex!]=0x%%#
  34. Set /A lngIndex+=1
  35. )
  36. )
  37. )
  38. Set /A "lngTemp=%~3"
  39. For /L %%_ in (0,1,3) Do (
  40. Set /A "bytPassword[%%_]=lngTemp%%256"
  41. Set /A "lngTemp=(lngTemp-lngTemp%%256)/256"
  42. )
  43. For %%_ in (0 1 2 3 4 5 6 7 8 9 A B C D E F) Do (
  44. For %%` in (0 1 2 3 4 5 6 7 8 9 A B C D E F) Do (
  45. Set /A lngTemp=0x%%_%%`
  46. Set bytHexTab[!lngTemp!]=%%_%%`
  47. )
  48. )
  49. Set /A "lngTemp=lngIndex-1"
  50. For /L %%_ in (0,1,%lngTemp%) Do (
  51. Set /A "bytTemp=(%%_)%%4"
  52. Set /A "bytData[%%_]=bytData[%%_]^^bytPassword[!bytTemp!]"
  53. )
  54. Cd. > %strHashInFile%.tm$
  55. For /L %%_ in (0,1,%lngTemp%) Do (
  56. For %%` in (!bytData[%%_]!) Do (
  57. Set /P strTemp=!bytHexTab[%%`]! < Nul >> %strHashInFile%.tm$
  58. )
  59. )
  60. Certutil -DeCodeHex -F %strHashInFile%.tm$ "%~2"
  61. If Exist %strHashInFile%.tmp Del %strHashInFile%.tmp
  62. If Exist %strHashInFile%.tm$ Del %strHashInFile%.tm$
  63. EndLocal
  64. EndLocal
  65. @Exit /B 0
  66. :Usage
  67. Echo.Encode InFile OutFile PasFile
  68. Echo.
  69. Echo.  InFile  明文文件
  70. Echo.  OutFile 密文文件
  71. Echo.  Pasword 密码(范围:-2,147,483,648 到 2,147,483,647)(若为 0 则等同于不加密)
  72. @Goto :Eof
复制代码

作者: 谐夜落风    时间: 2023-1-28 22:28

回复 5# HOPE2021


    一看代码量就是大佬,跪了……现在没条件测试,况且也不是我提问的,还是看看楼主作何感想吧。
作者: HOPE2021    时间: 2023-1-29 07:48

1.1 版
修复了操作数错误的问题。
  1. For /L %%_ in (0,1,3) Do (
  2. Set /A "bytPassword[%%_]=lngTemp%%256"
  3. Set /A "lngTemp=(lngTemp-lngTemp%%256)/256"
  4. )
复制代码
改为
  1. For /L %%_ in (0,1,3) Do (
  2. Set /A "bytPassword[%%_]=lngTemp&0x000000FF"
  3. Set /A "lngTemp=(lngTemp>>8)&0x00FFFFFF"
  4. )
复制代码
源码:
  1. @Echo Off
  2. If "%~3" == "" (
  3. @Call :Usage
  4. @Exit /B 1
  5. )
  6. @Goto :Main
  7. :Main
  8. If Not Exist "%~1" (
  9. Echo.错误:无法访问明文文件
  10. @Exit /B 2
  11. )
  12. SetLocal EnableExtensions DisableDelayedExpansion
  13. For /F "Delims= Skip=1" %%_ in ('Certutil -hashFile "%~1" SHA256') Do (
  14. If Not Defined strHashInFile Set strHashInFile=%%_
  15. )
  16. For /F "Delims=" %%_ in ('Dir /B %~1') Do (
  17. Set lngFileSize=%%~z_
  18. )
  19. Certutil -EnCodeHex -F "%~1" %strHashInFile%.tmp
  20. SetLocal EnableExtensions EnableDelayedExpansion
  21. For /F "Tokens=1,2 Delims= " %%_ in ('Type "%strHashInFile%.tmp"') Do (
  22. Set /A lngTemp=0x%%_
  23. Set Line[!lngTemp!]=%%`
  24. )
  25. Set /A "lngTemp=lngFileSize"
  26. For /L %%_ in (0,16,%lngTemp%) Do (
  27. Set Line[%%_]=!Line[%%_]:~0,48!
  28. )
  29. Set lngIndex=0
  30. For /L %%_ in (0,16,%lngTemp%) Do (
  31. For %%# in (!Line[%%_]!) Do (
  32. If "%%#" Neq "" (
  33. Set /A bytData[!lngIndex!]=0x%%#
  34. Set /A lngIndex+=1
  35. )
  36. )
  37. )
  38. Set /A "lngTemp=%~3"
  39. For /L %%_ in (0,1,3) Do (
  40. Set /A "bytPassword[%%_]=lngTemp&0x000000FF"
  41. Set /A "lngTemp=(lngTemp>>8)&0x00FFFFFF"
  42. )
  43. For %%_ in (0 1 2 3 4 5 6 7 8 9 A B C D E F) Do (
  44. For %%` in (0 1 2 3 4 5 6 7 8 9 A B C D E F) Do (
  45. Set /A lngTemp=0x%%_%%`
  46. Set bytHexTab[!lngTemp!]=%%_%%`
  47. )
  48. )
  49. Set /A "lngTemp=lngIndex-1"
  50. For /L %%_ in (0,1,%lngTemp%) Do (
  51. Set /A "bytTemp=(%%_)%%4"
  52. Set /A "bytData[%%_]=bytData[%%_]^^bytPassword[!bytTemp!]"
  53. )
  54. Cd. > %strHashInFile%.tm$
  55. For /L %%_ in (0,1,%lngTemp%) Do (
  56. For %%` in (!bytData[%%_]!) Do (
  57. Set /P strTemp=!bytHexTab[%%`]! < Nul >> %strHashInFile%.tm$
  58. )
  59. )
  60. Certutil -DeCodeHex -F %strHashInFile%.tm$ "%~2"
  61. If Exist %strHashInFile%.tmp Del %strHashInFile%.tmp
  62. If Exist %strHashInFile%.tm$ Del %strHashInFile%.tm$
  63. EndLocal
  64. EndLocal
  65. @Exit /B 0
  66. :Usage
  67. Echo.Encode InFile OutFile PasFile
  68. Echo.
  69. Echo.  InFile  明文文件
  70. Echo.  OutFile 密文文件
  71. Echo.  Pasword 密码(范围:-2,147,483,648 到 2,147,483,647)(若为 0 则等同于不加密)
  72. @Goto :Eof
复制代码

作者: HOPE2021    时间: 2023-1-29 07:52

请您看看这样可以吗?
请将下面的脚本与 EnCode.Bat 放在同一目录下即可实现加密/解密
  1. @Echo Off & Title 加密测试 & @Goto :Main
  2. :Main
  3. @Call :SetFileName
  4. @Call :SetTarget
  5. @Call :SetPassword
  6. Call EnCode.Bat "%strFileName%" "%strTargetFile%" %lngPassword%
  7. Echo.加密成功!请按任意键退出
  8. Pause > Nul
  9. @Exit /B 0
  10. :SetPassword
  11. Set /A lngPassword=%Random%
  12. Set /A "lngPassword=(lngPassword<<16)^%Random%"
  13. Set /P lngPassword=请输入您的密码(若回车则为%lngPassword%):
  14. Set /A lngPassword=lngPassword
  15. @Goto :Eof
  16. :SetTarget
  17. Set strTargetFile=//
  18. Set /P strTargetFile=请输入目标文件文件名:
  19. Set strTargetFile=%strTargetFile:"=%
  20. If "%strTargetFile%"=="//" (
  21. Echo.不合法的文件名!请重新输入
  22. @Call :SetTarget
  23. ) Else (
  24. If Exist "%strTargetFile%" (
  25. Echo.不能设置已存在的文件作为目标文件!请重新输入!
  26. @Call :SetTarget
  27. ) Else (
  28. @Goto :Eof
  29. )
  30. )
  31. @Goto :Eof
  32. :SetFileName
  33. Set strFileName=//
  34. Set /P strFileName=请拖入需要加密的文件获输入您想加密的文件文件名(如果此文件不存在,您将手动输入其内容):
  35. Set strFileName=%strFileName:"=%
  36. If "%strFileName%"=="//" (
  37. Echo.不合法的文件名!请重新输入!
  38. @Call :SetFileName
  39. ) Else (
  40. If Not Exist "%strFileName%" (
  41. Echo.编辑模式
  42. Echo.此模式可以逐行编辑,退出方法即新建一行再按 Ctrl + Z
  43. Echo.-- 编辑文件 --
  44. Copy Con "%strFileName%"
  45. )
  46. )
  47. @Goto :Eof
复制代码

作者: Batcher    时间: 2023-1-29 08:18

回复 1# crazy2023


试试:
http://bbs.bathome.net/thread-1278-1-1.html
http://bbs.bathome.net/thread-4648-1-1.html




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2