Пакетное шифрование и расшифровка паролей с использованием vbscript и powershell с симметричным шифрованием

Я хочу интегрировать vbscript, который использует функцию с функцией симметричного шифрования, в пакетный файл, который просит пользователя ввести свой пароль, используя powershell для маскировки вводимого текста :

@echo off
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
echo %password%
pause

Код Vbscript:

Encrypted_String = Crypt("123456789")
wscript.echo Encrypted_String
Decrypted_String = Crypt(Encrypted_String)
wscript.echo Decrypted_String
'***************************************************************************
Function Crypt(text) 
Dim i,a
For i = 1 to len(text)
      a = i mod len(255)
      if a = 0 then a = len(255)
      Crypt = Crypt & chr(asc(mid(255,a,1)) XOR asc(mid(text,i,1)))
Next
End Function
'***************************************************************************

Итак, я пытаюсь объединить эти коды в такой пакетный файл:

Объединенный пакетный файл:

@echo off & Setlocal EnableDelayedExpansion
Title %~n0 - Encrypt_Decrypt passwords by Hackoo 2016
Mode 60,5 & Color 0E
:Main
Call :Clean
Call :InputPassword "Please choose your password" MyPass
Call :Crypt_Decrypt !MyPass! >%tmp%\MyCryptedPass.txt
(set /p CryptPass=)<%tmp%\MyCryptedPass.txt
echo The encrypted password is :!CryptPass! 
pause
cls
Call :Crypt_Decrypt !CryptPass!>%tmp%\MyPlaintextPass.txt
(set /P MyPlaintextPass=)<%tmp%\MyPlaintextPass.txt
echo The password in plain text is : !MyPlaintextPass! 
pause
Goto :Main
::********************************************************************************
:InputPassword
Cls
echo.
set "psCommand=powershell -Command "$pword = read-host '%1' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
      [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
        for /f "usebackq delims=" %%p in (`%psCommand%`) do set %2=%%p
Goto :eof   
::********************************************************************************
:Crypt_Decrypt
Call :Clean
(
echo StringEnCrypted = Crypt("%~1"^)
echo wscript.echo StringEnCrypted
echo '****************************************************************************
echo Function Crypt(text^) 
echo Dim i,a
echo For i = 1 to len(text^)
echo       a = i mod len(255^)
echo       if a = 0 then a = len(255^)
echo       Crypt = Crypt ^& chr(asc(mid(255,a,1^)^) XOR asc(mid(text,i,1^)^)^)
echo Next
echo End Function
echo '****************************************************************************
)>%tmp%\Crypt_Decrypt.vbs
cscript /nologo %tmp%\Crypt_Decrypt.vbs
goto :eof
::********************************************************************************
:Clean
If Exist %tmp%\Crypt_Decrypt.vbs Del %tmp%\Crypt_Decrypt.vbs
goto :eof
::********************************************************************************

Итак, этот последний пакетный скрипт может шифровать и расшифровывать строки; но когда я ввожу только цифры или что-то в этом роде, это не сработало??? Например, если ввести:

  1. 123456789 в качестве пароля ==> Не в порядке
  2. hackoo123 в качестве пароля ==> Не в порядке

Спасибо за помощь !


person Hackoo    schedule 26.03.2016    source источник


Ответы (1)


Ваше шифрование может создавать нулевые (десятичное ascii 0), возврат каретки (десятичное ascii 13) и новую строку (десятичное ascii 10) байты, и все это приведет к хаосу, когда вы записываете значение в файл, а затем пытаетесь прочитать его обратно в опять таки. Можно работать с возвратом каретки и новой строкой в ​​переменных окружения, но null — это абсолютный запрет.

Ну, почти конец истории. Пакет может использовать FC в двоичном режиме для чтения двоичного файла, байт за байтом, выводя каждый байт в шестнадцатеричном формате. (см. HEXDUMP.BAT). Но я не думаю, что вы захотите иди туда.

Если вы хотите иметь дело с зашифрованными значениями в пакетных переменных среды, я предлагаю вам придумать новую схему шифрования, которая позволяет избежать проблемных байтов. Как минимум, вы должны избегать нулевых байтов.

Другим вариантом было бы отказаться от симметричного шифрования и позволить VBS преобразовать зашифрованную форму в шестнадцатеричную нотацию, прежде чем вы запишете ее на диск.

Что приводит меня к другой проблеме: почему вы записываете пароль на диск? Это не звучит как хорошая идея.

Последнее замечание. Передача произвольных строк в командной строке чревата опасностью. Лучше передать имя переменной среды, которая содержит значение, а затем позволить вызываемой подпрограмме получить значение из переменной. Конечно, VBS может прочитать переменную среды по имени переменной.

person dbenham    schedule 26.03.2016