示例#1
0
文件: lab3.py 项目: NoFunny/7semester
 def decode(self, S, D, N):
     self.Y = self.m
     if int.from_bytes(self.Y, 'big') >= self.P:
         for i in range(0, self.m.__len__()):
             self.W[i] = lab1.fastModuloExponentiation(S[i], D, N)
     else:
         self.W = lab1.fastModuloExponentiation(S, D, N)
示例#2
0
文件: lab3.py 项目: NoFunny/7semester
 def encode(self):
     if int.from_bytes(self.m, 'big') >= self.P:
         for i in range(0, self.m.__len__()):
             self.S[i] = lab1.fastModuloExponentiation(
                 self.Y[i], self.C, self.N)
     else:
         self.S = lab1.fastModuloExponentiation(self.m, self.C, self.N)
示例#3
0
def el_gamal(p, g, m):
    if not isPrime(p): sys.exit('ERROR. [P] must be prime number or p <= 255.')
    Ca = random.randint(1, p - 1)
    Cb = random.randint(1, p - 1)  # Алгоритм евлкида
    Cd = random.randint(1, p - 1)
    Da = lab1.fastModuloExponentiation(g, Ca, p)
    Db = lab1.fastModuloExponentiation(g, Cb, p)
    Dc = lab1.fastModuloExponentiation(g, Cd, p)
    # Зачем нужны Ca, Cd, Da, Dc пока что не разобрался, но в методичке они есть
    if int.from_bytes(m, 'big') >= p:
        k = [0] * m.__len__()
        r = [0] * m.__len__()
        mx = [0] * m.__len__()
        e = [0] * m.__len__()

        for i in range(0, m.__len__()):
            k[i] = random.randint(1, p - 2)
            r[i] = lab1.fastModuloExponentiation(g, k[i], p)
            e[i] = m[i] * lab1.fastModuloExponentiation(Db, k[i], p) % p
            mx[i] = e[i] * lab1.fastModuloExponentiation(r[i], p - 1 - Cb,
                                                         p) % p
        out = bytearray(mx)
        with open("elGamal_out.mp3", 'wb') as f:
            f.write(out)
        for i in range(0, m.__len__()):
            if mx[i] == m[i]:
                print(mx[i], ' == ', m[i])
                continue
            else:
                print(mx[i], ' != ', m[i])
                print("Error!")
                return False
        print("Successful!")
        return True
    else:
        k = random.randint(1, p - 2)
        r = lab1.fastModuloExponentiation(g, k, p)
        e = m * lab1.fastModuloExponentiation(Db, k, p) % p
        mx = e * lab1.fastModuloExponentiation(r, p - 1 - Cb, p) % p
    if m == mx:
        print(m, ' == ', mx)
        print("Successful!")
        return True
    print(m, ' != ', mx)
    print("Error!")
    return False
示例#4
0
文件: lab3.py 项目: NoFunny/7semester
 def encode(self):
     self.r = lab1.fastModuloExponentiation(self.g, self.k, self.p)
     print('r = ', self.r)
     if int.from_bytes(self.h, 'big') >= self.p:
         for i in range(0, self.h.__len__()):
             # print(2)
             self.u[i] = (self.h[i] - self.x * self.r) % (self.p - 1)
             self.k_tmp[i] = lab1.mulinv(self.k, self.p - 1)
             self.s[i] = self.k_tmp[i] * self.u[i] % (self.p - 1)
     else:
         self.u = (self.h - self.x * self.r) % (self.p - 1)
         self.k_tmp = lab1.mulinv(self.k, self.p - 1)
         self.s = self.k_tmp * self.u % (self.p - 1)
示例#5
0
def shamir_secret(m, p):
    if not (isPrime(p) and (p > 255)):
        sys.exit('ERROR. [P] must be prime number or p <= 255.')
    Ca = lab1.generate_g(p)
    Cb = lab1.generate_g(p)
    Da = lab1.genEuclideanAlgo(Ca, p - 1)[1]
    Db = lab1.genEuclideanAlgo(Cb, p - 1)[1]
    if int.from_bytes(m, 'big') >= p:
        x1 = [0] * m.__len__()
        x2 = [0] * m.__len__()
        x3 = [0] * m.__len__()
        x4 = [0] * m.__len__()
        for i in range(0, m.__len__()):
            x1[i] = lab1.fastModuloExponentiation(m[i], Ca, p)
            x2[i] = lab1.fastModuloExponentiation(x1[i], Cb, p)
            x3[i] = lab1.fastModuloExponentiation(x2[i], Da, p)
            x4[i] = lab1.fastModuloExponentiation(x3[i], Db, p)
            # Проверка на равность полученного сообщения и изначального
        out = bytearray(x4)
        with open("Shamir_out.gif", 'wb') as f:
            f.write(out)
        for i in range(0, m.__len__()):
            if x4[i] == m[i]:
                print(x4[i], ' == ', m[i])
                continue
            else:
                print(x4[i], ' != ', m[i])
                print("Error!")
                return False
        print("Successful!")
        return True
    else:
        x1 = lab1.fastModuloExponentiation(int.from_bytes(m, 'big'), Ca, p)
        x2 = lab1.fastModuloExponentiation(x1, Cb, p)
        x3 = lab1.fastModuloExponentiation(x2, Da, p)
        x4 = lab1.fastModuloExponentiation(x3, Db, p)

        # Проверка на равность полученного сообщения и изначального
        if not x4 == int.from_bytes(m, 'big'):
            print(x4, ' != ', m)
            print("Error!")
            return False
        print(x4, ' == ', m)
        print("Successful!")
        return True
示例#6
0
文件: lab3.py 项目: NoFunny/7semester
 def __init__(self, p, g, m):
     self.p = p
     self.g = g
     self.h = m
     self.x = lab1.generate_g(p - 2)
     self.y = lab1.fastModuloExponentiation(self.g, self.x, self.p)
     self.k = lab1.generate_g(p - 2)
     print(lab1.genEuclideanAlgo(self.k, p - 1))
     self.r = 0
     if int.from_bytes(self.h, 'big') >= self.p:
         self.u = [0] * m.__len__()
         self.s = [0] * m.__len__()
         self.k_tmp = [0] * m.__len__()
     else:
         self.r = 0
         self.u = 0
         self.s = 0
         self.k_tmp = 0
示例#7
0
文件: lab3.py 项目: NoFunny/7semester
 def decode(self, r, s):
     left = 0
     right = 0
     if int.from_bytes(self.h, 'big') >= self.p:
         left = [0] * self.h.__len__()
         right = [0] * self.h.__len__()
         # print('r = ', r)
         # print('s = ', s)
         # print('p = ', self.p)
         for i in range(0, self.h.__len__()):
             left[i] = lab1.fastModuloExponentiation(self.y, r, self.p) * \
                    lab1.fastModuloExponentiation(r, s[i], self.p)
             right[i] = lab1.fastModuloExponentiation(
                 self.g, self.h[i], self.p)
     else:
         left = lab1.fastModuloExponentiation(
             self.y, r, self.p) * lab1.fastModuloExponentiation(
                 r, s, self.p)
         right = lab1.fastModuloExponentiation(self.g, self.h, self.p)
     return left, right
示例#8
0
 def decrypt(self, e):
     mx = [0] * e.__len__()
     for i in range(0, e.__len__()):
         mx[i] = lab1.fastModuloExponentiation(e[i], self.C, self.N)
     return mx
示例#9
0
 def encrypt(self, D, N):
     e = [0] * self.m.__len__()
     for i in range(0, self.m.__len__()):
         e[i] = lab1.fastModuloExponentiation(self.m[i], D, N)
     return e