如何在Powershell中使用LM Hash

问题描述 投票:0回答:2

好的,所以我一直在研究这个,我不知道如何进一步。我一直在使用DESCryptoServiceProvider遇到障碍,不知何故它似乎没有出现正确的答案。

LM_Hash的sudo代码版本是:

LMHASH = concat(DES(Upper(PWD)[0..7],KGS!@#$%),DES(Upper(PWD)[8..13],KGS!@#$%))

第一个问题是LM Key我一直看到至少两个变种,它的“KGS!@#$%”或“KGS!+#$%”都没有得到我正确的答案,但两者似乎都不符合原始故事(它的KGS和SHIFT 12345假设英国的美式键盘是“KGS!”£$%“)

我很确定我现在正确设置了参数,但我的理解似乎让我失望了。这是我到目前为止,任何帮助表示赞赏我在Win 10上运行Powershell V5.1,加密的字符串作为$ string传入

    $plaintext = "KGS!@#$%"
    $OEM = [System.Text.Encoding]::GetEncoding($Host.CurrentCulture.TextInfo.OEMCodePage)
    $str1 = $OEM.GetBytes($string.substring(0,7)) +[Byte]$null
    $str2 = $OEM.GetBytes($string.Substring(7)) +[Byte]$null
    $IV = new-object "System.Byte[]" 8
    $hasher = New-Object -TypeName System.Security.Cryptography.DESCryptoServiceProvider -Property @{key=$str1; IV = $IV; mode = [System.Security.Cryptography.CipherMode]::ECB; Padding=[System.Security.Cryptography.PaddingMode]::None}
    $outbyte = new-object "System.Byte[]" 8
    $encrypter1 = $hasher.CreateEncryptor()
    $outbyte = $encrypter1.TransformFinalBlock($OEM.GetBytes($plaintext),0,8)
    $data1 = [System.BitConverter]::ToString($outbyte).replace("-","") 
    $encrypter1.Dispose()

理论上,这应该使用DES(使用字符串的前7个字符($ str1)作为键(末尾有一个空字节)加密密钥(它曾经是一个),然后我们这样做到下半部分( $ str2)并将它们连接起来以获得LMHASH。

windows powershell hash cryptography des
2个回答
0
投票

ASCII编码的字符串KGS!@#$%是正确使用的魔术常量

使用字符串的前7个字符($ str1)作为键(末尾带有空字节)

然而,这是不正确的。密钥不是通过在末尾用单个0字节填充7个字节的部分输入来组成的,而是通过将输入分成8个7位块并将它们左移一次(产生8个字节)。

在PowerShell中实现这一点的最简单方法可能是使用字符串,所以我可能会这样做:

# Convert string to byte array
$inBytes = $OEM.GetBytes($str1)

# Create a binary string from our bytes
$bitString = ''
foreach($byte in $inBytes){
    $bitstring += [convert]::ToString($byte, 2).PadLeft(8, '0')
}

# Partition the byte string into 7-bit chunks
[byte[]]$key = $bitString -split '(?<=\G.{7}(?<!$))' |ForEach-Object {
    # Insert 0 as the least significant bit in each chunk
    # Convert resulting string back to [byte]
    [convert]::ToByte("${_}0", 2)
}

try{
    # Create the first encryptor from our new key, and an empty IV
    [byte[]]$iv = ,0 * 8
    $enc = $hasher.GetEncryptor($key, $iv)

    # Calculate half of the hash
    $block1 = $enc.TransformFinalBlock($plaintext, 0, 8)
}
finally{
    # Dispose of the encryptor
    $enc.Dispose()
}

然后重复$str2并将结果块连接到完整的LM哈希


0
投票

任何有问题的人,基于@mathias R. Jessen上面的回答,这里有一个功能,计算一半LM-Hash接受7个字符串并输出哈希为Hex。

Function LM-hash {
    Param(
     [Parameter(mandatory=$true,ValueFromPipeline=$true,position=0)]
     [ValidateLength(7,7)]
     [String]$Invalue
    )
$plaintext = "KGS!@#$%"
$OEM = [System.Text.Encoding]::GetEncoding($Host.CurrentCulture.TextInfo.OEMCodePage)
$inBytes = $OEM.GetBytes($invalue)
$bitString = ''
foreach($byte in $inBytes){
    $bitstring += [convert]::ToString($byte, 2).PadLeft(8, '0')
}
[byte[]]$key = $bitString -split '(?<=\G.{7}(?<!$))' |ForEach-Object { [convert]::ToByte("${_}0", 2)}
$iv = new-object "System.Byte[]" 8
$DESCSP = New-Object -TypeName System.Security.Cryptography.DESCryptoServiceProvider -Property @{key=$key; IV = $IV; mode = [System.Security.Cryptography.CipherMode]::ECB; Padding=[System.Security.Cryptography.PaddingMode]::None}
$enc = $DESCSP.CreateEncryptor()
$block1 = $enc.TransformFinalBlock($OEM.GetBytes($plaintext), 0, 8)
return [System.BitConverter]::ToString($block1).replace("-","") 
$enc.Dispose()
}

这为哈希的一半提供了正确的结果,因此将每一半分别输入并连接字符串会为您提供完整的LM哈希

© www.soinside.com 2019 - 2024. All rights reserved.