Хобрук: Ваш путь к мастерству в программировании

Попытка зашифровать видеокадры с помощью RSA; получение мусора вместо исходных данных после расшифровки

Я пишу сценарий для шифрования и дешифрования видео с использованием алгоритма RSA в Python. Теперь я извлек кадры из видео и зашифрую каждое изображение по отдельности, а затем комбинирую изображения для создания видео. Затем я снова читаю кадры зашифрованного видео, и когда я применяю ключ дешифрования, я не получаю обратно исходное изображение. Но когда я применяю тот же ключ к любому изображению, с помощью которого создается видео, я возвращаю исходное изображение. допустим, у нас есть image1, который зашифрован и будет использоваться для создания зашифрованного видео, когда я применяю ключ к этому изображению, я возвращаю исходное изображение. теперь у меня есть image2, которое читается из зашифрованного видео, и если ключи применяются, то он дает более зашифрованное изображение. Вот код:


import cv2
import numpy
import os
import imageio 
import time
from tkinter.filedialog import askopenfilename
from tkinter.ttk import *
from tkinter import *
from tkinter import filedialog
from tqdm import tqdm 
from tkinter import messagebox
import subprocess


def load_image_decrypt(folder):

    videofile = 'envid.avi'

    try:
        if not os.path.exists('Dedata'):
            os.makedirs('Dedata')
    except OSError:
        messagebox.showinfo('Error Occured', 'Error: Creating directory of decrypted data')

    vid_to_image(videofile)

    for filename1 in tqdm(os.listdir(folder)):
        imgV = imageio.imread(os.path.join(folder, filename1), format='PNG-FI')
        if imgV is not None:
            RGBdecryption(imgV, filename1)
        else:
            break

    vidname = 'devid.avi'
    image_to_vid(dedata2, vidname)

    messagebox.showinfo('Finish!', 'Decryption Done succesfully!')


def RGBdecryption(img, filename):

    img1 = img
    img = img.astype(numpy.uint16)
    img1= img1.tolist()

    for i1 in tqdm(range(len(img1))):
        for j1 in (range(len(img1[i1]))):
            for k1 in (range(len(img1[i1][j1]))):
                x1 = img1[i1][j1][k1] 
                x1 = pow(x1,16971,25777)
                img1[i1][j1][k1] = x1

    img1 = numpy.array(img1).astype(numpy.uint16)
    name = './Dedata/'+str(filename)
    imageio.imwrite(name, img1, format='PNG-FI')

def vid_to_image(filename):
    # Playing video from file:
    cap = cv2.VideoCapture(filename)

    try:
        if not os.path.exists('data'):
            os.makedirs('data')
        messagebox.showinfo('Info!', 'Data directory is created where the frames are stored')

    except OSError:
            print ('Error: Creating directory of data')

    currentFrame = 0
    while(True):
        # Capture frame-by-frame
        ret, frame = cap.read()
        if not ret: 
            break

        # Saves image of the current frame in jpg file
        name = './data/frame' + str(currentFrame) + '.png'
        print ('Creating...' + name)
        imageio.imwrite(name, frame,format='PNG-FI')

        # To stop duplicate images
        currentFrame += 1

    # When everything done, release the capture
    cap.release()
    cv2.destroyAllWindows()


def image_to_vid(folder, vidname):  #the code which is creating a video out of images stored in the folder

    image_folder = folder
    video_name = vidname
    sort_image = []
    images = [img for img in os.listdir(image_folder) if img.endswith(".png")]
    print(images)
    print('\n\n')

    for i in range(0,1000):
        for j in range(len(images)):
            name = 'frame' + str(i) + '.png' 
            if ((str(images[j])) == str(name)):
                sort_image.append(images[j])

    print(sort_image)
    frame = cv2.imread(os.path.join(image_folder, sort_image[0]))
    height, width, layers = frame.shape

    video = cv2.VideoWriter(video_name, 0, 29, (width,height)) #29 is the fs of the original video and I don't know what the 0 is for

    for image in sort_image:
        video.write(cv2.imread(os.path.join(image_folder, image)))

    cv2.destroyAllWindows()
    video.release() 


data = './data'
load_image_decrypt(data)

Я не знаю, где я ошибаюсь. Я новичок в opencv и обработке видео. Любая помощь будет оценена по достоинству. Спасибо.


  • ... есть ли какая-то особая причина, по которой вы нарезаете видео на кадры, чтобы зашифровать каждый по отдельности, сшить его вместе, а затем пытаетесь расшифровать каждый кадр отдельно? Почему бы просто не зашифровать само видео? (Я не специалист в области видео, но я почти уверен, что многие форматы работают с потерями. Вы можете не получить те же данные для кадра, которые вы вставили.) 12.04.2019
  • На самом деле я не знаю, как зашифровать видео целиком, не извлекая из него кадры 12.04.2019
  • Почему вы не можете напрямую применить существующее шифрование к видео? Чем отдельные рамки отличаются от целого? 12.04.2019

Ответы:


1

Видеокадры подвергаются сжатию с потерями. Таким образом, вы не можете передать кодеку некоторые двоичные данные под видом изображений, кодировать их и ожидать, что при воспроизведении результирующего видео вы получите точно такие же двоичные данные.

Лучше всего зашифровать видеофайл в целом в соответствии с шифрованием видеофайлов? или Как я могу зашифровать видео в реальном времени?. Его нужно будет расшифровать, чтобы можно было играть; очевидно, это то, что делает «защита содержимого» OSX, шифрование и дешифрование данные прозрачно.

В (платной) статье IEEE о шифровании видео на основе OpenCV - публикация конференции IEEE говорится, что они применили Преобразование Арнольда в данные изображения. Это шифр транспозиции и как таковой может быть нарушен. Его главная сила, скорее, заключается в том, что он делает контент неразборчивым при обычном воспроизведении, и он сохраняет характеристики изображения, критичные для видеокодеков (освещение, различия кадров), и не требует точного зашифрованного текста для дешифрования, поэтому он не повреждается без возможности восстановления из-за сжатие с потерями.

12.04.2019
Новые материалы

Создание успешной организации по науке о данных
"Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

Технологии и проблемы будущей работы
Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

Игорь Минар из Google приедет на #ReactiveConf2017
Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...