65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
from Cryptotools.Groups.cyclic import Cyclic
|
|
from Cryptotools.Numbers.primeNumber import getPrimeNumber
|
|
from random import randint, choice
|
|
from math import log, log10, log2
|
|
|
|
"""
|
|
Here, we will try to understand why we need to have a generator when we encrypt data for Diffie-Hellman
|
|
https://crypto.stackexchange.com/questions/25489/why-does-diffie-hellman-need-be-a-cyclic-group
|
|
"""
|
|
def operation(a, b, n):
|
|
return (a ** b) % n
|
|
|
|
def getGenerator(gr, p):
|
|
index = 1
|
|
for g in range(2, p):
|
|
z = list()
|
|
for entry in range(1, p):
|
|
res = operation(g, index, p)
|
|
#if res not in z:
|
|
z.append(res)
|
|
index = index + 1
|
|
print(f"{g}: {sorted(z)}")
|
|
|
|
def generateGroupByG(gr, p, g):
|
|
index = 1
|
|
z = list()
|
|
for entry in range(1, p):
|
|
res = operation(g, index, p)
|
|
#if res not in z:
|
|
z.append(res)
|
|
index = index + 1
|
|
return z
|
|
|
|
def computePublicKey(key, p, g):
|
|
return (g ** key) % p
|
|
|
|
|
|
gr = list()
|
|
# Public value
|
|
p = 5
|
|
g = 0
|
|
for i in range(1, p):
|
|
gr.append(i)
|
|
|
|
print(f"p = {p}")
|
|
print(f"G = {gr}")
|
|
# We try with a generator which is not in list
|
|
cyclic = Cyclic(gr, p, operation)
|
|
generators = cyclic.getGenerators()
|
|
print(f"All generators: {generators}")
|
|
|
|
# Generate group with g = 2
|
|
grWithG = generateGroupByG(gr, p, 2)
|
|
print(f"Group generated with g = 2: {grWithG}")
|
|
|
|
for a in grWithG:
|
|
# print(f"log2({a}) = {log(a, 2)}") # Same as below
|
|
print(f"log2({a}) = {log2(a)}")
|
|
|
|
print()
|
|
|
|
for a in range(1, len(grWithG) + 1):
|
|
print(f"log2({a}) = {log2(a)}")
|