[python] pytho + php sifrovanie/desifrovanie

rajcze rajcze na gmail.com
Středa Červen 8 09:17:52 CEST 2011


Preklep:

"... stejnych 16 _bytu_ dat .."

2011/6/8 rajcze <rajcze na 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 <peterirbizon na 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, World1111111111"
>> ciphertext = AES.new("tajneheslo123456",
>> AES.MODE_ECB).encrypt(resize(plain, AES.block_size))
>> print ciphertext.encode('hex')  # napise
>> a8ba9848cd563d3e762de25fffaf7aa46e7a5f28eae4e2f0684f8d9ef949869f
>>
>> plain = "Hello, World111111111111"
>> 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... na 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... na 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... na py.cz
>> > >http://www.py.cz/mailman/listinfo/python- Skrýt citovaný text -
>> >
>> > - Zobrazit citovaný text -
>>
>> _______________________________________________
>> Python mailing list
>> Python na 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.


Další informace o konferenci Python