it-swarm-eu.dev

Techniky pro psaní algoritmů šifrování (výhradně pro osobní použití)

Rád bych předpověděl tuto otázku tím, že uvedu, že plně chápu nebezpečí psaní vlastních šifrovacích algoritmů, a nikdy bych nikdy nepoužíval domácí šifrování k zabezpečení dat kohokoli kromě mě.

Dnes mi byl přidělen projekt semestru informatiky, který spojuje vše, co jsme se naučili, do jednoho programu. Součástí funkčnosti tohoto programu je, že dokáže šifrovat a dešifrovat řetězce. Tyto šifrovací metody musíme psát sami, takže nemůžeme použít nic vestavěného do jazyka, který používáme (Java). Nakonec se musíme vyvarovat všeho, co používá klíč pro šifrování.

Nyní, po rozhovoru s některými mými spolužáky, to vypadá, že téměř každý používá ROT13 nebo jinou podobnou metodu. Protože jsem overachiever a protože nechci být jako všichni ostatní, chci navrhnout vlastní metodu šifrování. Jsem ale trochu ztracen, kde začít. Jaké základní nebo pokročilé techniky existují pro šifrování?

18
Josh

Pokud máte obecně zájem o kryptografii mimo váš projekt :

Záleží na tom, jaký typ šifrování chcete provést. Obrovské upozornění: tato odpověď je pouze o tom, že vás nasměruje správným teoretickým směrem. Vřele doporučuji udělat hodně čtení před skokem dovnitř - čím více čtete, tím více pochopíte, jak byly předchozí šifry rozbité a nedělají stejné chyby.

Veřejný klíč

Pro provoz systému veřejných klíčů potřebujete funkce Trapdoor . Rady na wikipedii jsou bohužel velmi přesné:

Bylo navrženo několik tříd funkcí a brzy se ukázalo, že funkce Trapdoor je obtížnější najít, než se původně myslelo

Trapdoor funkce jsou dost těžké; Trapdoor permutace (kde výstupní a vstupní sady funkcí jsou stejné a jako taková funkce „permutuje“ vstup uvnitř sady) jsou ještě těžší. Zhruba řečeno, problém primární faktorizace a diskrétní logaritmus jsou dva „velké“. Šance jsou v této oblasti, použití stávajícího bude zdaleka nejjednodušší přístup.

Symetrický klíč

Algoritmy symetrických klíčů jsou záměrně reverzibilní, ale bez jednoho ze vstupů (klíč) jsou navrženy tak, aby bylo velmi obtížné reverzovat. Základní myšlenkou je princip záměny/šíření . Běžné techniky v moderních šifrách zahrnují substituční permutační sítě a feistel sítě . Měli byste také zvážit čtení na režimy blokové šifry .

Dobře, skvělé, kde mám začít?

Čtením - co nejvíce. Nelíbí se mi standardní rady „nenavrhuj své vlastní krypto“. Myslím, že by se lidé měli pokusit, pokud chtějí. Ale nemohu dostatečně zdůraznit, jak těžké je správně. Protože pro svůj projekt máte omezené množství času, jednou z technik může být použití jednoduchého příkladu existující šifry, takže:

pro váš projekt

Jako vzdělávací cvičení RC4 je velmi snadné implementovat. Kdysi (není to tak dávno) se to používalo k ochraně přenosu SSL/WEP - někdy se stále používá, takže byste používali skutečnou šifru. Má některé problémy se zabezpečením - porozumění těmto vám také pomůže při vašem obecném krypto-vzdělávání. Vzhledem k tomu, že váš požadavek je méně absolutní zabezpečení a více učení, tak bych si myslel, že by to bylo ideální.

Pokud se cítíte velmi ambiciózně a dobře znáte svůj jazyk, není AES tak obtížné implementovat v režimu ECB. FIPS-197 je docela čitelný a obecně vysvětluje algoritmus poměrně přístupným způsobem.

Máte právo považovat ROT13 za špatný příklad. I když jsme nevěděli, že offset každého znaku byl 13 míst, za předpokladu, že používáte ASCII), zkuste každý ze 127 (nebo 255 pro rozšířené ASCII) posuny vašeho šifrového textu, dokud ten pravý neklesne. Dešifrovat je tedy celkem triviální, dokonce i bez klíče.

15
user2213

