Шифр Цезаря 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%!


Есть идеи, пожалуйста? Спасибо

595   1  

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

    Ничего не найдено.