Как сделать LM Hash в Powershell - PullRequest
0 голосов
/ 14 марта 2019

ОК, так что я немного поработал над этим, и я не вижу, как это сделать дальше. Я продолжаю сталкиваться с препятствиями с помощью DESCryptoServiceProvider, и почему-то кажется, что он не дает правильных ответов.

версия LM_Hash кода sudo:

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

Первая проблема - это ключ LM. Я по-прежнему вижу по крайней мере два варианта: «KGS! @ # $%» Или «KGS! + # $%», И я не получаю правильных ответов, но оба не соответствуют происхождению. история (его KGS и SHIFT 12345 в американской клавиатуре в Великобритании это "KGS!" £ $% ")

Я почти уверен, что теперь у меня правильно настроены параметры, но мое понимание, похоже, подводит меня. вот что у меня пока, любая помощь приветствуется. Я запускаю Powershell V5.1 на Win 10, строка для шифрования передается как $ 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.

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

у всех, у кого есть проблемы, основываясь на ответе @ mathias R. Jessen выше, здесь функция, которая вычисляет половину LM-хэша, принимает 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()
}

это дает правильный результат для половины хэша, так что при передаче каждой половины в seperatley и конкатенации строк вы получаете полный LM-хеш

0 голосов
/ 15 марта 2019

ASCII-кодированная строка KGS!@#$% - правильная магическая константа для использования

с использованием первых 7 символов строки ($ str1) в качестве ключа (с нулевым байтом в конце)

Это, однако, неверно. Ключ составляется не путем заполнения 7 байтов частичного ввода одним 0-байтовым символом в конце, а путем разделения ввода на 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

...