Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Jak v PHP vygenerovat string

Já bych to udělal asi tak, že bych si nechal vygenerovat několik klíčů (ideálně liché číslo větší než 1) a uložil je pro potřeby tohoto programu někam do souboru (nebo i do zdrojáku)

Pokud je B prázdné, vyfakovat uživatele ať ho zadá a skončit - nelze-li to dosadit třeba B="MeZeRa"

Při spuštění kódu bych je načetl do pole (KLICE) a někam si uložil první index v tom poli (asi I=0).
Následně bych ve smyčce opakoval takovýto postup
B = cislo_pruchodu_jako_řetězec + B // takže v prvním průchodu tvého příkladu to bude "1D3hž"
X = B zašifrované pomocí KLICE[I]; I=I+1; pokud I přeteče počet klíčů, nastaví se na začátek
Y = B zašifrované pomocí KLICE[I]; I=I+1; pokud I přeteče počet klíčů, nastaví se na začátek
vyprázdním B a dám do něj střídavě znaky z X a Y (B=""; for J < len(X) do B=B+X[J]+Y[J];) // V tuto chvíli je B minimálně 2x delší
pokud je B dost dlouhé, končím, jinak opakuju smyčku
(B je dost dlouhé, pokud je 2x delší delší než C - pro původní B jednoznakové a C=500 je to asi 10 průchodů. Smyčku v každém případě projdu aspoň 1x - takže test je až na konci)

Teď máme B dost dlouhé a chaotické, zbývá ho převést na sled povolených znaků. Ideálně tak, že ho vyjádříme jako číslo o základu (délka A) v číselné soustavě A - Dělit velká čísla jsme se učili už na základce, takže směle do toho

A bereme jako pole začínající indexem 0 o délce Ad, takže poslední znak má index Ad-1 (je to naše číselná soustava - číslu i odpovídá znak A[i])
B bereme jako číslo v šestnáctkové soustavě, takže co znak, to dvě (hexadecimální) číslice (B[0],B[1])
VYSLEDEK nechť je zápis B v soustavě o základu A a cifrách A[0] .. A[Ad-1]

VYSLEDEK=""
ZBYTEK=0
MEZIDELENEC =0

Postupně bereme půlznaky z B (střídavě horní a dolní), převádíme je na čísla (imho ASCII(B[0]) nebo tak nějak) a MEZIDELENEC vynásobíme 16 a přičteme k němu tu hodnotu půlznaku, dokud není MEZIDELENEC >= Ad

Vydělíme MEZIDELENEC hodnotou Ad, vyjde nám nějaké číslo x a zbytek y a tak na konec VYSLEDEK přidáme znak A[x] a do MEZIDELENEC dáme ten zbytek y, vynásobíme 16 a přičteme k němu další hodnotu půlznaku

Jakmile je délka VYSLEDEK rovna požadované hodnotě C, výpočet končí a máš svůj STRING.

Zbylé mezivýsledky prostě zahodíme.

Takhle je VYSLEDEK tvořen znaky z A, je založen výhradně na tajném hesle B (a konstantních klíčích a algoritmu), pokaždé pro dané B dá stejný výsledek (takže jde zkontrolovat, zda bylo zadáno správné heslo, ale nejde to heslo zpětně vypočíst) a IMHO nehrozí (díky číslům průchodu) kolize (pokud C bude dost velké - tedy větší než délka nejdelšího hesla)

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny