Šifrování v PHP. Šifrujte, dešifrujte data pomocí klíče v PHP Šifrovací a ověřovací klíče

  • Překlad
  • Tutorial

Od překladatele: v procesu programování nikdy nezapomenu, že jsem nebezpečně neschopný v kryptografii a všem radím, aby vycházeli z této teze (no, možná kromě tebe a toho tamhle pohodáře). Tak či onak však v průběhu práce vznikají problémy související s ochranou dat, které je třeba řešit. Proto vám dávám do pozornosti překlad článku finského vývojáře Timo H, který mi přišel docela zajímavý a užitečný.

Toto je rychlý návod, jak se vyhnout běžným nástrahám se symetrickým šifrováním v PHP.

Budeme uvažovat případ, kdy jsou data zpracovávána na straně serveru (zejména na serveru dochází k šifrování a data mohou být přijata například od klienta ve formě čistého textu, hesla atd.), což je typický případ pro aplikace PHP.

Informace v této příručce by se neměly používat k vytváření šifrovaných síťových připojení, která mají složitější požadavky. Pro takové případy musíte použít špehovaný nebo TLS.

Zde uvedená doporučení samozřejmě nejsou „jediným možným způsobem“ jak zorganizovat šifrování v PHP. Účelem této příručky je pokusit se ponechat méně prostoru pro chyby a obtížná, nejednoznačná rozhodnutí.

Šifrovací funkce v PHP

Použijte rozšíření Mcrypt nebo OpenSSL.

Šifrovací algoritmus a jeho způsob fungování, jednorázový kód (inicializační vektor)

Použijte AES-256 v režimu CTR s náhodným jednorázovým kódem ( Cca. překlad: nonce). AES je standard, takže můžete využít funkce kteréhokoli z rozšíření – Mcrypt nebo OpenSSL.

Vždy vygenerujte nový jednorázový kód. V tomto případě musíte použít kryptograficky bezpečný zdroj náhodných čísel. Přečtěte si trochu více o generování náhodných čísel níže. Jednorázový kód není tajný a lze jej spojit se šifrovaným textem pro přenos a následné dešifrování.

Jednorázový kód musí být dlouhý 128 bitů (16 bajtů), pouze řetězec bajtů bez jakéhokoli kódování.

V rozšíření Mcrypt je AES známý jako Rijndael-128 ( Cca. přel.: i přes to, že se bavíme o AES-256, nejde o chybu. AES-256 != Rijndael-256). V OpenSSL, respektive AES-256-CTR.

Příklad použití Mcrypt:
Příklad OpenSSL:
Ověřte, že šifrování funguje správně pomocí testovacích vektorů ( Cca. překlad: pro AES-256-CTR viz odstavec F.5.5 na straně 57).

Pro režim CTR existují určitá omezení celkového objemu šifrovaných dat. V praxi se s tím možná nesetkáte, ale mějte na paměti, že jedním klíčem byste neměli šifrovat více než 2^64 bajtů dat, bez ohledu na to, zda se jedná o jednu dlouhou zprávu nebo mnoho krátkých.

Režim CTR zůstane stabilní pouze v případě, že nepoužijete stejný jednorázový kód se stejnou klávesou. Z tohoto důvodu je důležité generovat jednorázové kódy pomocí kryptograficky silného zdroje náhodnosti. Navíc to znamená, že byste neměli zašifrovat více než 2^64 zpráv jedním klíčem. Vzhledem k tomu, že délka jednorázového kódu je 128 bitů, je limit na počet zpráv (a jim odpovídající jednorázové kódy) 2^128/2 důležitý kvůli narozeninovému paradoxu ( Cca. překlad:).

A pamatujte, že šifrování nezakryje skutečnost, kolik dat odesíláte. Jako příklad extrémního případu, pokud zašifrujete zprávy obsahující pouze „ano“ nebo „ne“, šifrování samozřejmě tyto informace neskryje.

Autentizace dat

Vždy zkontrolujte pravost a integritu dat.
K tomu použijte MAC po zašifrování. Tito. Nejprve se data zašifrují a poté se z výsledného šifrovaného textu převezme HMAC-SHA-256, včetně samotného šifrovaného textu a jednorázového kódu.

Při dešifrování nejprve zkontrolujte HMAC pomocí srovnávacího algoritmu, který je odolný vůči útokům načasování. Neporovnávejte přímo $user_submitted_mac a $calculated_mac pomocí operátorů porovnání == nebo ===. Ještě lepší je použít "HMAC double check".

Pokud je kontrola HMAC úspěšná, dešifrování lze provést bezpečně. Pokud HMAC není vhodný, okamžitě jej vypněte.

Šifrovací a autentizační klíče

V ideálním případě použijte klíče odvozené z kryptograficky silného zdroje náhodnosti. AES-256 vyžaduje 32 bajtů náhodných dat ("surový" řetězec - sekvence bitů bez použití jakéhokoli kódování).

Pokud aplikace běží pod verzí PHP nižší než 5.5, která nemá vestavěnou implementaci PBKDF2, pak budete muset použít vlastní implementaci v PHP, jejíž příklad najdete zde: https://defuse. ca/php-pbkdf2.htm. Uvědomte si, že spoléhání se na vlastní implementaci nemusí klíč vyřešit správně, jako to dělá vestavěná funkce hash_pbkdf2().

Nepoužívejte stejný klíč pro šifrování a ověřování. Jak je uvedeno výše, je vyžadováno 32 bajtů pro šifrovací klíč a 32 bajtů pro ověřovací klíč (HMAC). S PBKDF2 můžete vzít 64 bajtů z hesla a použít řekněme prvních 32 bajtů jako šifrovací klíč a zbývajících 32 bajtů jako ověřovací klíč.

Pokud jsou vaše hesla uložena v souboru, například jako HEX řetězec, nekódujte je znovu, než je předáte do šifrovacích funkcí. Místo toho použijte PBKDF2 pro převod HEX kódovaných klíčů přímo na vysoce kvalitní šifrovací nebo ověřovací klíč. Nebo použijte SHA-256 bez dalšího kódovacího výstupu (pouze 32bajtový řetězec) k hašování hesel. Použití běžného hashování hesel poskytuje dostatek entropie. Další podrobnosti jsou uvedeny v následujících odstavcích.

Natažení klíče

Za prvé, měli byste se vyhnout používání klíčů s nízkou entropií. Ale přesto, pokud potřebujete použít například uživatelská hesla, musíte určitě použít PBKDF2 s velkým počtem iterací, abyste maximalizovali zabezpečení klíčů.

Jedním z parametrů PBKDF2 je počet iterací hashování. A čím vyšší je, tím větší zabezpečení klíče můžete počítat. Pokud váš kód běží na 64bitové platformě, použijte SHA-512 jako hashovací algoritmus pro PBKDF2. Pro 32bitovou platformu použijte SHA-256.

V online aplikacích však není možné využít relativně vysoký počet iterací kvůli riziku DoS útoku. Klíčová kvalita tedy nebude tak vysoká jako u offline aplikací, které si mohou dovolit velké množství iterací bez takového rizika. U online aplikací se zpravidla volí takový počet iterací hašování, aby PBKDF2 netrvalo déle než 100 ms.

V případě, že můžete používat hesla s vysokou entropií, není nutné je natahovat jako u hesel s nízkou entropií. Pokud například vytvoříte "encryption_master_key" a "auth_master_key" pomocí /dev/urandom, pak není PBKDF2 vůbec potřeba. Jen se ujistěte, že používáte klíče jako sekvence bitů, bez jakéhokoli kódování.

Navíc s PBKDF2 není obtížné získat šifrovací i autentizační klíče z jediného hlavního hesla (stačí použít malý počet iterací nebo dokonce jednu). To je užitečné, pokud máte pouze jedno „hlavní heslo“ používané pro šifrování i ověřování.

Ukládání a správa klíčů

Nejlepší je použít samostatné vyhrazené zařízení pro ukládání klíčů (HSM).

Pokud to není možné, pak lze ke zkomplikování útoku použít šifrování souboru klíče nebo konfiguračního souboru (který uchovává skutečné šifrovací/ověřovací klíče) pomocí klíče uloženého na samostatném místě (mimo domovský adresář nebo kořen webu) . Například můžete použít proměnnou prostředí Apache v httpd.conf k uložení klíče potřebného k dešifrování skutečného souboru klíčů:
SetEnv keyfile_key crypto_strong_high_entropy_key # K této proměnné můžete přistupovat v PHP pomocí $_SERVER["keyfile_key"] # Zbytek konfigurace
Nyní, pokud jsou kompromitovány soubory v kořenovém adresáři webu a níže, včetně souborů s klíči (například pokud dojde k úniku zálohy), šifrovaná data zůstanou v bezpečí, protože klíč uložený v proměnné prostředí nebyl kompromitován. Je důležité si pamatovat, že soubory httpd.conf by měly být zálohovány samostatně a ne kompromitovat proměnnou keyfile_key například prostřednictvím výstupu phpinfo().

Pokud místo konfiguračního parametru použijete soubor, je možné uspořádat střídání klíčů. V nejhorším případě, pokud protivník získal vaše šifrovací a ověřovací klíče, aniž by si toho všiml, může otáčení klíčů v určitých intervalech omezit jeho přístup (za předpokladu, že nemůže získat nové klíče). Tato technika pomůže snížit poškození, protože nepřítel nebude moci používat kompromitované klíče donekonečna.

Komprese dat

Obecně platí, že byste neměli komprimovat zdrojový text před jeho zašifrováním. To může nepříteli poskytnout další nástroj pro analýzu.

Pokud například ukládáte data relace do šifrovaných souborů cookie, z nichž některé poskytuje uživatel a některé představují tajné informace, může se protivník dozvědět další informace o tajemství tím, že jako běžný uživatel odešle některá speciálně vytvořená data a měření, jak se mění délka výsledných šifrových textů.

Text je komprimován efektivněji, pokud existují opakující se oblasti. Manipulací s uživatelskými daty je můžete vybrat tak, aby se částečně shodovaly s tajnými daty. Čím větší shoda, tím menší je výstupní šifrovaný text. Tento typ útoku se nazývá ZLOČIN.

Pokud nemáte velkou potřebu komprimovat data, nekomprimujte je.

Serverové prostředí

Obecně platí, že byste na sdíleném serveru neměli hostovat aplikace citlivé na zabezpečení. Například na sdíleném hostingu, kde má protivník přístup k virtuálnímu počítači na stejném fyzickém serveru jako vy.

Existují různé důvody, které dělají ze sdílených serverů pochybné místo pro hostování aplikací kritických z hlediska zabezpečení. Nedávno byly například demonstrovány útoky mezi virtuálními servery: eprint.iacr.org/2014/248.pdf. To je dobrá připomínka toho, že útočné techniky nedegradují, ale spíše se časem zdokonalují a zdokonalují. S takovými nástrahami je třeba vždy počítat.

Odborná konzultace

V neposlední řadě se poraďte s odborníkem, aby zkontroloval váš bezpečnostní kód.

(PHP 4, PHP 5, PHP 7)

crypt — Jednosměrné hashování řetězce

Varování

Tato funkce není (zatím) binárně bezpečná!

Popis

krypta (řetězec $str [, řetězec $sůl]): tětiva

krypta() vrátí hashovaný řetězec pomocí standardního algoritmu založeného na Unixu DES nebo alternativních algoritmů, které mohou být v systému dostupné.

Parametr sůl je volitelný. Nicméně, krypta() vytváří slabý hash bez soli. PHP 5.6 nebo novější vyvolá chybu E_NOTICE bez ní. Nezapomeňte zadat dostatečně silnou sůl pro lepší zabezpečení.

password_hash() používá silný hash, generuje silnou sůl a automaticky aplikuje správná kola. password_hash() je jednoduchý krypta() wrapper a kompatibilní s existujícími hodnotami hash hesel. Použití password_hash() je podporováno.

Některé operační systémy podporují více než jeden typ hash. Ve skutečnosti je někdy standardní algoritmus založený na DES nahrazen algoritmem založeným na MD5. Typ hash se spouští argumentem salt. Před verzí 5.3 určovalo PHP dostupné algoritmy v době instalace na základě systému crypt(). Pokud není poskytnuta žádná sůl, PHP automaticky vygeneruje buď standardní dvouznakovou (DES) sůl, nebo dvanáctiznakovou ( MD5), v závislosti na dostupnosti MD5 crypt(). PHP nastaví konstantu s názvem CRYPT_SALT_LENGTH což označuje nejdelší platnou sůl povolenou dostupnými hashemi.

Standardní založené na DES krypta() vrátí sůl jako první dva znaky výstupu. Také používá pouze prvních osm znaků str , takže delší řetězce, které začínají stejnými osmi znaky, generují stejný výsledek (když je použita stejná sůl).

V systémech, kde funkce crypt() podporuje více typů hash, jsou následující konstanty nastaveny na 0 nebo 1 v závislosti na tom, zda je daný typ dostupný:

  • CRYPT_STD_DES- Standardní hash založený na DES s dvouznakovou solí z abecedy "./0-9A-Za-z". Použití neplatných znaků v salt způsobí selhání crypt().
  • CRYPT_EXT_DES- Rozšířený hash založený na DES. „Sůl“ je řetězec o 9 znacích, který se skládá z podtržítka následovaného 4 bajty počtu iterací a 4 bajty soli. Jsou kódovány jako tisknutelné znaky, 6 bitů na znak, nejméně významný znak jako první. Hodnoty 0 až 63 jsou kódovány jako "./0-9A-Za-z". Použití neplatných znaků v salt způsobí selhání crypt().
  • CRYPT_MD5- MD5 hašování s dvanáctiznakovou solí začínající $1$
  • CRYPT_BLOWFISH- Blowfish hašuje se solí takto: "$2a$", "$2x$" nebo "$2y$", dvoumístný parametr ceny, "$" a 22 znaků z abecedy "./0-9A- Za-z". Použití znaků mimo tento rozsah v salt způsobí, že crypt() vrátí řetězec nulové délky. Dvoumístný parametr cost je 2-základní logaritmus počtu iterací pro základní hashovací algoritmus založený na Blowfish a musí být v rozsahu 04-31, hodnoty mimo tento rozsah způsobí selhání crypt(). Verze PHP před 5.3.7 podporují pouze "$2a$" jako předponu salt: PHP 5.3.7 zavedlo nové předpony, aby napravilo bezpečnostní slabinu v implementaci Blowfish. Úplné podrobnosti o opravě zabezpečení naleznete v tématu, ale abychom to shrnuli, vývojáři, kteří cílí pouze na PHP 5.3.7 a novější, by měli používat "$2y$" přednostně před "$2a$".
  • CRYPT_SHA256- SHA-256 hash s šestnácti znaky salt s předponou $5$. Pokud řetězec soli začíná "rounds=
  • CRYPT_SHA512- SHA-512 hash s šestnácti znaky salt s předponou $6$. Pokud řetězec soli začíná "rounds= $", číselná hodnota N se používá k označení, kolikrát má být hašovací smyčka provedena, podobně jako parametr cost na Blowfish. Výchozí počet kol je 5000, minimálně 1000 a maximálně 999 999 999. Jakýkoli výběr N mimo tento rozsah bude zkrácen na nejbližší limit.

Od PHP 5.3.0 obsahuje PHP svou vlastní implementaci a použije ji, pokud systém postrádá podporu pro jeden nebo více algoritmů.

Parametry

Řetězec, který má být hašován.

Pozor

Za použití CRYPT_BLOWFISH algoritmu, bude mít za následek zkrácení parametru str na maximální délku 72 znaků.

Volitelný řetězec soli, na kterém je hašování založeno. Pokud není uvedeno, chování je definováno implementací algoritmu a může vést k neočekávaným výsledkům.

Návratové hodnoty

Vrátí zahašovaný řetězec nebo řetězec, který je kratší než 13 znaků a je zaručeno, že se bude lišit od soli při selhání.

Varování

Při ověřování hesel by měla být k porovnání výstupu krypta() na dříve známý hash. Poskytuje PHP 5.6 a novější hash_equals() pro tento účel.

Seznam změn

