【问题标题】:Trying to encrypt video frames with RSA; getting garbage instead of original data after decrypting尝试使用 RSA 加密视频帧;解密后得到垃圾而不是原始数据
【发布时间】:2019-09-03 09:59:45
【问题描述】:

我正在编写一个脚本来在 python 中使用 RSA 算法来加密和解密视频。现在我已经从视频中提取帧并单独加密每个图像,然后组合图像以创建视频。然后我再次读取加密视频的帧,当我应用解密密钥时,我没有取回原始图像。但是,当我在制作视频的任何图像上应用相同的键时,我会取回原始图像。假设我们有 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和视频处理的新手。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • ...是否有任何特殊原因您将视频分割成帧以单独加密每个帧,将其拼接在一起,然后尝试分别解密每个帧?为什么不直接加密视频本身? (我不是视频专家,但我很确定很多格式都是有损的。您可能无法从输入的帧中获取相同的数据。)
  • 其实我不知道如何在不提取帧的情况下加密整个视频
  • 为什么不能直接对视频应用现有加密?单个框架与整个框架有何不同?

标签: python opencv encryption video video-capture


【解决方案1】:

视频帧are subject to lossy compression。因此,您不能以图像为幌子向编解码器提供一些二进制数据,对其进行编码并期望在播放结果视频时得到完全相同的二进制数据。

最好的办法是按照Encryption of video files?How can I Encrypt Video in Real Time? 对整个视频文件进行加密。需要解密才能播放;这显然是what OSX's "content protection" does, encrypting and decrypting data transparently

一篇(付费专区)IEEE 文章Video Encryption Based on OpenCV - IEEE Conference Publication 说他们将Arnold Transform 应用于图像数据。它是transposition cipher,因此,can be broken。它的主要优势似乎在于它使内容在常规​​播放中难以理解,并且它保留了对视频编解码器至关重要的图像特征(照明、帧差异),并且不需要精确的密文进行解密,因此它不会被损坏而无法修复。有损压缩。

【讨论】:

    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2013-04-22
    • 1970-01-01
    • 2017-06-22
    相关资源
    最近更新 更多