índice
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:
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
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
-
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.
-
Selecione aleatoriamente um inteiro d como a chave, 2≤d≤p-2. Escolhemos d = 5,
-
Calcule β = α d mod p, β = 2 5 mod 37 = 32
2. Criptografia
Suponha que Alice queira enviar uma mensagem x = 29
- 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 - 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