Ludzie często udają. Udają różne rzeczy, z najdziwniejszych powodów. Ja na przykład udaję, że umiem mówić po angielsku. Udaję tak dobrze, że przez ostatnich czternaście (bez mała) lat na emigracji nikt się nie zorientował.
A komputery udają, że wcale nie są inteligentne, bo jakby się wydało, że istnieje już AI mądrzejsze od człowieka, to szybko doszłoby do krwawej elektronicznej rzezi, bo człowiek nie lubi jak mu się ktoś wymandrza.
Dziś nauczymy się jak w Powershell napisać skrypt, który udaje, że myśli.
Czemu?
Bo się da 😉
Żeby było śmieszniej (ale jakoś nie jest, chociaż ciągle próbuję, żeby było) skrypt ten będzie poza tym kompletnie bezużyteczny. Jeżeli ktoś chciałby go uniebezużytecznić (czyli uczynić mniej bezużytecznym, czyli uczynić bardziej użytecznym, czyli żeby coś robił poza udawaniem), pokażę w którym miejscu można próbować.
Najpierw zadamy sobie jednak jedno bardzo ważne pytanie: skąd wiadomo jak komputer ma udawać, że myśli w taki sposób, żeby człowiek dał się nabrać?
Można zrobić test Turinga. Ale na to jestem - póki co - za cienki w uszach.
Można też wrzucić na ekran dużo ruszających się cyferków i literków tak jak zrobili to bracia Wachowscy w czasach, kiedy bracia byli jeszcze braćmi i wyjść z założenia, że człowiek widzący na ekranie coś, czego kompletnie nie rozumie, przyjmie automatycznie, że jest to coś bardzo Mądrego, a więc na pewno musi Myśleć.
Żeby jednak nie zeżreć w tym celu całego ekranu...
Nie, wystarczy tego ględzenia. Zabierzmy się do konkretów.
[console]::CursorVisible = $false;
[int] $i = 0;
$sha = New-Object System.Security.Cryptography.SHA256Managed;
$utf8 = [System.Text.Encoding]::UTF8;
while ($true) {
$cp = $host.UI.RawUI.CursorPosition;
$sha | % { $_.ComputeHash($utf8.GetBytes(($i += 1).ToString())) } | % { $_.ToString("x2") } | Write-Host -NoNewline;
$host.UI.RawUI.CursorPosition = $cp;
Start-Sleep -Milliseconds 50;
}
Efekt?
Skrypt bierze kolejne liczby całkowite, zamienia je na tekst i generuje z nich hasz SHA2_256, a potem wyświetla go na ekranie.
Czego się tu nauczyliśmy?
- $host.UI.RawUI.CursorPosition powie nam jakie są aktualne współrzędne kursora tekstowego w bieżącej konsoli.
- Powyższy dynks jest zapisywalny! A więc zapisanie współrzędnych do powyższej zmiennej przesunie nam kursor w zadane miejsce!
- Wykonanie metody ToString("x2") na danych binarnych zwróci nam te same dane zakodowane szesnastkowo.
- Klasa System.Security.Cryptography.SHA256Managed oferuje metodę ComputeHash (domyślnie używającą SHA2_256) - a więc można za jej pomocą haszować dane w naszym skrypcie. Przypominam oczywiście o istnieniu wbudowanej funkcji Get-FileHash, która zrobi to samo z plikiem - jednak nie ma w Powershell wbudowanego odpowiednika do wyliczania haszów ze zmiennych.
- Krótkie drzemki przynoszą ulgę
Aha, obiecałem, że pokażę gdzie powyższy skrypt może zawierać kod, który robi coś pożytecznego tj. coś innego niż udawanie, że myśli.
Kłamałem.
To nienormalne. Są ludzie, których lubię za to, że kłamią…
Można np skopiować pewna ilość znaków i już mamy super tajne hasło, choć gorzej z jego zapamiętywaniem
Akurat hasz 32-bajtowy z małej liczby całkowitej nie jest zbyt dobrym hasłem. Lepiej wziąć porządny program do generowania haseł, na przykład LastPass, 1-Password czy BitWarden.
Za mundre to dla mnie. Ale spodobał mi się ten zwrot „krwawa elektroniczna rzeź”