好的,所以我一直在研究这个,我不知道如何进一步。我一直在使用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。
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哈希
任何有问题的人,基于@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哈希