Hirdetés
- sziku69: Szólánc.
- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- Klaus Duran: HP wifi nyomtatás+ win11.
- Lalikiraly: Asus Gaming V16 - RTX5050
- Brogyi: CTEK akkumulátor töltő és másolatai
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- koxx: A bajnokok egere? Lamzu Maya Champions Edition 8K gamer egér
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
Új hozzászólás Aktív témák
-
cinemazealot
addikt
No, megpróbálom röviden és érthetően leírni a program működését. Hozzáértők, nyugodtan szóljatok hozzá!

<?php
// Betöltjük a Base2n nevű osztály forráskódját, ezzel elérhetővé válik a base32 kóder/dekóder szolgáltatás. Részletek lejjebb.
require_once("Base2n.php");
// Beállítjuk az időzónánkat. Erre azért van szükség, mert a TOTP szabvány UTC világórához van kötve, a mi rendszeróránk viszont CET időzóna szerint ketyeg. Ha tehát a mi óránk ma, január 27-én 20:02-t mutat, az UTC szerint 19:02. Ezt az Ügyfélkapu+ is tudja, hiszen ő is ugyanezt az algoritmust használja, nekünk pedig lehetőség szerint másodpercre pontosan együtt kell vele ketyegnünk.
date_default_timezone_set('Europe/Budapest');
// Létrehozzunk azt az objektumot, ami a base32 dekódolást fogja elvégezni. Azért így, mert a Base2n osztály egy általános felhasználású osztály, többféle kódolást is képes alkalmazni, a base32 pedig az alábbi ábécével és egyéb paraméterekkel inicializálható. De ez egy példa, ekkold kolléga már bemutatta a saját megoldását, az is tök jó.
$base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', false, true, true);
// Definiálunk egy speciális, ún. "hash" függvényt, ami a paraméterként átadott kulccsal (1. paraméter) és pad bájt (2. paraméter) segítségével egy fix hosszúságú, de a tartalom függvényében jelentősen változékony tartalommal bíró bináris bájtsorrá kódolja a 3. "text" paramétert. Ez a "text" persze lehet bármilyen bináris bájtsor is, a tartalma lényegtelen.
function h(string $key, int $pad, string $text)
{
// A kulcsot 64 bájtra egészítjük ki jobbról feltöltve nullás bájtokkal.
$key = str_pad($key, 64, chr(0x00), STR_PAD_RIGHT);
// A 64 bájtra hízlalt kulcs minden bájtján XOR bitműveletet (kizáró VAGY) hajtunk végre a pad értékével, ami szintén egy bájt. Ezzel a kulcs bitjeinek eloszlását szétszórjuk a spektrumon, egyszerűbben mondva, zajosabbá tesszük.
for ($i = strlen($key) - 1; $i >= 0; $i--) {
$key[$i] = chr(ord($key[$i]) ^ $pad);
}
// A 64 bájtos, zajos kulcshoz jobbról hozzáfűzzük a titkosítandó "szövegünk" bájtjait (ami majd látjuk, hogy valójában nem is szöveg) és alávetjük az SHA-1 hash-elésnek. Az eredmény egy 20 bájt (azaz 160 bit) hosszú bináris bájtsor. (Ha a 3. paraméter false lenne true helyett, akkor az eredmény ugyanennek a 20 bájtnak a hexadecimális megfelelője volna, azaz egy 40 karakteres string.)
return hash('sha1', $key . $text, true);
}
// Lekérdezzük a rendszeridőt, ami UTC időzónában értelmezett, 1970.01.01 00:00:00 óta eltelt másodpercek száma lesz.
$t = time();
// Ezt a ~1,7 milliárdos számot elosztjuk 30-cal és csak az egész részt tartjuk meg. Ezzel egy ~57 milliós értéket fogunk kapni, ami 30 másodpercenként növeli az értékét eggyel.
$t30 = (int)floor($t / 30);
// Fogjuk ezt a 30 másodperceként lépkedő számlálót és átalakítjuk egy 8 bájtos (64 bites) big-endian egésszé. Ezt úgy csináljuk, hogy először a számot átalakítjuk hexadecimálissá, balról feltöltjük '0'-ás karakterekkel, amíg 16 karakter hosszú nem lesz, majd az egészet visszaalakítjuk egy bináris bájtsorrá, ami pont 8 bájt hosszú lesz és történetesen string típusú. De ezt elolvasni nem fogjuk tudni, bár nem is célunk.
$c = hex2bin(str_pad(dechex($t30), 16, '0', STR_PAD_LEFT));
// Közben előkapjuk az Ügyfélkapu+-tól kapott 16 karakteres kulcsunkat, ami valójában base32 eljárással van elkódolva. Az eredmény egy ~10 elemű bájtsor lesz.
$key = $base32->decode('IDEJONAZUGYFELKAPUTOLKAPOTT16JEGYUKULCSOD');
// Fogjuk a fent definiált hash függvényünket és meghívjuk a ~10 bájtos (immáron dekódolt) kulcsunkkal, egy 0x36 (54) értékű pad bájttal és a 8 bájton tárolt számlálónkkal. Ezután újra meghívjuk a ~10 bájtos kulcsunkkal, egy 0x5c (92) értékű pad bájttal és az előbbi hívásunk eredményeként kiköpött hash eredményünkkel. Az eredmény egy 20 bájtos (160 bites) bájtsor lesz.
$h = h($key, 0x5c, h($key, 0x36, $c));
// Vesszük ennek az utolsó (huszadik, azaz mivel 0-kezdetű tömbindexelést használunk, 19. indexű) elemét, ami -- mivel stringben tároljuk az hash-elésünk eredményét -- egy karakter lesz. Ahhoz, hogy ebből egy számot kapjunk át kell kergetnünk az ord() függvényen. Végül pedig, egy AND bitművelettel elmaszkolva megtartjuk az utolsó 4 bitjét. Ennek köszönhetően az eredmény egy 0...15 közötti szám lesz, amit offszetként fogunk használni.
$o = ord($h[strlen($h) - 1]) & 0x0f;
// Vesszük a hash-elésünk eredményeként született bájtsort (ami string típusú) és rábökünk annak "offszetedik" elemére. Az ord()-dal egésszé konvertáljuk, AND bitművelettel elmaszkolva megtartjuk az utolsó 7 bitjét, majd balra el-shift-eljük 24 bittel.
$r = (ord($h[$o]) & 0x7f) << 24
// Fogjuk a hash bájtsorunk "offszet+1-edik" elemét, egésszé alakítjuk és eltoljuk balra 16 bittel.
| ord($h[$o + 1]) << 16
// Fogjuk a hash bájtsorunk "offszet+2-edik" elemét, egésszé alakítjuk és eltoljuk balra 8 bittel.
| ord($h[$o + 2]) << 8
// Fogjuk a hash bájtsorunk "offszet+3-adik" elemét, egésszé alakítjuk.
| ord($h[$o + 3]);
// Ezt a 4 bájtot OR bitműveletekkel összefésüljük, így kapunk egy 31 bites egész számot, ami a 0...2147483647 tartományban kaphat majd értéket.
// Fogjuk ezt a 31 bites egészt és vesszük az egymillióval való osztás maradék részét, ami így egy legfeljebb 6 számjegyű decimális szám lesz. Annak érdekében viszont, hogy ez a szám garantáltan 6 számjegyű legyen, szöveggé alakítjuk és balról feltöltjük '0'-ás karakterekkel. És ezzel meg is van a 6 számjegyű kódunk.
echo str_pad($r % 1000000, 6, '0', STR_PAD_LEFT) . "\n";
Új hozzászólás Aktív témák
- Assetto Corsa Competizione
- A fociról könnyedén, egy baráti társaságban
- Jogász topik
- Milyen házat vegyek?
- Samsung Galaxy A54 - türelemjáték
- Nintendo Switch 2
- DUNE médialejátszók topicja
- S.T.A.L.K.E.R. - Anomaly
- HiFi műszaki szemmel - sztereó hangrendszerek
- Samsung Galaxy Felhasználók OFF topicja
- További aktív témák...
- Új, felbontott Kingston FURY 24GB (1 modul) Renegade DDR5 8000MHz CL38 KF580C38RW-24 - 24 hó gari
- Honor 90 512GB,Újszerű,Dobozaval,12 hónap garanciával
- Motorola Moto G72 128GB,Újszerű,Dobozaval,12 hónap garanciával
- Xiaomi 13T 256GB,Átlagos,Dobozaval,12 hónap garanciával
- Új könyv: A szamuráj erényei Kicune - Itó könyve
- Eladó Realme gt neo 2 5g Dobozában tokkal
- 129 - Lenovo Legion Pro 7 (16ARX8H) - AMD Ryzen 9 7945HX, RTX 4080 (ELKELT)
- BESZÁMÍTÁS! Gigabyte B550M R7 3700X 32GB DDR4 512GB SSD RTX 3060Ti 8GB Zalman Z1 PLUS CM 700W
- GYÖNYÖRŰ iPhone 12 64GB Black -1 ÉV GARANCIA - Kártyafüggetlen, MS3654
- Azonnali készpénzes Microsoft XBOX Series S és Series X felvásárlás személyesen/csomagküldéssel
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest


