├── CryptoChaos.py ├── CryptoGA.py ├── CryptoPartialPivot.py ├── SSIM.py └── test.jpg /CryptoChaos.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | from math import sin,pi,floor 3 | import numpy as np 4 | from time import time 5 | def chirikov(x): 6 | height,width=len(x),len(x[0]) 7 | n=height 8 | K=10000000 #this parameter acts as the key.It decides the degree of deviation in the image 9 | newarray=np.zeros((height,width)) 10 | newarray[0][0]=x[0][0] 11 | for i in range(height): 12 | for j in range(width): 13 | if (i+j)!=0: 14 | xnew=(i-1+j-1)%n 15 | ynew=(floor(j-1+K*sin(2*pi*xnew/n)))%n 16 | newarray[xnew][ynew]=x[i][j] 17 | for i in range(height): 18 | for j in range(width): 19 | x[i][j]=newarray[i][j] 20 | return x 21 | 22 | def chirikovdec(x): #the decryption function 23 | height,width=len(x),len(x[0]) 24 | n=height 25 | K=10000000#this parameter has to be equal to its counterpart in the encrypt function. 26 | newarray=np.zeros((height,width)) 27 | newarray[0][0]=x[0][0] 28 | for i in range(height): 29 | for j in range(width): 30 | if (i+j)!=0: 31 | xnew=(floor(i-j+K*sin(2*pi*(i)/n)))%n 32 | ynew=(floor(j-K*sin(2*pi*(i)/n)))%n 33 | newarray[xnew][ynew]=x[i][j] 34 | for i in range(height): 35 | for j in range(width): 36 | x[i][j]=newarray[i][j] 37 | return x 38 | 39 | if __name__=="__main__": 40 | x=cv2.imread("test.jpg",0) 41 | t1=time() 42 | x=chirikov(x) 43 | t2=time() 44 | #x=chirikovdec(x) 45 | t3=time() 46 | print(t2-t1,t3-t2) 47 | cv2.imwrite("output_Chaos.jpg",x) 48 | #cv2.imwrite("output_Chaos_decrypted.jpg",x) 49 | #cv2.imwrite("Output",x) 50 | 51 | -------------------------------------------------------------------------------- /CryptoGA.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | from time import time 4 | def prg(seed,iters,l): 5 | op=seed 6 | while iters: 7 | op=(29*seed+13)%l 8 | seed=op 9 | iters-=1 10 | return op 11 | 12 | 13 | def getrvals(x,l): 14 | r1=0 15 | r2=0 16 | width,height=len(x[0]),len(x) 17 | for i in range(0,height): 18 | for j in range(0,width): 19 | r1+=pow(-1,i+j)*x[i][j] 20 | r2+=pow(-1,i+j+1)*x[i][j] 21 | return abs(r1//(height*l)),abs(r2//(height*l)) 22 | 23 | def createvectors(x,l): 24 | frags_per_row=len(x[0])//l 25 | vecs=[] 26 | for dummyvecs in x: 27 | for i in range(0,frags_per_row): 28 | vecs.append(dummyvecs[i*l:(i+1)*l]) 29 | return vecs 30 | 31 | def crossover(vector,x,y,l): 32 | if x<=l-1 and y<=l-1: 33 | coi=x 34 | else: 35 | coi=0 36 | coiter=(3*x+5*y)%l 37 | for j in range(0,2*coiter,2): 38 | n1=prg(coi,j,l) 39 | n2=prg(coi,j+1,l) 40 | temp=vector[n1] 41 | vector[n1]=vector[n2] 42 | vector[n2]=temp 43 | return vector 44 | def mutate(vector,x,y,l): 45 | if x abs(M[k][k]): 15 | M[k], M[i] = M[i],M[k] 16 | swap[k].append((k,i)) 17 | else: 18 | pass 19 | for j in range(k+1,n): 20 | q = float(M[j][k]) / M[k][k] 21 | modify[k].append(q) 22 | for m in range(k, n): 23 | M[j][m] = M[j][m] - q * M[k][m] 24 | 25 | return [M,swap,modify] 26 | 27 | def decrypt(M,swap,modify): 28 | n=len(M) 29 | swap.reverse() #Apply the same operations in reverse 30 | modify.reverse() 31 | for k in range(n-2,-1,-1): 32 | index=0 33 | for dummy in range(k+1,n): 34 | for j in range(0,n): 35 | M[dummy][j]+=modify[n-2-k][index]*M[k][j] 36 | index+=1 37 | for (i,j) in list(reversed(swap[n-2-k])): 38 | M[i],M[j]=M[j],M[i] 39 | return M 40 | 41 | if __name__=="__main__": 42 | mtx = cv2.imread(r"test.jpg",0) 43 | mtx=mtx.tolist() 44 | t1=time() 45 | mtx,swap,modify=encrypt(mtx) 46 | t2=time() 47 | #mtx=decrypt(mtx,swap,modify) 48 | t3=time() 49 | mtx=np.array(mtx) 50 | print(t2-t1," ",t3-t2) 51 | #cv2.imwrite(r'output_PartialPivot_decrypted.jpg',mtx) 52 | cv2.imwrite(r'output_PartialPivot.jpg',mtx) 53 | 54 | -------------------------------------------------------------------------------- /SSIM.py: -------------------------------------------------------------------------------- 1 | from skimage.measure import compare_ssim as ssim 2 | import cv2 3 | x='PartialPivot' #select the algorithm being tested 4 | im1=cv2.imread(r'test.jpg',0) 5 | im2=cv2.imread(r'output_'+x+'_decrypted.jpg',0) 6 | im3=cv2.imread(r'output_'+x+'.jpg',0) 7 | im4=cv2.imread(r'output_'+x+'.jpg',0) 8 | print(ssim(im1,im2)) 9 | print(ssim(im1,im3)) 10 | -------------------------------------------------------------------------------- /test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/susheem-k-zz/Image-Encryption-using-Genetic-Algorithms-Matrix-Manipulation-and-Chaos-Mapping/ef736bf4abf404bf3ba8b11616f41928b3d0618e/test.jpg --------------------------------------------------------------------------------