Musíte se vyhnout něčemu, co používá klíč? Osobně nevidím, jak můžete volat algoritmus „šifrování“, pokud nepoužívá klíč.

Můžete zvážit vytvoření vlastní implementace zjednodušeného DES. Jak název napovídá, zjednodušená DES (nebo S-DES) je značně zjednodušená verze DES. Používá 10bitový klíč a je dost jednoduché na práci s tužkou a papírem.

Tento článek je první hit Google pro „Zjednodušený DES“. K dispozici je také vizuální simulátor na adrese http://edipermadi.wordpress.com/2008/01/12/simplified-des-simulator/ .

8
Jonathan

Nechci vám zkazit zábavu, ale chcete myslet na následující:

  1. Co je vlastně šifrování? Jaké jsou vlastnosti věcí, které šifrují a dešifrují, a proč to děláme jako společnost? Chcete přemýšlet o vlastnostech a procesu.
  2. Co je klíč? Na základě vašeho průzkumu můžete požádat svého instruktora o objasnění tohoto bodu.
  3. Vytvořte klasifikační systém všech skupin šifrovacích technik. Tímto výzkumem můžete najít zajímavou odpověď nebo dvě.

Toto je semestrální projekt, takže to není něco, na co můžete (nebo byste měli) odpovědět přes noc. Samotný kód může trvat pouze den nebo dva. Skutečné učení spočívá v hledání řešení na základě daných omezení.

4
logicalscope

Měli byste si přečíst The Handbook of Applied Crypgoraphy . Tato kniha se také nazývá „Příručka“. Je to zdarma a dobře napsané. Kapitola 2 „Matematické pozadí“ je však docela tuhá, většina z těchto konceptů se nevyučuje na mé místní veřejné univerzitě (podíval jsem se).

2
rook

Pokud chcete vidět zjednodušenou verzi složitých „záměn“ a „rozptylování“, William Stallings napsal vynikající zjednodušená DES implementace .

Je to dost snadné, že jsem to vytáhl (a provedl transpozice) na milimetrovém papíře. Provede vás však všemi základními funkcemi DES používá a provede vás jedním cyklem procesu dešifrování a dešifrování).

2
Joseph Kern

V závislosti na omezeních, která jsou na vás, můžete skutečně vytvořit extrémně obtížné crackování šifrování rozumně snadno - toto šifrování má praktické nedostatky, díky kterým je v reálném světě zásadně nepoužitelné, ale měli byste věci ROT13, Caesar atd. Docela snadno - v podstatě - v podstatě vytvoříte systém pro entropické kódování, který vám zajistí jednorázovou podložku

Napište si něco, abyste mohli číst všechny soubory na diskové jednotce - je to docela snadné, google o hierarchickém rekurzivním prohledávání adresářů, otevřete všechny raw/binární soubory a nasajte jejich obsah

Když začnete streamovat v každém bajtovém proudu, vytvořte si hlavní soubor, ve kterém budete hledat opakování subsekvencí (od nynějška budou tyto řetězce označovat jako řetězce, protože to jsou to, co jsou, prostě to nejsou textové řetězce). vstup - je třeba vytvořit algoritmus, který časem upřednostňuje nejdelší možné subsekvence shody, ale může rekurzivně rozdělit vstup na menší řetězce - pokud se podíváte na http://en.wikipedia.org/wiki/Huffman_coding uvidíte konkrétní algoritmus pro dosažení tohoto cíle, ale nemusíte jít tak daleko - ale implementace pravděpodobně přinesou fragmenty kódu, které vám usnadní váš život.

Nyní, když něco zakódujete, vezměte vstupní řetězec a použijte stejnou operaci, najděte nejdelší shodné podřetězce v hlavním souboru a nahraďte vstupní řetězec odsazením a délkou odpovídajícího podřetězce v hlavním souboru. řetězec, protože na konci dne se vracíte hledáním jednotlivých bitů. Jedním strážcem, který budete muset použít, je, že musíte projít množinou všech odpovídajících řetězců, než začnete znovu používat stejné indexy - představte si hlavní soubor kde jste měli střídavé 1 a 0 a mohli jste se shodovat pouze se vstupy na bitové úrovni (technicky nemožné, ale mějte se sebou) - pokud jste dostali řetězec 5 1, kódovali byste to jako 1: 1,3: 1,5 : 1,7: 1,9: 1 (ano, jedna vada je, že toto kódování se v urèitých pípadech mùže stát hroznì neefektivní) (nb - pokud kódujete bity, kód oslabíte - extra body, pokud posunete posun pouze v zpráva, ale je to ošklivá strategie vícerozměrného mapování mimo rozsah tohoto příspěvku)

Sledujte počet opakovaných indexů - vaším cílem je mít hlavní tabulku dostatečně velkou, aby se to nikdy nestalo - pokud k tomu dojde a vy jste měli zakódovat pouze jednu zprávu, je jisté, že vesmír zemře na smrt způsobenou teplem, než by mohl být kód prasklo více zpráv, které zakódujete KDE SE ZNAMENÁ INDIKACE, čím více se váš kód utuží (analýza jazyka, analýza vzorů atd.) Teď je tu úlovek - abyste mohli tento kód použít u jiné strany - musíte jim získat kopii hlavní tabulka - měli byste to dělat pouze osobně, vždy byste měli mít přenosová média pod kontrolou a měli byste ji zničit po dokončení přenosu - a pokud dojde ke komprimaci jakéhokoli počítače, na kterém je hlavní tabulka zapnutá, váš kód je přípitek - do té doby je to docela zatraceně těžké

Bavte se

1
Mark Mullin

Pro obousměrné šifrování většina algoritmů používá x nebo operátor, při porovnání binárního kódu klíče a binárních dat vstupu to nemusí být pro vás to pravé, protože nemůžete použít klíč ... ale toto je jak to funguje:

Vstupní data: 10011101101001 Klíč: 123 = 1111011

Klíč je menší než vstup, takže je třeba jej opakovat:

Vstupní data: 10011101101001 Klíč: 123 = 11110111111011

(v Java použijte jednu proměnnou k počítání v smyčce pro každou nebo chvíli skrz všechny bity vstupního dat ...) Nyní použijte x nebo princip pro vygenerování šifrovaného výsledku (dva způsob hash) smyčka přes každý bit ve vstupních datech a porovnat jej s odpovídajícím bitem v klíči, pokud je identický, přidat 0 k výsledku, pokud ne, přidat 1 k výsledku ... Výsledkem bude pak:

Vstupní data: 10011101101001 Klíč: 123 = 11110111111011 Výsledek = 01101010010010

Chcete-li data dešifrovat, jednoduše spusťte šifrovaný datový žlab:

Vstupní data: 01101010010010 Klíč: 123 = 11110111111011 Výsledek = 10011101101001

V ideálním případě byste použili hash funkci jako sha, md5, ripemd atd. ... pro vygenerování klíče, pak jej přepněte na binární ... pokud nemůžete použít premade algoritmus, můžete si vytvořit svůj vlastní algoritmus pro vygenerování klíče pro porovnej ... jen udělej shure všechny bity na vstupu jsou na sobě závislé, aby vygenerovaly výsledek ... příklad:

heslo: abcdefghi abc = 123456789 (a = 1, b = 2, c = 3 atd ...)

nyní opakujte každý bit (číslice) a přidejte je spolu s čítačem, příklad: count = 0 result = "" foreach číslice v hesle do {result = result & (digit + result [count-1]) * count) count = count +1}

výsledek = (1 + 0) * 1 = 1 (2 + 1) * 2 = 6 (3 + 2) * 3 = 15 (4 + 3) * 4 = 28 (5 + 4) * 5 = 45 (6+ 5) * 6 = 66 (7 + 6) * 7 = 91 (8 + 7) * 8 = 120 (9 + 8) * 9 = 153

klíčový výsledek = 16152845669120153 Binární: 111001011000101110110101110100001110000011100010011001 (Toto je velmi špatný příklad ... měli byste si myslet skrze dobrý algoritmus ... ten, kde dva počáteční vstupy kombinují a tvoří třetí, a pak třetí a čtvrtý jdou společně s výsledek prvního kombinování pro generování fith výsledku ...)

ale pak znovu, pokud nemůžete použít klíč, nemůžete použít toto ...

1
Daniel V

Podívejte se na kurz Crypto I ze Stanfordské univerzity na coursera. Rozkládá proud a blokuje šifry a šifrování veřejných klíčů. Byli byste mnohem více informováni, kdybyste sledovali pouze prvních pár přednášek. Kurz navíc zahrnuje také zranitelnosti a metody porušení kryptografických implementací.

0
Andrew