-
1. Data: 2021-03-03 12:57:19
Temat: Python i klasy oraz dawka magii czyli niezrozumienie
Od: Roman Tyczka <r...@h...you.spammer>
Używam biblioteki Cryptography (https://github.com/pyca/cryptography) i
ona oferuje dla szyfrów blokowych klasy, które obsługują tryby mieszania
bloków. Użycie trybów z konkretnym algorytmem szyfrującym, dla tych
samych danych wejściowych, zwraca inny wynik, i to jest oczekiwane
zachowanie.
Ale nie mogę pojąć jak to jest zrobione od strony języka, bo gdy patrzę
na klasy trybów to niektóre się niczym nie różnią, a wynik ich użycia
daje inne efekty, np. takie trzy tryby OFB, CFB i CFB8:
class OFB(Mode, ModeWithInitializationVector):
name = "OFB"
def __init__(self, initialization_vector: bytes):
utils._check_byteslike("initialization_vector",
initialization_vector)
self._initialization_vector = initialization_vector
initialization_vector =
utils.read_only_property("_initialization_vector")
validate_for_algorithm = _check_iv_and_key_length
class CFB(Mode, ModeWithInitializationVector):
name = "CFB"
def __init__(self, initialization_vector: bytes):
utils._check_byteslike("initialization_vector",
initialization_vector)
self._initialization_vector = initialization_vector
initialization_vector =
utils.read_only_property("_initialization_vector")
validate_for_algorithm = _check_iv_and_key_length
class CFB8(Mode, ModeWithInitializationVector):
name = "CFB8"
def __init__(self, initialization_vector: bytes):
utils._check_byteslike("initialization_vector",
initialization_vector)
self._initialization_vector = initialization_vector
initialization_vector =
utils.read_only_property("_initialization_vector")
validate_for_algorithm = _check_iv_and_key_length
Poza polem "name" każda klasa jest identyczna, a jednak wynik jest inny.
Jak to działa?
Kod powyższy jest w pliku:
https://github.com/pyca/cryptography/blob/main/src/c
ryptography/hazmat/primitives/ciphers/modes.py
Przykład szyfrowania z algorytmem AES:
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms,
modes
key = os.urandom(32)
iv = os.urandom(16)
cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
encryptor = cipher.encryptor()
ct = encryptor.update(b"a secret message") + encryptor.finalize()
Dokumentacja biblioteki:
https://cryptography.io/en/latest/hazmat/primitives/
symmetric-encryption.html
--
pzdr
Roman
-
2. Data: 2021-06-30 15:04:45
Temat: Re: Python i klasy oraz dawka magii czyli niezrozumienie
Od: Piotr Wladyka <p...@g...com>
środa, 3 marca 2021 o 12:58:08 UTC+1 Roman Tyczka napisał(a):
[ - CIACH - ]
> Ale nie mogę pojąć jak to jest zrobione od strony języka, bo gdy patrzę
> na klasy trybów to niektóre się niczym nie różnią, a wynik ich użycia
> daje inne efekty, np. takie trzy tryby OFB, CFB i CFB8:
>
> class OFB(Mode, ModeWithInitializationVector):
> name = "OFB"
[ - CIACH - ]
> Poza polem "name" każda klasa jest identyczna, a jednak wynik jest inny.
> Jak to działa?
Odpowiedź masz na samym początku:
- - - - - - -
import abc
import typing
from cryptography import utils
from cryptography.hazmat.primitives._cipheralgorithm import CipherAlgorithm
class Mode(metaclass=abc.ABCMeta):
@abc.abstractproperty
def name(self) -> str:
"""
A string naming this mode (e.g. "ECB", "CBC").
"""
- - - - - - -
Autor używa mata-klas, prawdopodobnie dlatego, że pakiet jest napisany dla różnych
wersji pythona (CPython, PyPy, Py+Rust), więc rzeczywista implementacja algorytmu
siedzi głębiej (wybór "kawałków kodu do późniejszego użycia" odbywa się jeszcze na
poziomie instalacji modułu - pip, ... etc) , a właśnie zmienna "Mode.name" służy do
wyboju już konkretnej metody spośród "dostępnych dla tego środowiska".
---
pzdr,
Vlad P.
-
3. Data: 2021-06-30 15:36:19
Temat: Re: Python i klasy oraz dawka magii czyli niezrozumienie
Od: Roman Tyczka <r...@h...you.spammer>
On 30.06.2021 15:04, Piotr Wladyka wrote:
>> Poza polem "name" każda klasa jest identyczna, a jednak wynik jest inny.
>> Jak to działa?
>
>
> Odpowiedź masz na samym początku:
>
> - - - - - - -
> import abc
> import typing
>
> from cryptography import utils
> from cryptography.hazmat.primitives._cipheralgorithm import CipherAlgorithm
>
>
> class Mode(metaclass=abc.ABCMeta):
> @abc.abstractproperty
> def name(self) -> str:
> """
> A string naming this mode (e.g. "ECB", "CBC").
> """
> - - - - - - -
>
> Autor używa mata-klas, prawdopodobnie dlatego, że pakiet jest napisany dla różnych
wersji pythona (CPython, PyPy, Py+Rust), więc rzeczywista implementacja algorytmu
siedzi głębiej (wybór "kawałków kodu do późniejszego użycia" odbywa się jeszcze na
poziomie instalacji modułu - pip, ... etc) , a właśnie zmienna "Mode.name" służy do
wyboju już konkretnej metody spośród "dostępnych dla tego środowiska".
Thx!
A co konkretnie robi ten zapis:
def name(self) -> str:
"""
A string naming this mode (e.g. "ECB", "CBC").
"""
Jak go czytać, co wykonuje?
--
pzdr
Roman
-
4. Data: 2021-06-30 16:49:47
Temat: Re: Python i klasy oraz dawka magii czyli niezrozumienie
Od: Piotr Wladyka <p...@g...com>
środa, 30 czerwca 2021 o 15:36:51 UTC+2 Roman Tyczka napisał(a):
> A co konkretnie robi ten zapis:
> def name(self) -> str:
> """
> A string naming this mode (e.g. "ECB", "CBC").
> """
> Jak go czytać, co wykonuje?
Pierwsza linijka, z tego, co pamiętam, to rzadko używane w pythonie (jeśli nie
kombinujemy z numPy, PyPy, tudzież interfejsami do bibliotek napisanych w C/C++)
rozszerzenie mające wymuszać string-type na wyjściu funkcji "name()" - nie wiem jak i
kiedy działa, bo sam nigdy nie używałem.
Reszta to klasyczny help/komentarz do funkcji wyświetlany po wywołaniu np
"help(Mode.name)" bądź "ECB.name.__doc__".
Dużo bardziej tutaj istotna jest linia:
- - - - -
@abc.abstractproperty
- - - - -
nad "def name...", ale to jest właśnie część meta-programingu - tematyka szeroka i
dosyć mocno abstrakcyjna. Chyba musiałbym się pobawić kodem żeby samemu wyczaić o co
konkretnie chodzi.
Tak na szybkiego zajrzałem w pakiet (np. plik
"main/src/cryptography/hazmat/backends/openssl/backe
nd.py" daje pewien ogólny zarys) i wygląda na to, że powodem użycia meta-programmingu
jest nie różnorodność środowisk (jak napisałem), ale sama idea algorytmu: parser
składający/odczytujący poszczególne pola na interfejsie (ASN1). To mi wystarczy żeby
nie włazić głębiej - rozczajanie kodu zazwyczaj bywa bardziej czasochłonne niż jego
pisanie. ;)
---
pzdr,
Vlad P