У меня есть код на python, который шифрует / дешифрует изображение, оно работает, но проблема в том, что я решил разделить его на 2 программы, одну для шифрования, а другую для дешифрования. Программа дешифрования дает одно зашифрованное изображение, а не исходное изображение.
это оригинальный код
import random
import os,sys
import numpy
from PIL import Image
im = Image.open("6.bmp")
print (im.size, im.format)
row,col = im.size
pixels = im.load()
row1 = 1000003
phi = [0 for x1 in range(row1)]
occ = [0 for x1 in range(row1)]
primes = []
phi[1] = 1
#phi[2] = 1
#print (phi)
for i in range(2,1000001):
if(phi[i] == 0):
phi[i] = i-1
primes.append(i)
for j in range (2*i,1000001,i):
if(occ[j] == 0):
occ[j] = 1
phi[j] = j
phi[j] = (phi[j]*(i-1))//i
p = primes[random.randrange(1,167)]
q = primes[random.randrange(1,167)]
n = p*q
mod = n
phin1 = phi[n]
phin2 = phi[phin1]
e = primes[random.randrange(1,9000)]
mod1 = phin1
def power1(x,y,m):
ans=1
while(y>0):
if(y%2==1):
ans=(ans*x)%m
y=y//2
x=(x*x)%m
return ans
d = power1(e,phin2-1,mod1)
enc = [[0 for x in range(row)] for y in range(col)]
dec = [[0 for x in range(row)] for y in range(col)]
for i in range(col):
for j in range(row):
r,g,b = pixels[j,i]
r1 = power1(r+10,e,mod)
g1 = power1(g+10,e,mod)
b1 = power1(b+10,e,mod)
enc[i][j] = [r1,g1,b1]
print (pixels[row-1,col-1])
img = numpy.array(enc,dtype = numpy.uint8)
img1 = Image.fromarray(img,"RGB")
img1.save('encr.bmp')
for i in range(col):
for j in range(row):
r,g,b = enc[i][j]
r1 = power1(r,d,mod)-10
g1 = power1(g,d,mod)-10
b1 = power1(b,d,mod)-10
dec[i][j] = [r1,g1,b1]
img2 = numpy.array(dec,dtype = numpy.uint8)
img3 = Image.fromarray(img2,"RGB")
img3.save('decr.bmp')
и когда я разделил его на 2 части (я использовал фиксированные числа p, q, чтобы увидеть, является ли он основным или нет)
шифрованиечасть
import random
import os,sys
import numpy
from PIL import Image
im = Image.open("6.bmp")
print (im.size, im.format)
row,col = im.size
pixels = im.load()
row1 = 1000003
phi = [0 for x1 in range(row1)]
occ = [0 for x1 in range(row1)]
primes = []
phi[1] = 1
#phi[2] = 1
#print (phi)
for i in range(2,1000001):
if(phi[i] == 0):
phi[i] = i-1
primes.append(i)
for j in range (2*i,1000001,i):
if(occ[j] == 0):
occ[j] = 1
phi[j] = j
phi[j] = (phi[j]*(i-1))//i
n = 479867
mod = n
phin1 = phi[n]
phin2 = phi[phin1]
e = 24107
mod1 = phin1
def power1(x,y,m):
ans=1
while(y>0):
if(y%2==1):
ans=(ans*x)%m
y=y//2
x=(x*x)%m
return ans
d = power1(e,phin2-1,mod1)
enc = [[0 for x in range(row)] for y in range(col)]
for i in range(col):
for j in range(row):
r,g,b = pixels[j,i]
r1 = power1(r+10,e,mod)
g1 = power1(g+10,e,mod)
b1 = power1(b+10,e,mod)
enc[i][j] = [r1,g1,b1]
print (pixels[row-1,col-1])
img = numpy.array(enc,dtype = numpy.uint8)
img1 = Image.fromarray(img,"RGB")
img1.save('encr.bmp')
для дешифрования; часть
im = Image.open("encr.bmp")
print (im.size, im.format)
row,col = im.size
pixels = im.load()
row1 = 1000003
phi = [0 for x1 in range(row1)]
occ = [0 for x1 in range(row1)]
primes = []
phi[1] = 1
#phi[2] = 1
#print (phi)
for i in range(2,1000001):
#print (i)
if(phi[i] == 0):
phi[i] = i-1
#print (i)
primes.append(i)
#j = 2*i
#print i
for j in range (2*i,1000001,i):
#print("j ",j)
#print(j)
if(occ[j] == 0):
#print ("inside if2")
occ[j] = 1
phi[j] = j
#print (phi[j])
#print ((i-1)//i)
phi[j] = (phi[j]*(i-1))//i
#print(phi[j])
#j = j + i
p = 887
q = 541
print(p," ", q)
n = p*q
mod = n
phin1 = phi[n]
phin2 = phi[phin1]
e = 24107
print("e",e)
mod1 = phin1
def power1(x,y,m):
ans=1
while(y>0):
if(y%2==1):
ans=(ans*x)%m
y=y//2
x=(x*x)%m
return ans
d = power1(e,phin2-1,mod1)
enc = [[0 for x in range(row)] for y in range(col)]
dec = [[0 for x in range(row)] for y in range(col)]
for i in range(col):
for j in range(row):
r,g,b = pixels[j,i]
enc[i][j] = [r,g,b]
for i in range(col):
for j in range(row):
r,g,b = enc[i][j]
r1 = power1(r,d,mod)-10
g1 = power1(g,d,mod)-10
b1 = power1(b,d,mod)-10
dec[i][j] = [r1,g1,b1]
img2 = numpy.array(dec,dtype = numpy.uint8)
img3 = Image.fromarray(img2,"RGB")
img3.save('decr.bmp')
это дает другое изображение шифрования, я думаю, что проблема в массиве enc, если я поставлю пиксели [j, i] = r1, g1, b1 я получаю ничтожное изображение, и если я сохранил изображение encr.bmp и открыл его, то поместил его значение в массив enc2 и проверил, если enc = enc1, то получится false
im = Image.open("encr.bmp")
pixel = im.load()
for i in range(col):
for j in range(row):
r,g,b = pixel[j,i]
enc2[i][j] = [r,g,b]
for i in range(col):
for j in range(row):
if( enc[i][j]==enc2[i][j]) :
print "yesssssssssss"
у меня естьразделить код, чтобы сервер-клиент зашифровал один, а другой расшифровал изображение. Конечно, сначала отправив открытый ключ