Hirdetés
- OLED TV topic
- PC-k milliói kerülhetnek veszélybe idén
- Máris elfogytak az idei évre szánt HDD-k a Western Digitalnál
- Fejhallgató erősítő és DAC topik
- Milyen billentyűzetet vegyek?
- Kényszerűen visszavesz az AI-ból a Windows 11-ben a Microsoft?
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- Máris kezeli nem induló Socket AM5-ös alaplapjainak ügyét az ASRock
- AMD Navi Radeon™ RX 9xxx sorozat
- Milyen videókártyát?
- Luck Dragon: Asszociációs játék. :)
- total90: SSD és HDD árak 2026-ban – most kell vásárolni, vagy várni 2028-ig?
- Geri Bátyó: Agglegénykonyha 13 – Néhány egyszerű, de finom étel
- Depression: Hardver rúzs effektus?
- Luck Dragon: Alza kuponok – aktuális kedvezmények, tippek és tapasztalatok (külön igényre)
Ú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
- Eljött a Messenger.com vége
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Otthoni hálózat és internet megosztás
- League of Legends
- Okos Otthon / Smart Home
- OLED TV topic
- iPhone topik
- Dalra fakad, zenét szerez a Gemini
- Arc Raiders
- PC-k milliói kerülhetnek veszélybe idén
- További aktív témák...
- Okos Playstation 4 Pro + 50 játék Gold Hen 12.02 PS4 GoldHen!
- ROG Zephyrus G14 GA401QC 14" FHD IPS Ryzen 7 5800HS RTX 3050 16GB 512GB NVMe magyar vbill gar
- Gainward RTX 3080 10GB GDDR6X Phoenix
- 256 GB mSATA SSD eladóak (Hynix, Sandisk, Samsung)
- Latitude 7450 14" FHD+ IPS érintő Ultra 5 135U 16GB 256GB NVMe magyarított vbill ujjolv IR kam gar
- Konzol felvásárlás!! Xbox Series S, Xbox Series X
- RITKASÁG! Microsoft Surface Pro 11 Qualcomm Snapdragon X Elite 16GB 1000GB OLED 120Hz Gar!
- 231 - Lenovo Legion 5 (15IRX10) - Intel Core i7-13650HX, RTX 5060
- Mini Pc HP ProDesk 600 G2 / G4 / G5 Acer Vertion // 6-9. gen // i3 / i5 // garancia / Bp., MPL, Fox
- Lenovo ThinkPad X1 Yoga G6 (6th Gen) - i7-1185G7, 32GB, 512GB SSD, multitouch + TOLL
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Laptopműhely Bt.
Város: Budapest



