标题: [文本处理] 用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
参数说明:- Encode InFile OutFile PasFile
-
- InFile 明文文件
- OutFile 密文文件
- Pasword 密码(范围:-2,147,483,648 到 2,147,483,647)(若为 0 则等同于不加密)
复制代码
代码:- @Echo Off
- If "%~3" == "" (
- @Call :Usage
- @Exit /B 1
- )
- @Goto :Main
-
- :Main
-
- If Not Exist "%~1" (
- Echo.错误:无法访问明文文件
- @Exit /B 2
- )
-
- SetLocal EnableExtensions DisableDelayedExpansion
-
- For /F "Delims= Skip=1" %%_ in ('Certutil -hashFile "%~1" SHA256') Do (
- If Not Defined strHashInFile Set strHashInFile=%%_
- )
-
- For /F "Delims=" %%_ in ('Dir /B %~1') Do (
- Set lngFileSize=%%~z_
- )
-
- Certutil -EnCodeHex -F "%~1" %strHashInFile%.tmp
-
- SetLocal EnableExtensions EnableDelayedExpansion
-
- For /F "Tokens=1,2 Delims= " %%_ in ('Type "%strHashInFile%.tmp"') Do (
- Set /A lngTemp=0x%%_
- Set Line[!lngTemp!]=%%`
- )
-
- Set /A "lngTemp=lngFileSize"
-
- For /L %%_ in (0,16,%lngTemp%) Do (
- Set Line[%%_]=!Line[%%_]:~0,48!
- )
-
- Set lngIndex=0
-
- For /L %%_ in (0,16,%lngTemp%) Do (
- For %%# in (!Line[%%_]!) Do (
- If "%%#" Neq "" (
- Set /A bytData[!lngIndex!]=0x%%#
- Set /A lngIndex+=1
- )
- )
- )
-
- Set /A "lngTemp=%~3"
-
- For /L %%_ in (0,1,3) Do (
- Set /A "bytPassword[%%_]=lngTemp%%256"
- Set /A "lngTemp=(lngTemp-lngTemp%%256)/256"
- )
-
- For %%_ in (0 1 2 3 4 5 6 7 8 9 A B C D E F) Do (
- For %%` in (0 1 2 3 4 5 6 7 8 9 A B C D E F) Do (
- Set /A lngTemp=0x%%_%%`
- Set bytHexTab[!lngTemp!]=%%_%%`
- )
- )
-
- Set /A "lngTemp=lngIndex-1"
-
- For /L %%_ in (0,1,%lngTemp%) Do (
- Set /A "bytTemp=(%%_)%%4"
- Set /A "bytData[%%_]=bytData[%%_]^^bytPassword[!bytTemp!]"
- )
-
- Cd. > %strHashInFile%.tm$
-
- For /L %%_ in (0,1,%lngTemp%) Do (
- For %%` in (!bytData[%%_]!) Do (
- Set /P strTemp=!bytHexTab[%%`]! < Nul >> %strHashInFile%.tm$
- )
- )
-
- Certutil -DeCodeHex -F %strHashInFile%.tm$ "%~2"
-
-
- If Exist %strHashInFile%.tmp Del %strHashInFile%.tmp
- If Exist %strHashInFile%.tm$ Del %strHashInFile%.tm$
-
- EndLocal
-
- EndLocal
-
- @Exit /B 0
-
- :Usage
- Echo.Encode InFile OutFile PasFile
- Echo.
- Echo. InFile 明文文件
- Echo. OutFile 密文文件
- Echo. Pasword 密码(范围:-2,147,483,648 到 2,147,483,647)(若为 0 则等同于不加密)
- @Goto :Eof
复制代码
作者: 谐夜落风 时间: 2023-1-28 22:28
回复 5# HOPE2021
一看代码量就是大佬,跪了……现在没条件测试,况且也不是我提问的,还是看看楼主作何感想吧。
作者: HOPE2021 时间: 2023-1-29 07:48
1.1 版
修复了操作数错误的问题。
将- For /L %%_ in (0,1,3) Do (
- Set /A "bytPassword[%%_]=lngTemp%%256"
- Set /A "lngTemp=(lngTemp-lngTemp%%256)/256"
- )
复制代码
改为- For /L %%_ in (0,1,3) Do (
- Set /A "bytPassword[%%_]=lngTemp&0x000000FF"
- Set /A "lngTemp=(lngTemp>>8)&0x00FFFFFF"
- )
复制代码
源码:- @Echo Off
- If "%~3" == "" (
- @Call :Usage
- @Exit /B 1
- )
- @Goto :Main
-
- :Main
-
- If Not Exist "%~1" (
- Echo.错误:无法访问明文文件
- @Exit /B 2
- )
-
- SetLocal EnableExtensions DisableDelayedExpansion
-
- For /F "Delims= Skip=1" %%_ in ('Certutil -hashFile "%~1" SHA256') Do (
- If Not Defined strHashInFile Set strHashInFile=%%_
- )
-
- For /F "Delims=" %%_ in ('Dir /B %~1') Do (
- Set lngFileSize=%%~z_
- )
-
- Certutil -EnCodeHex -F "%~1" %strHashInFile%.tmp
-
- SetLocal EnableExtensions EnableDelayedExpansion
-
- For /F "Tokens=1,2 Delims= " %%_ in ('Type "%strHashInFile%.tmp"') Do (
- Set /A lngTemp=0x%%_
- Set Line[!lngTemp!]=%%`
- )
-
- Set /A "lngTemp=lngFileSize"
-
- For /L %%_ in (0,16,%lngTemp%) Do (
- Set Line[%%_]=!Line[%%_]:~0,48!
- )
-
- Set lngIndex=0
-
- For /L %%_ in (0,16,%lngTemp%) Do (
- For %%# in (!Line[%%_]!) Do (
- If "%%#" Neq "" (
- Set /A bytData[!lngIndex!]=0x%%#
- Set /A lngIndex+=1
- )
- )
- )
-
- Set /A "lngTemp=%~3"
-
- For /L %%_ in (0,1,3) Do (
- Set /A "bytPassword[%%_]=lngTemp&0x000000FF"
- Set /A "lngTemp=(lngTemp>>8)&0x00FFFFFF"
- )
-
- For %%_ in (0 1 2 3 4 5 6 7 8 9 A B C D E F) Do (
- For %%` in (0 1 2 3 4 5 6 7 8 9 A B C D E F) Do (
- Set /A lngTemp=0x%%_%%`
- Set bytHexTab[!lngTemp!]=%%_%%`
- )
- )
-
- Set /A "lngTemp=lngIndex-1"
-
- For /L %%_ in (0,1,%lngTemp%) Do (
- Set /A "bytTemp=(%%_)%%4"
- Set /A "bytData[%%_]=bytData[%%_]^^bytPassword[!bytTemp!]"
- )
-
- Cd. > %strHashInFile%.tm$
-
- For /L %%_ in (0,1,%lngTemp%) Do (
- For %%` in (!bytData[%%_]!) Do (
- Set /P strTemp=!bytHexTab[%%`]! < Nul >> %strHashInFile%.tm$
- )
- )
-
- Certutil -DeCodeHex -F %strHashInFile%.tm$ "%~2"
-
-
- If Exist %strHashInFile%.tmp Del %strHashInFile%.tmp
- If Exist %strHashInFile%.tm$ Del %strHashInFile%.tm$
-
- EndLocal
-
- EndLocal
-
- @Exit /B 0
-
- :Usage
- Echo.Encode InFile OutFile PasFile
- Echo.
- Echo. InFile 明文文件
- Echo. OutFile 密文文件
- Echo. Pasword 密码(范围:-2,147,483,648 到 2,147,483,647)(若为 0 则等同于不加密)
- @Goto :Eof
复制代码
作者: HOPE2021 时间: 2023-1-29 07:52
请您看看这样可以吗?
请将下面的脚本与 EnCode.Bat 放在同一目录下即可实现加密/解密- @Echo Off & Title 加密测试 & @Goto :Main
-
- :Main
- @Call :SetFileName
-
- @Call :SetTarget
-
- @Call :SetPassword
-
- Call EnCode.Bat "%strFileName%" "%strTargetFile%" %lngPassword%
-
- Echo.加密成功!请按任意键退出
- Pause > Nul
-
- @Exit /B 0
-
- :SetPassword
- Set /A lngPassword=%Random%
- Set /A "lngPassword=(lngPassword<<16)^%Random%"
- Set /P lngPassword=请输入您的密码(若回车则为%lngPassword%):
- Set /A lngPassword=lngPassword
- @Goto :Eof
-
- :SetTarget
- Set strTargetFile=//
- Set /P strTargetFile=请输入目标文件文件名:
- Set strTargetFile=%strTargetFile:"=%
- If "%strTargetFile%"=="//" (
- Echo.不合法的文件名!请重新输入
- @Call :SetTarget
- ) Else (
- If Exist "%strTargetFile%" (
- Echo.不能设置已存在的文件作为目标文件!请重新输入!
- @Call :SetTarget
- ) Else (
- @Goto :Eof
- )
- )
- @Goto :Eof
-
- :SetFileName
- Set strFileName=//
- Set /P strFileName=请拖入需要加密的文件获输入您想加密的文件文件名(如果此文件不存在,您将手动输入其内容):
- Set strFileName=%strFileName:"=%
-
- If "%strFileName%"=="//" (
- Echo.不合法的文件名!请重新输入!
- @Call :SetFileName
- ) Else (
- If Not Exist "%strFileName%" (
- Echo.编辑模式
- Echo.此模式可以逐行编辑,退出方法即新建一行再按 Ctrl + Z
- Echo.-- 编辑文件 --
- Copy Con "%strFileName%"
- )
- )
- @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://www.bathome.net/) |
Powered by Discuz! 7.2 |