0

Я хочу интегрировать VBScript, которые используют функцию с симметричной функцией шифрования в пакетный файл, который попросит пользователя ввести свой пароль с помощью powershell to mask the input text:Batch для шифрования и расшифровки паролей с использованием 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 
'*************************************************************************** 

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

Комбинированный Batch-файл:

@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 
::******************************************************************************** 

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

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

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

ответ

1

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

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

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

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

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

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