Verze Popis
5.6.5 Když je řetězec selhání "*0" uveden jako sůl, bude nyní vráceno "*1" kvůli konzistenci s jinými implementacemi krypt. Před touto verzí PHP 5.6 nesprávně vracelo hash DES.
5.6.0 Zvýšit bezpečnostní varování E_NOTICE, pokud je vynechána sůl.
5.5.21 Když je řetězec selhání "*0" uveden jako sůl, bude nyní vráceno "*1" kvůli konzistenci s jinými implementacemi krypt. Před touto verzí PHP 5.5 (a dřívější větve) nesprávně vracelo DES hash.
5.3.7 Přidal $ 2 x $ a $ 2 rok $ Režimy Blowfish pro řešení potenciálních útoků s vysokým bitem.
5.3.2 Přidána krypta SHA-256 a SHA-512 založená na implementaci » Ulricha Dreppera.
5.3.2 Opraveno chování Blowfish při neplatných kolech, aby se vrátil řetězec "selhání" ("*0" nebo "*1"), místo aby se vrátilo zpět na DES.
5.3.0 PHP nyní obsahuje vlastní implementaci pro algoritmy MD5 crypt, Standard DES, Extended DES a Blowfish a použije je, pokud systém postrádá podporu pro jeden nebo více algoritmů.

Příklady

Příklad #1 krypta() příklady

$hashed_password = crypt("mojeheslo"); // nechat sůl automaticky generovat

/* Měli byste předat celé výsledky crypt() jako sůl pro porovnání a
heslo, aby se předešlo problémům při použití různých hashovacích algoritmů. (Tak jako
jak je uvedeno výše, standardní hašování hesla založené na DES používá 2znakovou sůl,
ale hašování založené na MD5 používá 12.) */
if (hash_equals ($hashed_password , crypt ($user_input , $hashed_password ))) (
echo "Heslo ověřeno!" ;
}
?>

Příklad #2 Použití krypta() s htpasswd

// Nastavte heslo
$password = "mojeheslo" ;

// Získejte hash a sůl se automaticky vygeneruje
$hash = crypt($heslo);
?>

Příklad #3 Použití krypta() s různými typy hash

/* Tyto soli jsou pouze příklady a neměly by se ve vašem kódu používat doslovně.
Pro každé heslo byste měli vygenerovat odlišnou, správně naformátovanou sůl.
*/
if (CRYPT_STD_DES == 1) (
echo "Standardní DES: " . krypta ("rasmuslerdorf" , "rl" ) . "\n" ;
}

if (CRYPT_EXT_DES == 1) (
echo "Rozšířené DES: ". krypta ("rasmuslerdorf" , "_J9..rasm" ) . "\n" ;
}

if (CRYPT_MD5 == 1) (
echo "MD5: ". krypta ("rasmuslerdorf" , "$1$rasmusle$" ) . "\n" ;
}

if (CRYPT_BLOWFISH == 1 ) (
echo "Blowfish: ". krypt("rasmuslerdorf", "$2a$07$použij nějaký hloupý řetězec na sůl$"). "\n" ;
}

if (CRYPT_SHA256 == 1 ) (
echo "SHA-256: ". krypt("rasmuslerdorf", "$5$koly=5000$použij nějaký hloupý řetězec na sůl$"). "\n" ;
}

if (CRYPT_SHA512 == 1) (
echo "SHA-512: ". krypt("rasmuslerdorf", "$6$koly=5000$použij nějaký hloupý řetězec na sůl$"). "\n" ;
}
?>

Jakékoli informace lze zašifrovat nebo dešifrovat, včetně použití PHP. Tento jazyk má mnoho možností šifrování dat, od jednoduchých po složité.

Podívejme se na základní způsoby šifrování

základ 64- umožňuje šifrovat a dešifrovat data pomocí algoritmu MIME base64. Nepoužívá klíče a často se používá ke skrytí odkazů v PHP.

Příklady:
//zašifrovat text
$text = "Odkaz";
echo base64_encode($text); //Produkuje: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==
//dešifrování
echo base64_decode("PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==");
?>

Jak můžete vidět, nejprve jsme použili operaci base64_encode a získali šifru: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg== a poté jej nahradil do base64_decode a získal odkaz zpět.

md5- umožňuje jednostranně hašovat data. To znamená, že na rozdíl od base64 je již nebudete moci dešifrovat zpět. md5 se často používá k ukládání hesel v databázi, ale v poslední době se šifrovaná kombinace md5 stala snadno k nalezení v dešifrovacích tabulkách, které laskavě poskytuje mnoho webů a algoritmů. Proto je pro ukládání hesel md5 lepší nahradit algoritmy Blowfish.

Příklad:

//zašifrovat text
echo md5("kombinace");
?>

Šifrování klíče

