找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 24515|回复: 9

[文本处理] 用bat对字符串进行加密

[复制链接]
发表于 2023-1-28 19:43:26 | 显示全部楼层 |阅读模式
能不能对输入的一串字符利用某种算法进行加密,生成密文,最后能通过某个字符串(密钥进行解密)?
发表于 2023-1-28 19:57:10 | 显示全部楼层
certutil.exe 可以对文件base64加密解密
发表于 2023-1-28 20:27:17 | 显示全部楼层
回复 2# czjt1234
certutil 只是对文件进行编码,不用密钥也能解开……

最起码也得用“异或”算法进行加密/解密
发表于 2023-1-28 21:49:54 | 显示全部楼层
期待有肝帝把异或算法用批处理这个脚本语言搓出来。
批处理又没法获得一串数据的二进制形式,怎么异或呢?还要生成密钥……不如网上直接下个加密文本的软件吧,别在批处理上折腾了。
发表于 2023-1-28 22:19:50 | 显示全部楼层
本帖最后由 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:42 | 显示全部楼层
回复 5# HOPE2021


    一看代码量就是大佬,跪了……现在没条件测试,况且也不是我提问的,还是看看楼主作何感想吧。
发表于 2023-1-29 07:48:02 | 显示全部楼层
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
复制代码
发表于 2023-1-29 07:52:01 | 显示全部楼层
请您看看这样可以吗?
请将下面的脚本与 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.        
  37.         If "%strFileName%"=="//" (
  38.                 Echo.不合法的文件名!请重新输入!
  39.                 @Call :SetFileName
  40.         ) Else (
  41.                 If Not Exist "%strFileName%" (
  42.                         Echo.编辑模式
  43.                         Echo.此模式可以逐行编辑,退出方法即新建一行再按 Ctrl + Z
  44.                         Echo.-- 编辑文件 --
  45.                         Copy Con "%strFileName%"
  46.                 )
  47.         )
  48. @Goto :Eof
复制代码
发表于 2023-1-29 08:18:22 | 显示全部楼层
发表于 2025-1-15 12:41:30 | 显示全部楼层
回复 8# HOPE2021


厉害!佩服!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 12:45 , Processed in 0.020786 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表