def main(): if len(sys.argv) != 2: usage() f = open(sys.argv[1]) msg = f.read() f.close() tmp = bint.bint() p = bint.bint(tmp.read("p.txt")) q = bint.bint(tmp.read("q.txt")) e = bint.bint(tmp.read("e.txt")) n = p * q m = bint.bint(str(bint.Hash(sys.argv[1]))) m, sign = rsa(q,p,e,m,n) checksign = p.powmod(sign,e,n) print "sign: ("+str(m)+","+ str(sign)+ ")" if m == checksign: print "m==m' : "+str(m)+"=="+str(checksign) print "Sign is true!" else: print "m!=m' : "+str(m)+"!="+str(checksign) print "Sign is false!"
def Generation_keys(): File = open("p.txt", "r") #открываем файл на чтение p = int(File.read()) #считываем файл целиком File.close() # проверяем число p из файла на простоту с помощью теста Миллера if not is_prime(p): raise ValueError("Выбранное число не является простым.") #выбор g while True: g = random.randint(2, p - 1) #g - тоже случайное число 2<g<p-1 if ((p - 1) % g) != 1: #чтоб g не равнялся p-1 break x = random.randint(2, p - 1) #секретный ключ x, который равен 1<x<p p = bint.bint(str(p)) #перевод типов в длинную арифметику g = bint.bint(str(g)) x = bint.bint(str(x)) y = p.powmod(g, x, p) #расчет y=g^x mod p #открытыми являются (p,g,y) а закрытым x return p, g, y, x
def gen_keys(): f = open("p.txt") p = int(f.read()) f.close() while True: g = random.randint(2, p - 1) if ((p - 1) % g) != 1: break x = random.randint(2, p - 1) p = bint.bint(str(p)) g = bint.bint(str(g)) x = bint.bint(str(x)) y = p.powmod(g, x, p) return p, g, y, x
def elgamal(msg, p, g, y, x):# shifr / deshifr v odnoy functsii msg = bint.bint(str(msg)) #sozdaem bol'shoe chislo ot parametra - stroki vhodnogo soobsheniya if msg > p: #esli dlinna ishodnogo soobsheniya bolshe modulya - oshibka raise ValueError("Неверная длина сообщения") pp = str(p) # bol'shoe chislo P privodim k formatu stroki pp = int(pp) # ego zhe privodim k tselochislennomu tipu k = random.randint(2, pp - 1) #vibiraem sluchainoe chislo k 1 < k < p-1 k = bint.bint(str(k)) # privodim K k bol'shiomu chislu a = p.powmod(g, k, p)# a = g^k mod p # Кодирование b = p.powmod(y, k, p)# b = y^k mod p # Кодирование b = (msg * b) % p # b = y^k * M mod p, gde M ishodniy tekst print "\ncode: ("+str(a)+","+str(b)+")" decode_msg = p.powmod(a, x, p) #a^x mod p # Декодирование decode_msg = inverse(decode_msg, p) #(a^x)^-1 mod p decode_msg = (decode_msg * b) % p # b*(a^x)^-1 mod p chto sootvetstvuet decodirovannomu soobsheniu return decode_msg
def elgamal(msg, p, g, y, x): msg = bint.bint(str(msg)) if msg > p: raise ValueError("Неверная длина сообщения") pp = p.st() pp = int(pp) k = random.randint(2, pp - 1) k = bint.bint(str(k)) a = p.powmod(g, k, p) # Кодирование b = p.powmod(y, k, p) # Кодирование b = (msg * b) % p print "code ( "+ str(a) + "," + str(b) + ")" decode_msg = p.powmod(a, x, p) # Декодирование decode_msg = inverse(decode_msg, p) decode_msg = (decode_msg * b) % p return decode_msg
def rsa(msg, p, q, e): fi = (p - bint.bint(1)) * ( q - bint.bint(1) ) #vichislyaem phi po knizhke shitova) p and q prostie => phi(p)= p - 1 and phi(q)=q-1 d = generate_d(e, fi) # generim chislo d print "\nopen key: {" + str(e) + "," + str(p) + "}" print "\nclose key: {" + str(d) + "," + str(p) + "}" msg = bint.bint(str(msg)) modulus = p * q # vichislyaem n = p*q on zhe modul' if msg > modulus: raise ValueError( "Неверная длина сообщения") #esli soobshenie > modulya => oshibka code = d.powmod( msg, e, modulus) #code = msg^e mod modulus # Кодирование print "\ncode: " + str(code) decode_msg = d.powmod( code, d, modulus) # decod = code^d mod modulus # Декодирование return decode_msg
def gen_keys(): #schitivaem prostoe p f = open("p.txt") p = int(f.read()) f.close() #vibiraem primitivniy element g while True: g = random.randint(2, p - 1) if ((p - 1) % g) != 1: break # vibiraem sluchaynoe x 1 < x < p-1 x = random.randint(2, p - 1) p = bint.bint(str(p)) # privodim P k formatu bol'shogo chisla i vse ostal'noe tozhe g = bint.bint(str(g)) x = bint.bint(str(x)) y = p.powmod(g, x, p) # vichislyaem y = g^x mod p return p, g, y, x
def rsa(q,p,e,m,n): fi = (p - bint.bint(1)) * (q - bint.bint(1)) d = generate_d(e, fi) s = bint.bint() s = d.powmod(m,d,n) return m,s
def gen_keys(): """Генерирует ключи """ f = open("p.txt") p = int(f.read()) f.close() f = open("q.txt") q = int(f.read()) f.close() f = open("g.txt") g = int(f.read()) f.close() prime_test(p) prime_test(q) w = random.randint(2, q - 1) r = random.randint(2, q - 1) p = lib.bint(str(p)) q = lib.bint(str(q)) g = lib.bint(str(g)) w = lib.bint(str(w)) r = lib.bint(str(r)) inv_g = inverse(g, p) y = p.powmod(inv_g, w, p) x = p.powmod(g, r, p) print "\nКлючи сгенерированы:\n" print "x = ", x, "отсылается Виктору\n" return p, q, g, w, r, y, x
def Decoding(p, x, a, b): h = 1 h = bint.bint( str(h) ) #k переведем в большие числа, чтоб второй аргумент ф-ии powmod был bint Decode_message = (b * p.powmod(a, p - h - x, p)) % p #print(Decode_message) return Decode_message
def gen_keys(): # generiruem p q and g f = open("p.txt") p = int(f.read()) f.close() f = open("q.txt") q = int(f.read()) f.close() f = open("g.txt") g = int(f.read()) f.close() w = random.randint(2, q - 1) # w -sluchainoe chislo 1 < w < q-1 r = random.randint(2, q - 1) # r - sluchainoe chislo 1 < r < q-1 p = bint.bint(str(p)) q = bint.bint(str(q)) g = bint.bint(str(g)) w = bint.bint(str(w)) r = bint.bint(str(r)) inv_g = inverse(g, p) # nahodim g^-1 y = p.powmod(inv_g, w, p) # y = (g^-1)^w mod p x = p.powmod(g, r, p) # x = g^r mod p print "\nКлючи сгенерированы:\n" print "x = ", x, "отсылается Виктору\n" return p, q, g, w, r, y, x
def Coding(msg, p, g, y, x): msg = bint.bint(str(msg)) if msg > p: raise ValueError("Неверная длина сообщения") pp = p.st() #копируем содержимое p в pp pp = int(pp) #преобразование типов bigint в int k = random.randint(2, pp - 1) # 1<k<p-1 k = bint.bint(str(k)) #k переведем в большие числа a = p.powmod(g, k, p) #a=g^k mod p # A b = p.powmod(y, k, p) #b=y^k mod p # B b = (msg * b) % p #b=(msg * y^k mod p) #print(a) #print(b) return a, b
def keys(): f = open("p.txt") p = int(f.read()) f.close() f = open("q.txt") q = int(f.read()) f.close() f = open("g.txt") g = int(f.read()) f.close() w = random.randint(2, q - 1) r = random.randint(2, q - 1) p = bint.bint(str(p)) q = bint.bint(str(q)) g = bint.bint(str(g)) w = bint.bint(str(w)) r = bint.bint(str(r)) inv_g = inverse(g, p) y = p.powmod(inv_g, w, p) x = p.powmod(g, r, p) print "\nKeys is ready:" print "x = ", x, "to Bob" return p, q, g, w, r, y, x
def schnorr(p, q, g, w, r, y, x): e = random.randint(0, pow(2, 20) - 1) e = lib.bint(str(e)) s = (r + w * e) % q m1 = p.powmod(g, s, p) m2 = p.powmod(y, e, p) m = (m1 * m2) % p if m == x: print "подлинность установлена\n" else: print "Подлинность не установлена\n"
def generate_d(a, b): #вычисляется число d while True: x, y, g = xgcd(a, b) if g != bint.bint(1): raise ValueError( "Невозможно подобрать такое d, чтобы выполнялось условие d * e mod fi = 1." ) else: z = x % b # chislo d,tolko tut z, no na samom dele eto d :) break return z
def main(): if len(sys.argv) != 2: usage() try: f = open(sys.argv[1]) msg = int(f.read()) f.close() except IOError: print 'no such file', sys.argv[1] sys.exit(-1) print "\ntext: " + str(msg) tmp = bint.bint() p = bint.bint(tmp.read("p.txt")) q = bint.bint(tmp.read("q.txt")) e = bint.bint(tmp.read("e.txt")) decode_msg = rsa(msg, p, q, e) print "\ndecode: " + str(decode_msg)
def generate_d(a, b): """Генерирует число d """ while True: x, y, g = xgcd(a, b) if g != bint.bint(1): raise ValueError("Невозможно подобрать такое d, чтобы выполнялось условие d * e mod fi = 1.") else: z = x % b break return z
def gen_keys(): f = open("p.txt") p = int(f.read()) f.close() f = open("q.txt") q = int(f.read()) f.close() f = open("g.txt") g = int(f.read()) f.close() prime_test(p) prime_test(q) w = random.randint(2, q - 1) r = random.randint(2, q - 1) p = lib.bint(str(p)) q = lib.bint(str(q)) g = lib.bint(str(g)) w = lib.bint(str(w)) r = lib.bint(str(r)) inv_g = inverse(g, p) y = p.powmod(inv_g, w, p) x = p.powmod(g, r, p) return p, q, g, w, r, y, x
def schnorr(p, q, g, w, r, y, x): e = random.randint(0, pow(2, 20) - 1) #vibiraetsya chslo e takoe chto 0< e < 2^20 -1 e = bint.bint(str(e)) print "e = ", e, "отсылается Пегги\n" s = (r + w * e) % q # s = (r+ w*e) mod q print "s = ", s, "отсылается Виктору\n" m1 = p.powmod(g, s, p) # m1=g^s mod p m2 = p.powmod(y, e, p) # m2=y^e mod p m = (m1 * m2) % p # m = m1*m2 mod p if m == x: print "Виктор удостоверился в подлинности x = ", m, "\n" else: print "Подлинность не установлена\n"
def schnorr(p, q, g, w, r, y, x): e = random.randint(0, pow(2, 20) - 1) e = lib.bint(str(e)) print "e = ", e, "отсылается Пегги\n" s = (r + w * e) % q print "s = ", s, "отсылается Виктору\n" m1 = p.powmod(g, s, p) m2 = p.powmod(y, e, p) m = (m1 * m2) % p if m == x: print "Виктор удостоверился в подлинности x = ", m, "\n" else: print "Подлинность не установлена\n"
def shnor(p, q, g, w, r, y, x): e = random.randint(0, pow(2, 20) - 1) e = bint.bint(str(e)) print "e = ", e, "to Alice" s = (r + w * e) % q print "s = ", s, "to Bob" m1 = p.powmod(g, s, p) m2 = p.powmod(y, e, p) m = (m1 * m2) % p if m == x: print "Alice is Alise x = ", m, "" else: print "Wrong"
def xgcd(a, b): if a == lib.bint(0): return 0, 1, b if b == lib.bint(0): return 1, 0, a px = lib.bint(0) ppx = lib.bint(1) py = lib.bint(1) ppy = lib.bint(0) while b > lib.bint(0): q = a / b a, b = b, a % b x = ppx - q * px y = ppy - q * py ppx, px = px, x ppy, py = py, y return ppx, ppy, a
def xgcd(a, b): if a == bint.bint(0): return 0, 1, b if b == bint.bint(0): return 1, 0, a px = bint.bint(0) ppx = bint.bint(1) py = bint.bint(1) ppy = bint.bint(0) while b > bint.bint(0): q = a / b a, b = b, a % b x = ppx - q * px y = ppy - q * py ppx, px = px, x ppy, py = py, y return ppx, ppy, a
def xgcd(a, b): if a == bint.bint(0): # -> esli a = 0 , gde 0 formata bol'shogo chisla return 0, 1, b if b == bint.bint(0): # esli b = 0 , gde 0 formata bol'shogo chisla return 1, 0, a #matritsa E px = bint.bint(0) ppx = bint.bint(1) py = bint.bint(1) ppy = bint.bint(0) while b > bint.bint(0): q = a / b a, b = b, a % b x = ppx - q * px y = ppy - q * py ppx, px = px, x ppy, py = py, y return ppx, ppy, a
def xgcd(a, b): """Расширенный алгоритм Евклида """ if a == bint.bint(0): return 0, 1, b if b == bint.bint(0): return 1, 0, a px = bint.bint(0) ppx = bint.bint(1) py = bint.bint(1) ppy = bint.bint(0) while b > bint.bint(0): q = a / b a, b = b, a % b x = ppx - q * px y = ppy - q * py ppx, px = px, x ppy, py = py, y return ppx, ppy, a
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import bint as lib def usage(): print "\nИспользование: TCProgLab входной_файл1.txt (+-x/%^) входной_файл2.txt файл_результата.txt -b(бинарный режим, если необходимо)\n" sys.exit(-1) b1 = lib.bint() b2 = lib.bint() b3 = lib.bint() binary = False if len(sys.argv) < 5 or len(sys.argv) > 6: usage() elif len(sys.argv) == 6: if sys.argv[5] == "-b": binary = True else: usage() if binary == False: b1 = lib.bint(b1.read(sys.argv[1])) b2 = lib.bint(b2.read(sys.argv[3])) else: b1 = b1.readbin(sys.argv[1])
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import bint as lib def usage(): print "\nИспользование: TCProgLab входной_файл1.txt (+-x/%^) входной_файл2.txt файл_результата.txt -b(бинарный режим, если необходимо)\n"; sys.exit(-1); b1 = lib.bint(); b2 = lib.bint(); b3 = lib.bint(); binary = False; if len(sys.argv) < 5 or len(sys.argv) > 6: usage(); elif len(sys.argv) == 6: if sys.argv[5] == "-b": binary = True; else: usage(); if binary == False: b1 = lib.bint(b1.read(sys.argv[1])); b2 = lib.bint(b2.read(sys.argv[3])); else: b1 = b1.readbin(sys.argv[1]); b2 = b2.readbin(sys.argv[3]);