Pular para conteúdo

JBR

JBR

Classe utilizada para relização do cálculo de inverso modular, baseado no algoritmo JBR desenvolvido pelo Doutor Joacil Basílio Rael. O algoritmo é baseado em uma releitura do Algoritmo Estentido de Euclides.

Attributes:

Name Type Description
mod int

O módulo para o cálculo de inverso modular, maior que 1

Source code in rsa/utils/JBR.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class JBR:
    """
    Classe utilizada para relização do cálculo de inverso modular, baseado no algoritmo JBR desenvolvido pelo Doutor Joacil Basílio Rael.
    O algoritmo é baseado em uma releitura do Algoritmo Estentido de Euclides.

    Attributes:
        mod (int): O módulo para o cálculo de inverso modular, maior que 1
    """

    def __init__(self, mod: int) -> None:
        self.mod = mod
        self.original_mod = mod
        self.j, self.b, self.count = 0, 1, 1

    def invMod(self, num: int) -> int:
        """
        Realiza as rodadas do algoritmo JBR.

        Attributes:
            num (int): O número que se deseja saber o inverso modular, maior que 1

        Returns:
            (int): O inverso modular de 'num % mod'

        Examples:
            >>> JBR(mod=256).invMod(num=123)
            179
        """

        if num == 0:
            raise ZeroDivisionError(
                'Não existe inverso modular para o valor informado'
            )

        resto = self.mod % num
        r = self.mod // num

        inv = self.j + self.b * r

        if resto == 1:
            return (
                ((-1) ** self.count) * inv + self.original_mod
            ) % self.original_mod

        self.j, self.b, self.mod = self.b, inv, num
        self.count += 1
        return self.invMod(num=resto)

invMod(num)

Realiza as rodadas do algoritmo JBR.

Attributes:

Name Type Description
num int

O número que se deseja saber o inverso modular, maior que 1

Returns:

Type Description
int

O inverso modular de 'num % mod'

Examples:

>>> JBR(mod=256).invMod(num=123)
179
Source code in rsa/utils/JBR.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def invMod(self, num: int) -> int:
    """
    Realiza as rodadas do algoritmo JBR.

    Attributes:
        num (int): O número que se deseja saber o inverso modular, maior que 1

    Returns:
        (int): O inverso modular de 'num % mod'

    Examples:
        >>> JBR(mod=256).invMod(num=123)
        179
    """

    if num == 0:
        raise ZeroDivisionError(
            'Não existe inverso modular para o valor informado'
        )

    resto = self.mod % num
    r = self.mod // num

    inv = self.j + self.b * r

    if resto == 1:
        return (
            ((-1) ** self.count) * inv + self.original_mod
        ) % self.original_mod

    self.j, self.b, self.mod = self.b, inv, num
    self.count += 1
    return self.invMod(num=resto)