· 7 years ago · Jan 15, 2019, 02:58 PM
1Zx.<x> = ZZ[]
2n = 7
3d = 3
4q = 29
5p = 2
6
7pk=23+23*x+23*x^2+24*x^3+23*x^4+24*x^5+23*x^6
8
9# FUNKCJE MATEMATYCZNE
10def convolution(f,g):
11 return ((f * g) % (x^n-1))
12
13def balancedmod(f,q):
14 g = list(((f[i] + q//2) % q) - q//2 for i in range(n))
15 return (Zx(g))
16
17def randomdpoly():
18 assert (d <= n)
19 result = n*[0]
20 for j in range(d):
21 while True:
22 r = randrange(n)
23 if (not result[r]):
24 break
25 result[r] = 1-2*randrange(2)
26 return (Zx(result))
27
28def invertmodprime(f,p):
29 T = Zx.change_ring(Integers(p)).quotient(x^n-1)
30 return (Zx(lift(1 / T(f))))
31
32def invertmodpowerof2(f,q):
33 assert q.is_power_of(2)
34 g = invertmodprime(f,2)
35 while True:
36 r = balancedmod(convolution(g,f),q)
37 if (r == 1):
38 return g
39 g = balancedmod(convolution(g,2 - r),q)
40
41# GENEROWANIE KLUCZY
42def keypair():
43 while True:
44 try:
45 f = randomdpoly()
46 fp = invertmodprime(f,p)
47 fq = invertmodpowerof2(f,q)
48 break
49 except:
50 pass
51 g = randomdpoly()
52 publickey = balancedmod(p * convolution(fq,g),q)
53 secretkey = f,fp
54 return publickey,secretkey
55
56# GENEROWANIE WIADOMOSCI
57#def randommessage():
58# result = list(randrange(3) - 1 for j in range(n))
59# return (Zx(result))
60
61# SZYFROWANIE
62#def encrypt(message,publickey):
63# r = randomdpoly()
64# return balancedmod(convolution(publickey,r) + message,q)
65# ODSZYFROWYWANIE
66
67
68#publickey,secretkey = keypair()
69#print '\nKLUCZ PUBLICZNY'
70#publickey
71#print'\nKLUCZ PRYWATNY'
72#secretkey
73
74#message=randommessage()
75#print'\nWIADOMOSC'
76#message
77
78#encrypted=encrypt(message,publickey)
79#print'\nWIADOMOSC ZASZYFROWANA'
80#encrypted
81
82#decrypted = decrypt(encrypted,secretkey)
83#print'\nWIADOMOSC ODSZYFROWANA'
84#decrypted
85# SPRAWDZENIE
86#if (message == decrypted):
87# print'\nWIADOMOSC ZASZYFROWANA I ODSZYFROWANA ZGADZAJA SIE'
88#else:
89# print'\nWIADOMOSCI SIE NIE ZGADZAJA'
90
91#c=1+3*x+3*x^2+4*x^3+4*x^4+x^5+35*x^6
92
93#decrypt(c)
94
95def encrypt(message,publickey):
96 r = 1+x+x^3+x^6
97 return balancedmod(convolution(publickey,r) + message,q)
98
99def decrypt(ciphertext):
100 f=1+x+x^2+x^4+x^5
101 fp=1+x^5+x^6
102 a = balancedmod(convolution(ciphertext,f),q)
103 return balancedmod(convolution(a,fp),p)
104
105m=1+x^5
106
107enc = encrypt(m,pk)
108enc
109
110dec = decrypt(enc)
111dec