Данные изображения повреждены при кодировании-декодировании с использованием алгоритма RSA - PullRequest
1 голос
/ 22 июня 2019

Моя задача - реализовать алгоритм шифрования изображений по алгоритму RSA.Я генерирую параметры RSA, затем загружаю изображение из файла, шифрую, дешифрую и затем сохраняю новое изображение в файл.Проблема в том, что при отображении изображения кажется, что нижняя часть изображения повреждена и плохо расшифрована.У вас есть идеи, что не так в моем коде?

from PIL import Image
import io
from Crypto.Util.number import long_to_bytes
from Crypto.Util.number import inverse
from Crypto.Util.number import getPrime
from Crypto.Util.number import GCD
from Crypto.Util.number import bytes_to_long
from Crypto.Util.number import getRandomRange


blockSize = 255

def loadImage():
    with io.BytesIO() as recivedPicture:
        with Image.open("IMG2.jpg") as picture:
            picture.save(recivedPicture, 'JPEG')
        returnVal = recivedPicture.getvalue()
    return returnVal


def saveImage(decryptedImg):
    picture = Image.open(io.BytesIO(decryptedImg))
    picture.save("rsa_photo_copy.jpg", picture.format)
    print("Hacking procedure finished success!\n")


def proceedRSA(n, e, d):
    eByteArray = bytearray()
    dByteArray = bytearray()
    print("Hacking procedure begin\n")
    for i in range(0, len(loadImage()), blockSize):
        blockData = loadImage()[i:i + blockSize]
        eByteArray.extend(encryptFunction(blockData, e, n))
        dByteArray.extend(decryptFunction(encryptFunction(blockData, e, n), d, n))
    saveImage(dByteArray)

def encryptFunction(data, e, n):
    m = bytes_to_long(data)
    c = pow(m, e, n)
    value = long_to_bytes(c)
    return value


def decryptFunction(data, d, n):
    c = bytes_to_long(data)
    m = pow(c, d, n)
    value = long_to_bytes(m)
    return value


def main():
    # odnalezienie 1024 bitowej liczby pierwszej q
    q = getPrime(1024)
    # odnalezienie 1024 bitowej liczby pierwszej p
    p = getPrime(1024)
    # powtórzenie losowania p tak długo jak p jest różne od q
    while q==p:
        p = getPrime(1024)
        pass
    # znalezienie n = p*q
    n = p * q
    # znalezienie f = (p-1) * (q-1)
    f = (p - 1) * (q - 1)
    # znalezienie e
    e = getRandomRange(1, f - 1)
    while GCD(e, f) != 1:
        e = getRandomRange(1, f - 1)
    # znalezienie d
    d = inverse(e, f)
    # wywołanie algorytmu
    proceedRSA(n, e, d)


if __name__ == "__main__":
    main()

1 Ответ

0 голосов
/ 24 июня 2019

Обычный RSA / учебник RSA совершенно небезопасен.

Однако на практике вы должны знать, что вы действительно не можете зашифровать 256 байтов случайных данных для ключа длиной 2048 бит, так как значение представляет собой большое целое число без знака.может быть больше, чем модуль.Однако результат часто требует 256 байтов.Таким образом, размер блока открытого текста должен быть меньше размера зашифрованного текста.

Этого можно было бы избежать, если бы можно было разделить отдельные биты, поскольку только старший бит должен быть 0 чаще, чем 1. Но да, неттакая удача, биты больше атомные, чем атомы.

Вы можете узнать это, отладив свой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...