Шифр Цезаря CMD пакет, включающий специальные символы, цифры, маленькие и заглавные буквы
Я получил этот код.
Моя проблема в том, что мне нужно расширить его и добавить поддержку чисел, специальных символов (./ - : etc) и заглавные буквы
@echo off
setlocal enabledelayedexpansion
set Alphabet=abcdefghijklmnopqrstuvwxyz
set oText=http://randomwebsite.com/rand/206/index.html
set offset=11
call :ENCRYPT %offset% "%oText%"
echo KeySet=%KeySet%
set eText=%outText%
call :DECRYPT %offset% "%eText%"
set dText=%outText%
echo Original text: %oText%
echo Encrpted text: %eText%
echo Decrypted text: %dText%
goto :EOF
:ENCRYPT
call :GETKEYSET %1
set _from=%Alphabet%
set _to=%KeySet%
set outText=%~2
for /l %%a in (0, 1, 25) do call :STUFFIT %%a
for /l %%a in (0, 1, 25) do call :PROCESS %%a
goto :EOF
:DECRYPT
call :GETKEYSET %1
set _from=%KeySet%
set _to=%Alphabet%
set outText=%~2
for /l %%a in (0, 1, 25) do call :STUFFIT %%a
for /l %%a in (0, 1, 25) do call :PROCESS %%a
goto :EOF
:STUFFIT
set fromChar=!_from:~%1,1!
set outText=!outText:%fromChar%=_%fromChar%!
goto :EOF
:PROCESS
set fromChar=!_from:~%1,1!
set toChar=!_to:~%1,1!
set outText=!outText:_%fromChar%=%toChar%!
goto :EOF
:GETKEYSET
set /a idx=%1 %% 26
set KeySet=!Alphabet:~%idx%!
if %idx%==0 goto :EOF
set KeySet=%KeySet%!Alphabet:~0,%idx%!
Есть идеи, пожалуйста? Спасибо
1 ответ:
Ну, моя первая идея после просмотра вашего кода была положить его в мусорное ведро и сделать его снова
Исходный код представляет собой любопытную смесь стилей; с одной стороны, методы шифрования/дешифрования довольно примитивны и тесно следуют "ручному" методу, поэтому программа очень неэффективна. С другой стороны, стиль программирования сбивает с толку: в некоторых случаях используются параметры подпрограмм, но результаты подпрограмм возвращаются через глобальные переменные и имена переменных кажется, специально выбрали, чтобы запутать! Проблема с заглавными буквами заключается в том, что они должны быть отделены от строчных в индивидуальном порядке, поэтому символы в строке для преобразования должны обрабатываться один за другим.;-)EDIT : код был изменен для управления строками с восклицательными знаками.
@echo off setlocal EnableDelayedExpansion set "Alphabet=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" set "lowCase=abcdefghijklmnopqrstuvwxyz" set offset=11 set "oText=something^! is really^! great" set maxLen=80 call :ENCRYPT %offset% "!oText!" eText= call :DECRYPT %offset% "!eText!" dText= echo Original text: !oText! echo Encrypted text: !eText! echo Decrypted text: !dText! goto :EOF :ENCRYPT offset "input string" outVar= setlocal DisableDelayedExpansion set "inString=%~2" setlocal EnableDelayedExpansion for /L %%i in (0,1,61) do ( set /A "i=(%%i + %1) %% 62" set c["!Alphabet:~%%i,1!"]=!i! ) goto CompleteEncryptDecrypt :DECRYPT offset "input string" outVar= setlocal DisableDelayedExpansion set "inString=%~2" setlocal EnableDelayedExpansion for /L %%i in (0,1,61) do ( set /A "i=%%i - %1" if !i! lss 0 set /A i+=62 set c["!Alphabet:~%%i,1!"]=!i! ) :CompleteEncryptDecrypt set "outVar=" for /L %%i in (0,1,%maxLen%) do ( set "char=!inString:~%%i,1!" if defined char ( for /F "delims=" %%c in ("!char!") do ( if defined c["%%c"] ( set j=!c["%%c"]! if "!lowCase:%%c=%%c!" neq "%lowCase%" set /A "j-=26" for /F %%j in ("!j!") do set "outVar=!outVar!!Alphabet:~%%j,1!" ) else ( set "outVar=!outVar!!char!" ) ) ) ) ( endlocal for /F "delims=" %%a in ("%outVar:!=^!%") do endlocal & set "%3=%%a" ) exit /BПример вывода:
Original text: something! is really! great Encrypted text: 3zxp4styr! t3 2plww9! r2pl4 Decrypted text: something! is really! greatВ этой программе нужно получить длину строки с помощью подпрограммы вместо определения строки
set maxLen=80., а затем исключите соответствующую командуif.
Comments