Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- N=11
- p=3
- q=31
- d=2
- FP=GF(p)
- FQ=GF(q)
- RP.<u>=PolynomialRing(FP)
- RQ.<v>=PolynomialRing(FQ)
- FP.<z>=RP.quotient(u^N-1)
- FQ.<y>=RQ.quotient(v^N-1)
- FZ.<x>=PolynomialRing(ZZ)
- FZ.<x>=PolynomialRing(ZZ)
- FX.<x>=FZ.quotient(x^N-1)
- def wielomian_trinarny(d1,d2,N):
- lp=[i for i in range(N)]
- p=[0 for i in range(N)]
- ld1=0
- ld2=0
- while(d1!=ld1):
- tmp1=random.choice(lp)
- element=p[tmp1]
- if element!=1 and element!=-1:
- p[tmp1] =1
- ld1=ld1+1
- while(d2!=ld2):
- tmp2=random.choice(lp)
- element=p[tmp2]
- if element!=1 and element!=-1:
- p[tmp2] =-1
- ld2=ld2+1
- return p
- def funkcja(f,q):
- Z=len(list(f))
- f=list(f)
- a=q/2
- for i in range(Z):
- if f[i]>floor(a): f[i]=f[i]-q
- elif f[i]<ceil(-a): f[i]=f[i]+q
- else: f[i]=f[i]
- return f
- def encrypt(M,h):
- m=FQ(M)
- lr=wielomian_trinarny(d,d,N)
- R=FQ(lr)
- c=p*R*h+m
- c=FQ(list(c))
- return c
- def decrypt(lf,c,odfp):
- a=FX(lf)*FX(list(c))
- a=FQ(list(a))
- a=FX(list(a))
- b=FP(funkcja(a,q))
- odfp=FP(list(odfp))
- b1=b*odfp
- dm=funkcja(b1,p)
- dm=FQ(list(dm))
- return dm
- def main(N,p,q,d):
- lg=wielomian_trinarny(d,d,N)
- flag=1
- while flag==1:
- flag=0
- lf=wielomian_trinarny(d+1,d,N)
- fp=FP(lf)
- fq=FQ(lf)
- try:
- odfp=fp^(-1)
- except ZeroDivisionError:
- flag=1
- try:
- odfq=fq^(-1)
- except ZeroDivisionError:
- flag=1
- lg=FQ(lg)
- h=odfq*lg
- M=wielomian_trinarny(N,0,N)
- #print M
- m=FQ(M)
- print "Wiadomosc:",m
- c=encrypt(M,h)
- print "Zaszyfrowana:",c
- dm=decrypt(lf,c,odfp)
- print "Odszyfrowana wiadomosc:",dm
- return m==dm
- print main(N,p,q,d)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement