维热纳尔方阵结合base64给文本文件加密
思路:
base64 可以把任意文本文件转换成只有字母、数字、及+/= 字符的文本
再用维热纳尔方阵加密法对文本进行加密。
提示:
暂时不知道在忘记密匙的情况下如何解密,如有知道的欢迎给出破解方案
密匙字符可包含字母(区分大小写)、数字及@#$符号
代码需要base64.exe支持,会产生一个文件名为 tem 的临时文件。
加密后的文件理论上会比源文件大三分之一左右。
因为是逐字判断,所以效率很低,不知能不能用第三方工具提高点效率。
:- @echo off&setlocal enabledelayedexpansion
- :: @随风 @bbs.bathome.net @2009-05-23
- base64.exe -i "%~s0">nul 2>nul||(
- cls&echo/&echo 请先下载 base64.exe 文件
- echo/&pause&exit
- )
- set "x=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$"
- set "code=!x!"
- for /l %%a in (1 1 65) do (
- if %%a leq 26 (
- set /a .D!x:~0,1!=%%a&set ".DD!x:~0,1!=!x:~0,1!"
- ) else set /a .!x:~0,1!=%%a
- set "x=!x:~1!"
- )
- :xuanz1
- if "%~1"=="" (
- echo=&echo 请输入文件名完整路径或拖放文件来此
- echo=&set wjm=&set /p wjm=
- if defined wjm set "wjm=!wjm:"=!"
- if not exist "!wjm!" cls&goto xuanz1
- ) else set "wjm=%~1"
- set "lj=%~dp0"
- for /f "delims=" %%a in ("!wjm!") do set "wjm_=%%~na"
- :miy
- cls&echo/
- echo 请输入密匙,密匙可包含字母、数字及 @ # $ 这三个符号,字母区分大小写
- echo=&set "miy="&set /p miy=
- if not defined miy cls&goto miy
- :xuanz
- cls&echo/&echo 请选择 1 加密 2 解密
- echo=&set xuanz=&set /p xuanz=
- if "!xuanz!" equ "1" (set "wjm2=!wjm_! 密文.txt"&call :jiami) else (
- if "!xuanz!" equ "2" (set "wjm2=!wjm_! 明文.txt"&call :jiemi) else cls&goto xuanz
- )
- exit
- :jiemi 解密维热纳尔方阵还原为base64码
- setlocal&cls&set miy_=&echo=
- echo 正在解密 !wjm! 文件,请稍候。。。
- (for /f "usebackq delims=" %%a in ("!wjm!") do (
- set "miw1=%%a"&set "miw2="&set "minwen="
- for /l %%i in (0 1 63) do (
- if not "!miw1:~%%i,1!"=="" set miw2=!miw2! !miw1:~%%i,1!
- )
- for %%i in (!miw2!) do (
- if not defined miy_ set "miy_=!miy!"
- if "%%i"=="!.DD%%i!" (set /a w1=!.D%%i!) else set /a w1=!.%%i!
- set "miy2=!miy_:~0,1!"
- for %%j in (!miy2!) do (
- if "%%j"=="!.DD%%j!" (set /a w2=.D%%j) else set /a w2=.%%j
- )
- set /a w3=w1-w2
- for %%j in (!w3!) do set minwen=!minwen!!code:~%%j,1!
- if "!minwen:~-1!"=="$" set "minwen=!minwen:~0,-1!="
- if "!minwen:~-2,1!"=="$" set "minwen=!minwen:~0,-2!=!minwen:~-1!"
- set "minwen=!minwen:@=+!"&set "minwen=!minwen:#=/!"
- set "miy_=!miy_:~1!"
- )
- (echo !minwen!)
- ))>"!lj!tem"
- base64.exe -d !lj!tem"">"!lj!!wjm2!"
- del/q "!lj!tem"&start "" "!lj!!wjm2!"
- endlocal&goto :EOF
- :jiami 用维热纳尔方阵给base64码文本加密
- setlocal&cls&set miy_=&echo=
- echo 正在加密 !wjm! 文件,请稍候。。。
- base64.exe -i "!wjm!">"!lj!tem"
- (for /f "usebackq delims=" %%a in ("!lj!tem") do (
- set "miw1=%%a"&set miw1=!miw1:+=@!
- set miw1=!miw1:/=#!&set miwen=&set "miw2="
- if "!miw1:~-1,1!"=="=" set "miw1=!miw1:~0,-1!$"
- if "!miw1:~-2,1!"=="=" set "miw1=!miw1:~0,-2!$!miw1:~-1!"
- for /l %%i in (0 1 63) do (
- if not "!miw1:~%%i,1!"=="" set miw2=!miw2! !miw1:~%%i,1!
- )
- for %%i in (!miw2!) do (
- if not defined miy_ set "miy_=!miy!"
- if "%%i"=="!.DD%%i!" (set /a w1=!.D%%i!) else set /a w1=!.%%i!
- set "miy2=!miy_:~0,1!"
- for %%j in (!miy2!) do (
- if "%%j"=="!.DD%%j!" (set /a w2=.D%%j) else set /a w2=.%%j
- )
- set /a w3=^(w1+w2-2^)%%65
- for %%w in (!w3!) do set "miwen=!miwen!!code:~%%w,1!"
- set "miy_=!miy_:~1!"
- )
- (echo !miwen!)
- ))>"!lj!!wjm2!"
- del/q "!lj!tem"&start "" "!lj!!wjm2!"
- endlocal&goto :EOF
复制代码
|