Powershell运行Java脚本以加密密码

时间:2017-08-23 17:50:16

标签: java powershell

我们有许多使用扫描到文件夹选项的Lanier MFP允许人们获取文档,我们开始通过强制重置密码来对他们使用的AD密码实施更多安全措施。

不幸的是,Laniers对密码使用专有加密。我设法获得了一个功能性的Java命令,可以将密码加密成这种格式。我遇到的问题是我必须将这个编码密码放到PowerShell中才能将其传递给扫描仪。

我可以通过命令行运行Java命令,但不能将加密的密码作为打印机将接受的字符串传递回PowerShell(它需要在Base64中)。如果我确实将编码后的密码传递回PowerShell,然后通过PowerShell的Base64创建过程运行它,显然,对于扫描仪来说,它显然会发生太大变化。

我需要确定的是,是否有办法让我采用以下命令行命令,让它在PowerShell中运行,然后向我提供输出,以便将其传递给打印机。

java -cp ./commons-codec-1.10.jar;. cdm.GwpwesCharacterEncoding %pass% "gwpwes002"

Java命令根据以下行输出Base64字符串:

return new String(Base64.encodeBase64((byte[])encrypt));

例如,如果我将文本'Test'传递给它,我会得到字符串“HVhcmtla25meHVncHQ ==”

然而,这对我来说没用,因为我无法将其重新置于PowerShell中以传递给打印机,如果我使用PowerShell将其编码为Base64,则会显示为“MgBoAHMAWgBtADkAegBjADIAQgBxAGUAMABKAHgAWgBYAGgAbgBiAG0AMAB3AD0A”。

有人可以帮忙吗?

经过一些帮助修改后的代码:

$pass1 = "test"
$path = "c:\Test\printercreds"
$encode = "gwpwes002"

cd $path

$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pInfo.FileName = 'java'
$pInfo.Arguments = "-jar .\commons-codec-1.10.jar cdm.GwpwesCharacterEncoding $pass1 $encode"
$pInfo.UseShellExecute = $false
$pInfo.RedirectStandardOutput = $true
$pInfo.RedirectStandardError = $true
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $pInfo
[void]$process.Start()
$passsec = $process.StandardOutput.ReadtoEnd()
$process.WaitforExit()

write-host $passsec

1 个答案:

答案 0 :(得分:0)

请试试这个。它是GWPWES002的编码。我在这里找到了一个旧的java版本。 https://www.dropbox.com/s/3324g84x0l4bnon/GwpwesCharacterEncoding.java?dl=0

这种"编码"有一个弱点。编码的前部只是随机填充。 pack部分是存储实际字符串的位置。只需几次在同一个字符串上运行脚本就可以指出这个错误。

encodeGwpwes002 -code "a"

生成了这个哈希

  

np6eWFieWJ6eWA ==

     

np6eWJ5YWFieWA ==

     

WFienlhYnlieWA ==

     

nlhYnp5Ynp6eWA ==

     

nlieWFieWJ6eWA ==

直到eWA ==的所有内容都是随机填充意味着" eWA ==" ==" a"

同样适用于" aaaaaaaa"

  

np5YWJ5YnlieWFhYWFhYWFg =

     

np5Ynp6eWJ6eWFhYWFhYWFg =

     

nlienp6eWJ6eWFhYWFhYWFg =

     

WJ5YWJ6enlieWFhYWFhYWFg =

意思是

  

" eWFhYWFhYWFg ="是" aaaaaaaa"。

您提供的密码" test",操作的一个例子是:

  

HVhcmtla25meHVncHQ == IS" test" :: 29 88 92 154 217 90 219 153 158 29 89 220 29

     

HVhcmtla25meFVncHQ == IS"测试" :: 29 88 92 154 217 90 219 153 158 21 89 220 29

以下是我在下面翻译的powershell

#private static String encodeGwpwes002(String code, int codeSize) {
function encodeGwpwes002([string]$code, [int]$codeSize = 0){
    #byte[] protectCode;
    [byte]$protectCode | Out-Null
    #try {
    try{
        #protectCode = code.getBytes("UTF-8");
        $protectCode = [System.Text.Encoding]::UTF8.GetBytes($code)
    #}catch (Throwable e) {
    }catch{
        #return null;
        return $null
    #}
    }
    #int encodeSize = codeSize;
    [int]$encodeSize = $codeSize
    #if (protectCode.length >= codeSize) {
    if(($protectCode.length) -ge $codeSize){
        #encodeSize = protectCode.length + 9;
        $encodeSize = ($protectCode.length) + 9
    #}
    }
    #byte[] simple = new byte[encodeSize];
    [byte[]]$simple = New-Object byte[] $encodeSize
    #int diffuseCnt = 0;
    [int]$diffuseCnt = 0
    #int simpleCnt = 0;
    [int]$simpleCnt = 0
    #if (protectCode.length < encodeSize - 1) {
    if(($protectCode.length) -lt ($encodeSize - 1)){
        #for (diffuseCnt = 0; diffuseCnt < encodeSize - 1 - protectCode.length; ++diffuseCnt) {
        for($diffuseCnt = 0; $diffuseCnt -lt ($encodeSize - 1 - ($protectCode.length)); $diffuseCnt++){
            #simple[diffuseCnt] = (byte)(Math.random() * 25.0 + 97.0);
            $simple[$diffuseCnt] = [byte] (Get-Random -Maximum 0.9 -Minimum 0.1) * 25.0 + 97.0
        #}
        }
    #}
    }
    #simple[diffuseCnt++] = 122;
    $simple[$diffuseCnt++] = 122
    #for (simpleCnt = diffuseCnt; simpleCnt < protectCode.length + diffuseCnt; ++simpleCnt) {
    for($simpleCnt = $diffuseCnt; $simpleCnt -lt ($protectCode.length) + $diffuseCnt; $simpleCnt++){
        #simple[simpleCnt] = protectCode[simpleCnt - diffuseCnt];
        $simple[$simpleCnt] = $protectCode[$simpleCnt - $diffuseCnt];
    #}
    }
    #byte[] encrypt = new byte[simpleCnt];
    [byte[]] $encrypt = New-Object byte[] $simpleCnt
    #for (int i = 0; i < simpleCnt; ++i) {
    for([int]$i=0; $i -lt $simpleCnt; $i++)  {  
        #byte work = 0;
        [byte]$work = 0
        #work = (byte)((simple[i] & 192) >>> 6 | (simple[i] & 63) << 2);
        $work = [byte](($simple[$i] -band 192) -shr 6 -bor ($simple[$i] -band 63) -shl 2)
        #encrypt[i] = (byte)((work & 240) >>> 4 | (work & 15) << 4);
        $encrypt[$i] = [byte](($work -band 240) -shr 4 -bor ($work -band 15) -shl 4)
    #}
    }
    #return new String(Base64.encodeBase64((byte[])encrypt));
    return [string]([System.Convert]::ToBase64String([byte[]]$encrypt))
#}
}

encodeGwpwes002TEST -code "Test"