A poslední příklad šifrování/dešifrování, o kterém jsem chtěl mluvit, používá klíč (jako heslo). To znamená, že předáte jedinečný klíč do funkce šifrování a kód se zašifruje spolu s ním. Chcete-li dešifrovat, musíte funkci poskytnout zašifrovaný kód a klíč, který znáte pouze vy. Příklad použití funkcí úplně dole v kódu.

funkce __encode($text, $klíč) (



$enc_text=base64_encode(mcrypt_generic($td,$iv.$text));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $enc_text; ))
funkce strToHex($string) (
$hex="";
pro ($i=0; $i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
return $hex; )
funkce __decode($text, $klíč) (
$td = mcrypt_module_open("tripledes", "", "cfb", "");
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
if (mcrypt_generic_init ($td, $key, $iv) != -1) (
$decode_text = substr(mdecrypt_generic($td, base64_decode($text)),$iv_size);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $decode_text; ))
funkce hexToStr($hex) (
$string="";
pro ($i=0; $i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
return $string; )

$str = "Buny, které je třeba zašifrovat!
Podle klíče";
$code = strToHex(__encode($str, "My#key-do-36-simvolov"));
echo "Šifrovaný kód: ".$code."
";

$str = __decode(hexToStr($code), "My#key-do-36-simvolov");
echo "Dešifrovaný kód: ".$str."
";
?>

Obsah HTML můžete šifrovat. Délka klíče nesmí být delší než 36 znaků.

Tuto metodu lze použít k zašifrování některých dat a jejich umístění do souboru txt nebo databáze a jejich přijetí pomocí dešifrování pomocí klíče.

Jakýkoli kód lze samozřejmě dešifrovat/hacknout a toto není výjimkou, proto používejte silné šifrovací metody.

Jednou ze základních pravd kryptografie je, že byste v této oblasti neměli nic vymýšlet, pokud nejste profesionál. Částečně je to pravda, protože vše nejlepší bylo v oblasti informačních technologií dávno vynalezeno, trpěno a používáno po desetiletí. Druhou stranou pravdy je, že k rozvoji určitého oboru vědění dochází pouze za neustálého přílivu neotřelých nápadů a originálních řešení v něm.

Z pochopitelných důvodů se nezaměříme na giganty průmyslové kryptografie, jako je AES, ale vrhneme se takříkajíc do vlastního kryptografického výzkumu s blackjackem a radostí.

Částečně proto, že je to zajímavé, částečně proto, že modelováním něčeho vlastního a porovnáváním s uznávanými standardy jasně vidíte kontrast, efektivní řešení a naprosté opomenutí a chápete, o co se můžete snažit, abyste zvýšili efektivitu.

Ale už dost vody.

Řekněme, že naše webová aplikace je napsána v PHP, potřebuje reverzibilní šifrování a věříme, že dokážeme napsat svůj vlastní šifrovací systém.

Pojďme tedy napsat náš vlastní reverzibilní šifrovací systém se soukromými a veřejnými klíči, který bude mít následující vlastnosti více či méně bezpečného šifrovacího algoritmu:

  1. Přítomnost šumových symbolů v konečné šifře.
  2. Informace v každém kanálu Sender-Destination budou zašifrovány pomocí soukromého klíče a funkce porovnávání bude pro každý klíč jedinečná.
  3. Každá zpráva obdrží digest – jedinečný kód, který je funkcí soukromého klíče a původní zprávy. To je nutné k dosažení jedinečnosti funkce porovnávání "zdrojového symbolu".<=>kódovaný symbol“ nejen pro kanál „Sender-Receiver“, ale také pro každou jednotlivou zprávu.

    I když si tedy představíme, že korespondence zakódovaných a původních symbolů pro konkrétní zprávu se stala známou pomocí kryptografické analýzy, například frekvenční analýzy, nedává to žádné preference při studiu jiné zprávy.

  4. Abychom zkomplikovali frekvenční analýzu, zakódujeme každý počáteční symbol zprávy dvěma šifrovacími symboly.
Tak, co se stalo.

Ve skutečnosti můžete vidět konečný výsledek

Třída SymCoder zahrnuje metody šifrování a dešifrování.

Šifrování se provádí metodou code(), která bere jako vstup původní zprávu.

Zde zpráva z vygenerované tabulky korespondence v tab_coded vytvoří zašifrovanou zprávu, zředěnou podél okrajů a uvnitř symboly šumu.

Mimochodem, symboly šumu jsou jedinečné pro každý cílový kanál odesílatele, protože jsou generovány pomocí klíče kanálu, ale nejsou jedinečné pro zprávy. Symboly používané pro šifrování v code_symbols jsou některá interpunkční znaménka a symboly jako %, @ atd.

Pro každý kódovaný symbol existují dva symboly z code_symbols, z pochopitelných důvodů, že jich je několikanásobně méně než kódovaných symbolů.

Korespondenční tabulka create_tab_coded je vytvořena pomocí překladu hash klíče zprávy do pole s počtem prvků rovným počtu prvků v poli symbolů kódu. Výchozí pozice pro procházení dvouznakových kódů je také vždy jiná a je spojena s kanálovým klíčem. To umožňuje mít jistotu, že algoritmus pro procházení zakódovaných symbolů a přiřazování kódových symbolů k nim bude vždy (nebo je zaručeno, že bude často) odlišný.

Například zpráva „ahoj světe“ po zakódování vypadá takto:

Digest-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%% .!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!

A zde je stejná zpráva, znovu zakódovaná:

Digest-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%. !%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:

Je vidět, že výtah stejné zprávy je stejný, ale šifra se liší - symboly šumu se přidávají v libovolné shodě a v libovolném pořadí pro každé nové šifrování.

Zprávy mají redundanci, která se s rostoucí hlasitostí zprávy snižuje, až 10 % šumu (u nejkratších zpráv dosahuje šum 90 % nebo více procent), minimální délka zašifrované zprávy je 116 znaků. Jednou z nevýhod této metody šifrování je, že kódované zprávy jsou minimálně zdvojené.

Dekódování spočívá v obráceném překladu tvaru „kódový symbol“ - původního symbolu se šumem vystřiženým ze zprávy. Co by mohlo být klíčem? V podstatě jakýkoli řetězec, který je jedinečný pro každý pár cíl-přijímač.

Pokud například vytváříte messenger se šifrováním zpráv, pak nejjednodušší verze soukromého klíče může být md5($user_id_1. $salt. $user_id_2), pak bude klíč jedinečný pro každý kanál zpráv.

Řekněme, že si potřebujete vyměňovat data mezi dvěma servery. Aby byla data chráněna před odposloucháváním provozu, jsou data šifrována. No, například přenos akcí v rámci botnetu. To je to, co v podstatě není šifrování, ale nazývá se kódování a k dekódování takového kódu se používají známé funkce.

Jako další příklad pseudošifrování uvedu příklad „šifrování“ hesel v databázi jednoho CMS – tam se hesla nešifrují v md5() nebo , ale jednoduše zakódují přes base64. Tito. V případě úniku databáze nebude pro hackera obtížné dešifrovat všechna hesla pomocí vestavěné PHP funkce base64_decode().

Potřebujeme přenášet data bez obav, že někdo bude schopen zachytit text a dešifrovat jej. PHP má populární balíček pro šifrování dat s názvem Mcrypt, který poskytuje obousměrné šifrování (to znamená skutečné šifrování a dešifrování dat).

Mcrypt verze 2.4.7 podporuje následující symetrické šifrovací algoritmy: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-192 , TripleDES, LOKI97, Rijndael-256, Twofish, Panama, Saferplus atd. Další podrobnosti o každém algoritmu jsou napsány na Wikipedii.

Protože se používá symetrické šifrování, klíč musí být znám oběma stranám a musí být uchováván v tajnosti.

Příklad šifrování a dešifrování řetězce

mcrypt_module_open("des", "", "ecb", "")
Tato funkce otevře modul algoritmu a použitý režim. V tomto příkladu je algoritmus DES v režimu ECB.

$klíč = substr($klíč, 0, mcrypt_enc_get_key_size($td));
Maximální velikost klíče musí být získána voláním funkce mcrypt_enc_get_key_size() a jakákoli hodnota menší než tato bude správná.

$s = mcrypt_generic($td, $zdroj);
Při šifrování jsou data doplněna nulovými bajty, aby bylo zajištěno, že data jsou dlouhá n*bloky. Velikost bloku je určena algoritmem (pro DES je velikost bloku 64 bitů). Proto se při dešifrování může na konci řádku objevit „\0“, které je odstraněno funkcí trim()