【问题标题】:Batch to encrypt and decrypt passwords using vbscript and powershell with symmetric encryption使用对称加密的 vbscript 和 powershell 批量加密和解密密码
【发布时间】:2016-03-26 14:00:55
【问题描述】:

我想将一个使用具有对称加密功能的函数的 vbscript 集成到一个批处理文件中,该批处理文件要求用户使用 powershell to mask the input text 输入其密码:

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

所以,最后一个 Batch 脚本可以加密和解密字符串;但是当我只输入数字或类似的东西时它不起作用??? 例如,如果输入:

  1. 123456789 作为密码 ==> 不行
  2. hackoo123 作为密码 ==> 不行

感谢您的帮助!

【问题讨论】:

    标签: powershell batch-file vbscript passwords encryption-symmetric


    【解决方案1】:

    您的加密可能会产生 null(ascii 十进制 0)、回车(ascii 十进制 13)和换行(ascii 十进制 10)字节,当您将值写入文件然后尝试读取时,所有这些都会造成严重破坏它又回来了。可以在环境变量中使用回车符和换行符,但 null 是绝对不行的。

    好吧,故事差不多结束了。 Batch 可以使用 FC 以二进制模式逐字节读取二进制文件,以十六进制表示法输出每个字节。 (见HEXDUMP.BAT)但我认为你不想去那里。

    如果你想处理批处理环境变量中的加密值,那么我建议你想出一个新的加密方案来避免麻烦的字节。至少必须避免空字节。

    另一种选择是放弃对称加密,让 VBS 将加密形式转换为十六进制符号,然后再将其写入磁盘。

    这让我想到了另一个问题——你为什么要把密码写到磁盘上?这听起来不是一个好主意。

    最后一点 - 在命令行上传递任意字符串充满了危险。您最好传递包含该值的环境变量的名称,然后让被调用的例程从变量中获取值。当然 VBS 可以读取给定变量名称的环境变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-22
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多