[python] pytho + php sifrovanie/desifrovanie

Petr Messner petr.messner na gmail.com
Sobota Červen 4 18:59:56 CEST 2011


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 <peterirbizon 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
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python