Re: [python] pytho + php sifrovanie/desifrovanie
Preklep: ... stejnych 16 _bytu_ dat .. 2011/6/8 rajcze raj...@gmail.com: Ahoj, me na tech stejnych prefixech nic divneho neprijde - naopak, kdyby to tak nebylo, tak bys ten text nikdy nemohl desifrovat ;-) Kdyz si aspon neco malo prectes o AES, zjistis, ze sifruje po 128 bitovych blocich (tj. 16 bytu), takze kdyz vezmes stejnych 16 bitu dat a zasifrujes je pokazde stejnym klicem, tak neni snad nic prekvapiveho na tom, ze vychazi stejne vypadajici zasifrovany blok. J. 2011/6/8 miamia peterirbi...@gmail.com Ahoj Peťo, áno, potvrdzujem, že to ide v tej hombinácii ok. ďakujem za ukážku. Spravil som pokus: plain = Hello, World11 ciphertext = AES.new(tajneheslo123456, AES.MODE_ECB).encrypt(resize(plain, AES.block_size)) print ciphertext.encode('hex') # adc1f6cd135accd4d3627083facc4074 plain = Hello, World111 ciphertext = AES.new(tajneheslo123456, AES.MODE_ECB).encrypt(resize(plain, AES.block_size)) print ciphertext.encode('hex') # c29cfc58173b5a4f4ba6d397fe083600 plain = Hello, World11 ciphertext = AES.new(tajneheslo123456, AES.MODE_ECB).encrypt(resize(plain, AES.block_size)) print ciphertext.encode('hex') # napise a8ba9848cd563d3e762de25fffaf7aa46e7a5f28eae4e2f0684f8d9ef949869f plain = Hello, World ciphertext = AES.new(tajneheslo123456, AES.MODE_ECB).encrypt(resize(plain, AES.block_size)) print ciphertext.encode('hex') # napise a8ba9848cd563d3e762de25fffaf7aa4e9277a3748ee1a6daf8f1d0e5fdfc026 Jediné, čo ma trápi je to, že pri posledných dvoch plainoch sú rovnaké začiatky. zaujímavé je, že pri Hello, World11 a Hello, World111 nie sú rovnaké začiatky. hm. Skúšal som zmeniť mód na CFB, CBC, ale vždy tie začiatky sú rovnaké. prečo tomu tak je? dúfal som, že by to nemalo byť rovnaké. On 4 čvn, 18:59, Petr Messner petr.mess...@gmail.com wrote: Ahoj, jen ze zajímavosti jsem vyzkoušel AES a šlo to dobře, v PHP s nějakou knihovnou, co jsem našel na webu... Zašifrování v Pythonu: #!/usr/bin/env python from Crypto.Cipher import AES def resize(s, blockSize): if len(s) % blockSize == 0: return s else: return s + * (blockSize - len(s) % blockSize) plain = Hello, World! ciphertext = AES.new(tajneheslo123456, AES.MODE_ECB).encrypt(resize(plain, AES.block_size)) def to_hex(s): return .join(hex(ord(c)).replace(0x, ).rjust(2, 0) for c in s) print to_hex(ciphertext) # napise 3d e8 9f 9f 8d dc f1 ef 1c 6f fc 45 c6 72 14 f7 Dešifrování v PHP: ?php $ciphertext = 3d e8 9f 9f 8d dc f1 ef 1c 6f fc 45 c6 72 14 f7; require(./AES.class.php); //http://www.phpaes.com/ $aes = new AES('tajneheslo123456'); $ciphertext = \x3d\xe8\x9f\x9f\x8d\xdc\xf1\xef\x1c\x6f\xfc\x45\xc6\x72\x14\xf7; echo ' . $aes-decrypt($ciphertext) . '\n; ? Problém je, že klíč pro AES musí mít délku 16, 24 nebo 32 bajtů a délka plaintextu musí být dělitelná 16, takže jsem na konec přidal patřičný počet mezer (v Pythonu funkcí resize). Správně bych měl asi místo mezer použít náhodné znaky a spolu se zprávou poslat i délku plaintextu a dešifrovaný text pak na tuto délku oříznout. AES má různé módy, použil jsem ECB, protože phpAES umí (podle informací na phpaes.com) v neplacené verzi jen tento mód. Bohužel nevím v čem se tyto módy liší. U ostatních módů se musí kromě klíče určit i inicializační vektor. Jo a pokud by bylo potřeba binární řetězec (tedy zašifrovaný text) nějak rozumně čitelně vypsat, hodí se na to base64 (v ukázce jsem použil hexadecimální čísla). Petr Messner 2011/6/4 miamia peterirbi...@gmail.com Dobry den, prosim Vas, potrebujem zasifrovat text v pythone a potom ho desifrovat v skripte PHP. Skusal som pycrypto a nejake aes php skripty, ale vysledky (zasefirovanie/desifrovanie) neboli rovnake - nepodarilo sa mi to rozchodit. Da sa niekde najst priamo nejaky priklad, ako toto spravit v pythone a desifrovat v PHP (najlepsie zdrojaky)?velka vdaka ___ Python mailing list pyt...@py.cz http://www.py.cz/mailman/listinfo/python- Skrýt citovaný text - - Zobrazit citovaný text - ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python -- Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet. -- Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Tisk unicode řetězce a tisk seznamu unicode řetězců
David Rohleder píše [...] Když už jsme u těch řetězců: jak se udělá raw unicode řetězec, tj. interpret neinterpretuje uvnitř? Generuju si latexový dokument a on se přirozeně vzteká na: hlavicka = ur documentclass[a4,landscape]{article} usepackage{graphicx} usepackage[czech]{babel} usepackage[utf8]{inputenc} begin{document} thispagestyle{empty} print hlavicka SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 39-40: truncated u To je jedno z těch temných zákoutí. Ono se to vzteká už při hlavicka = ur'usepackage' print hlavicka Problém je v tom, že raw-unicode-escape s předponou ur není tak úplně 'raw'. Interpretují se posloupnosti u -- viz http://docs.python.org/tutorial/introduction.html#unicode-strings: For experts, there is also a raw mode just like the one for normal strings. You have to prefix the opening quote with ‘ur’ to have Python use the Raw-Unicode-Escape encoding. It will only apply the above u conversion if there is an uneven number of backslashes in front of the small ‘u’. V tomto případě mě napadá jen ta možnost, že se napřed vyrobí raw string (starý, neunicode) a převede se druhým krokem na unicode: == # -*- coding: utf-8 -*- hlav = r documentclass[a4,landscape]{article} usepackage{graphicx} usepackage[czech]{babel} usepackage[utf8]{inputenc} begin{document} thispagestyle{empty} print type(hlav) hlavicka = unicode(hlav, 'utf-8') print type(hlavicka) print hlavicka == Dá se to trochu vylepšit tím, že si nadefinuješ funkci u(), aby se to hezčeji zapislovalo: == # -*- coding: utf-8 -*- def u(raw_string, encoding='utf-8'): return unicode(raw_string, encoding) hlavicka = u(r documentclass[a4,landscape]{article} usepackage{graphicx} usepackage[czech]{babel} usepackage[utf8]{inputenc} begin{document} thispagestyle{empty} ) print type(hlavicka) print hlavicka == V případě chroupání LaTeXových textů bych ale vážně uvažoval o použití Python 3 -- i kdyby jen pro tento účel. Tam se z toho stane jen raw string, který bude automaticky unicode (nový str se rovná starému typu unicode): == # -*- coding: utf-8 -*- hlavicka = r documentclass[a4,landscape]{article} usepackage{graphicx} usepackage[czech]{babel} usepackage[utf8]{inputenc} begin{document} thispagestyle{empty} print(type(hlavicka)) print(hlavicka) == Pokud toho chroustacího kódu máš víc, pomůže pythonovská utilitka 2to3 -- viz http://diveintopython3.py.cz/case-study-porting-chardet-to-python-3.html#running2to3 P. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Tisk unicode řetězce a tisk seznamu unicode řetězců
Mailer mi sežral zpětná lomítka. Dopiš si je tam. To je jedno z těch temných zákoutí. Ono se to vzteká už při hlavicka = ur'usepackage' print hlavicka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pytho + php sifrovanie/desifrovanie
Jediné, čo ma trápi je to, že pri posledných dvoch plainoch sú rovnaké začiatky. zaujímavé je, že pri Hello, World11 a Hello, World111 nie sú rovnaké začiatky. hm. Skúšal som zmeniť mód na CFB, CBC, ale vždy tie začiatky sú rovnaké. prečo tomu tak je? dúfal som, že by to nemalo byť rovnaké. Ahoj, Podivej se bliz na to, jak funguje AES. Zjistis, ze AES je blokova sifra, kdy se plaintext rozdeli na bloky a ty se zasifruji. Vychazi ti stejny ciphertext v poslednich dvou pripadech, protoze je stejny vstupni blok dat i stejny sifrovaci klic. Ty prvni dva pripady maji jiny ciphertext, protoze vstupni data maji mene nez 16 znaku (128 bitu) a tim padem jsou zarovnane mezerami a nejde o stejny vstup do blokove sifry. Experimentalne zjistis, ze kdyz ke druhemu pokusu (plain = Hello, World111) pridas na konec jeste jednu jednicku, dostanes stejny vysledek jako v pokusech 3 a 4, protoze len(plain) = 16. Pro ECB (ktery by se nemel pouzivat pro nic citliveho) tohle plati pro kazdy blok plaintextu, takze pokud bys mel opakovanou sekvenci 16 znaku na vstupu, dostanes pri ECB opakujici se sekvenci na vystupu (tech zasifrovanych 16 znaku). Pri ostatnich modech se do sifrovani bloku X promitne (neni uplne dulezite jak) neco z bloku X-1, takze 16 opakujicich se znaku se v kazdem bloku zasifruje trochu jinak. Proto pro ty ostatni mody potrebujes inicializacni vektor, coz je prave falesne neco z bloku X-1 pro x=1 (prvni zasifrovavany blok dat). Snad jsem to moc nezkomplikoval :) Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pytho + php sifrovanie/desifrovanie
Btw: nemáte zkušenosti s nějakým modulem pro šifrování na vyšší úrovni? 2011/6/8 Jirka Vejrazka jirka.vejra...@gmail.com Jediné, čo ma trápi je to, že pri posledných dvoch plainoch sú rovnaké začiatky. zaujímavé je, že pri Hello, World11 a Hello, World111 nie sú rovnaké začiatky. hm. Skúšal som zmeniť mód na CFB, CBC, ale vždy tie začiatky sú rovnaké. prečo tomu tak je? dúfal som, že by to nemalo byť rovnaké. Ahoj, Podivej se bliz na to, jak funguje AES. Zjistis, ze AES je blokova sifra, kdy se plaintext rozdeli na bloky a ty se zasifruji. Vychazi ti stejny ciphertext v poslednich dvou pripadech, protoze je stejny vstupni blok dat i stejny sifrovaci klic. Ty prvni dva pripady maji jiny ciphertext, protoze vstupni data maji mene nez 16 znaku (128 bitu) a tim padem jsou zarovnane mezerami a nejde o stejny vstup do blokove sifry. Experimentalne zjistis, ze kdyz ke druhemu pokusu (plain = Hello, World111) pridas na konec jeste jednu jednicku, dostanes stejny vysledek jako v pokusech 3 a 4, protoze len(plain) = 16. Pro ECB (ktery by se nemel pouzivat pro nic citliveho) tohle plati pro kazdy blok plaintextu, takze pokud bys mel opakovanou sekvenci 16 znaku na vstupu, dostanes pri ECB opakujici se sekvenci na vystupu (tech zasifrovanych 16 znaku). Pri ostatnich modech se do sifrovani bloku X promitne (neni uplne dulezite jak) neco z bloku X-1, takze 16 opakujicich se znaku se v kazdem bloku zasifruje trochu jinak. Proto pro ty ostatni mody potrebujes inicializacni vektor, coz je prave falesne neco z bloku X-1 pro x=1 (prvni zasifrovavany blok dat). Snad jsem to moc nezkomplikoval :) Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python -- PGP pub key: http://keyserver.pgp.com/vkd/SubmitSearch.event?SearchCriteria=visgean%40gmail.com http://www.abclinuxu.cz/lide/visgean/gpg A453 B7F3 33D9 3BE6 2B8A | F014 5347 EBAC 0A5A 3E92 Jabber: visg...@jabber.org | visg...@jabber.cz Github: http://github.com/Visgean ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pytho + php sifrovanie/desifrovanie
Co si predstavujes pod sifrovanim na vyssi urovni? 2011/6/8 Visgean Skeloru visg...@gmail.com: Btw: nemáte zkušenosti s nějakým modulem pro šifrování na vyšší úrovni? 2011/6/8 Jirka Vejrazka jirka.vejra...@gmail.com Jediné, čo ma trápi je to, že pri posledných dvoch plainoch sú rovnaké začiatky. zaujímavé je, že pri Hello, World11 a Hello, World111 nie sú rovnaké začiatky. hm. Skúšal som zmeniť mód na CFB, CBC, ale vždy tie začiatky sú rovnaké. prečo tomu tak je? dúfal som, že by to nemalo byť rovnaké. Ahoj, Podivej se bliz na to, jak funguje AES. Zjistis, ze AES je blokova sifra, kdy se plaintext rozdeli na bloky a ty se zasifruji. Vychazi ti stejny ciphertext v poslednich dvou pripadech, protoze je stejny vstupni blok dat i stejny sifrovaci klic. Ty prvni dva pripady maji jiny ciphertext, protoze vstupni data maji mene nez 16 znaku (128 bitu) a tim padem jsou zarovnane mezerami a nejde o stejny vstup do blokove sifry. Experimentalne zjistis, ze kdyz ke druhemu pokusu (plain = Hello, World111) pridas na konec jeste jednu jednicku, dostanes stejny vysledek jako v pokusech 3 a 4, protoze len(plain) = 16. Pro ECB (ktery by se nemel pouzivat pro nic citliveho) tohle plati pro kazdy blok plaintextu, takze pokud bys mel opakovanou sekvenci 16 znaku na vstupu, dostanes pri ECB opakujici se sekvenci na vystupu (tech zasifrovanych 16 znaku). Pri ostatnich modech se do sifrovani bloku X promitne (neni uplne dulezite jak) neco z bloku X-1, takze 16 opakujicich se znaku se v kazdem bloku zasifruje trochu jinak. Proto pro ty ostatni mody potrebujes inicializacni vektor, coz je prave falesne neco z bloku X-1 pro x=1 (prvni zasifrovavany blok dat). Snad jsem to moc nezkomplikoval :) Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python -- PGP pub key: http://keyserver.pgp.com/vkd/SubmitSearch.event?SearchCriteria=visgean%40gmail.com http://www.abclinuxu.cz/lide/visgean/gpg A453 B7F3 33D9 3BE6 2B8A | F014 5347 EBAC 0A5A 3E92 Jabber: visg...@jabber.org | visg...@jabber.cz Github: http://github.com/Visgean ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python -- Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pytho + php sifrovanie/desifrovanie
PyCrypto? Vys uz to asi rozumne nejde... ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pytho + php sifrovanie/desifrovanie
Hmm, tak to mne napada jenom keyczar: http://code.google.com/p/keyczar/downloads/detail?name=python-keyczar-0.6b.061709.tar.gz Zkus mozna byt presnejsi a napsat co se snazis vyresit nebo co ti nejde, sifrovani na vyssi urovni asi znamena pro kazdeho neco jineho... Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pytho + php sifrovanie/desifrovanie
Hehe, a ja jsem tak odolaval :-DD 2011/6/8 Jirka Vejrazka jirka.vejra...@gmail.com: Hmm, tak to mne napada jenom keyczar: http://code.google.com/p/keyczar/downloads/detail?name=python-keyczar-0.6b.061709.tar.gz Zkus mozna byt presnejsi a napsat co se snazis vyresit nebo co ti nejde, sifrovani na vyssi urovni asi znamena pro kazdeho neco jineho... Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python -- Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pytho + php sifrovanie/desifrovanie
Prostě něco kam jenom zadáte heslo/hash, typ šifry a text k zašifrování. Problém je v tomhle: Keyczar is very much beta software. The wire formats and key formats may change with later versions. Backward compatibility with early versions may not necessarily be maintained. zajímalo mě jestli tady jsou nějaké hotové/uznávané moduly co dělají podobné věci... 2011/6/8 rajcze raj...@gmail.com Hehe, a ja jsem tak odolaval :-DD 2011/6/8 Jirka Vejrazka jirka.vejra...@gmail.com: Hmm, tak to mne napada jenom keyczar: http://code.google.com/p/keyczar/downloads/detail?name=python-keyczar-0.6b.061709To ne, p.tar.gzhttp://code.google.com/p/keyczar/downloads/detail?name=python-keyczar-0.6b.061709.tar.gz Zkus mozna byt presnejsi a napsat co se snazis vyresit nebo co ti nejde, sifrovani na vyssi urovni asi znamena pro kazdeho neco jineho... Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python -- Rules of Optimization: Rule 1: Don't do it. Rule 2 (for experts only): Don't do it yet. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python -- PGP pub key: http://keyserver.pgp.com/vkd/SubmitSearch.event?SearchCriteria=visgean%40gmail.com http://www.abclinuxu.cz/lide/visgean/gpg A453 B7F3 33D9 3BE6 2B8A | F014 5347 EBAC 0A5A 3E92 Jabber: visg...@jabber.org | visg...@jabber.cz Github: http://github.com/Visgean ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pytho + php sifrovanie/desifrovanie
Prostě něco kam jenom zadáte heslo/hash, typ šifry a text k zašifrování. Tohle je bohuzel nerealne. Sifrovani potrebuje trochu vic, treba dobry generator nahodnych cisel a tak. Proste o sifrovani music neco vedet, aby to bylo bezpecne. Nikdo nikoho nenuti studovat detaily, ale tech par radek kodu ohledne inicializace a tak musi proste napsat kazdy. Pokud chces neco opravdu jednoducheho, mrkni se na http://www.freenet.org.nz/ezPyCrypto/ - nasel jsem to ve svem archivu. Ale uz jsem to nevidel leta, nevim jestli je to jeste pouzitelne. Pokud chces neco jeste jednodussiho, neni ti asi pomoci ;-) zajímalo mě jestli tady jsou nějaké hotové/uznávané moduly co dělají podobné věci... Ano, treba PyCrypto, uz nekolikrat zminovane. Je to Python interface okolo uznavanych sifrovacich knihoven. Jirka P.S. Nesnazim se te odradit, jenom bych te rad varoval ze akce typu zadam heslo, vyberu sifru a mam hotovo vedou k pomerne drahym chybam. Jestli si chces jenom zasifrovat MP3, tak pouzij XOR ;-) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python