Introdução ao algoritmo de criptografia ElGamal

Introdução

Anterior descreve a introdução do algoritmo RSA do algoritmo de criptografia assimétrica RSA , este olhar para o algoritmo ElGamal.
Primeiro, é um algoritmo de criptografia assimétrica baseado na troca de chaves Diffie-Hellman. Foi proposto por Tahir Gemmore em 1985. Ele pode ser definido em qualquer grupo cíclico G. Sua segurança depende do problema de logaritmo discreto em G. (RSA é baseado na fatoração de grandes números)

Antes de introduzir o princípio do algoritmo, familiarize-se com alguns conceitos:

Ordem

Suponha que n> 1, a e n sejam relativamente primos, então deve haver um x (1≤x ≤n-1) tal que: a x ≡ 1 (mod n)
satisfaz o menor inteiro x de a x ≡ 1 (mod n), denominado É a ordem de um mod n. O símbolo é representado como Ord n (a)

Observe a equação a x ≡1 (modn) De acordo com o teorema de Euler, podemos obviamente saber que φ (n) é uma solução da equação, mas pode não ser a menor, então não é necessariamente a ordem, e quando φ (n) é um módulo Quando a ordem de n é, chamamos a a elemento primitivo de n.

Motomoto

Quando a ordem de um módulo n é φ (n), isto é, se e somente se x for um múltiplo de φ (n), de modo que a x ≡1 (mod n) seja válido, então a é chamado de elemento primitivo de n.
Por exemplo:
Insira a descrição da imagem aqui
esses restos constituem um sistema de restos completos 1, 2, 3, 4, 5, 6 módulo 7, ou seja, para qualquer a, x0 pode ser encontrado como:
5 x0 ≡a (mod 7).

Elemento primitivo resolvendo Python:

# 用辗转相除求最大公因子
def gcd(a, b):
    r = a % b
    while r != 0:
        a = b
        b = r
        r = a % b
    return b


# 欧拉函数
def euler(a):
    cnt = 0
    for i in range(1, a):
        if gcd(a, i) == 1:
            cnt += 1
    return cnt


# 阶
def order(a, n, b):
    #   输出b在mod(a)中的阶
    #   n是mod(a)群的阶
    p = 1
    while p <= n and b ** p % a != 1:
        p += 1
    if p <= n:
        return p
    else:
        return -1


# 求本原元
def primitive_root(a):
    n = euler(a)
    for b in range(2, a):
        if order(a, n, b) == n:
            return b

print(primitive_root(37))
# 可以看到,是2

Fluxo de algoritmo

Insira a descrição da imagem aqui
Também é apresentado por meio de um caso, ou Alice deseja usar o algoritmo de criptografia ElGamal para enviar informações a Bob. .

1. Geração de chave

  1. Para Bob, devemos primeiro selecionar aleatoriamente um grande número primo p e p-1 deve ter um grande fator primo. Em seguida, escolha um elemento primitivo α módulo p. Publique p e α. Para a conveniência do cálculo, tomamos p = 37, então um elemento primitivo de Z37 α = 2.

  2. Selecione aleatoriamente um inteiro d como a chave, 2≤d≤p-2. Escolhemos d = 5,

  3. Calcule β = α d mod p, β = 2 5 mod 37 = 32

2. Criptografia

Suponha que Alice queira enviar uma mensagem x = 29

  1. Primeiro selecione um número aleatório k, assumindo k = 7,
    então: y1 = α k mod p = 2 7 mod 37 = 17
    y2 = x β k mod p = 29 × 32 7 mod 37 = 33
  2. Envie o texto cifrado y = (17,33) para Bob

3. Descriptografar

Bob recebe o texto cifrado y = (17,33) e restaura o texto simples da seguinte forma:
x = y2 (y1 d ) -1 mod p
= 33 (17 5 ) -1 mod 37
= 33 × 2 mod 37
= 29

Acho que você gosta

Origin blog.csdn.net/Pioo_/article/details/111838741
Recomendado
Clasificación