RSA шифрование изображений в Python - PullRequest
0 голосов
/ 19 июня 2019

У меня есть код на 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"

у меня естьразделить код, чтобы сервер-клиент зашифровал один, а другой расшифровал изображение. Конечно, сначала отправив открытый ключ

...