【发布时间】:2016-01-10 22:59:54
【问题描述】:
我正在 java 中尝试此代码,因为 android 内部也使用 java。 我的问题是如何破坏(加密)一个 mp4 视频,这样即使有人复制了这些视频,它也不会播放。
我尝试通过在该文件的结束位置添加“hi”来破坏 mp4 视频,从而使文件损坏并且 vlc 播放器无法播放。我可以成功地破坏视频。 VLC 不再能够播放视频。
解密时,我们正在从该文件中读取除最后两个字符“hi”之外的内容,并将内容复制到另一个文件中,以检查我是否可以正确解密。 但问题是解密后的视频无法正常播放。VLC 没有报告任何错误,但视频显示绿色窗口,声音也没有。 解密后文件大小符合预期。
我的疑问是,当我读取 mp4 文件的数据并复制到其他文件时,缺少一些 mp4 文件属性,这就是 vlc 可能无法按应有方式播放的原因。如果是这样的话,有没有办法手动设置mp4属性到解密后的文件,让vlc可以正常播放?
我知道有很多密码类可以做到这一点,但不幸的是,加密和解密大小为 50mb 的视频文件可能太慢了。我不希望我的视频用户延迟超过 5 秒。我已经尝试过 cipher,但它很慢,有时需要超过 30 秒,这可能会激怒为视频付费的真正视频用户。
我只想要一个重量很轻的安全模型,它可以在一定程度上保护我的视频(你知道锁不是为小偷准备的)。
如果有人尝试过这样的简单算法,手动破坏 mp4 视频并在播放前动态解密,请帮助我。除此之外,我们还隐藏文件,更改文件扩展名,并将视频分割成更小的文件,这些文件将在播放前通过我们的应用程序合并。
我尝试过的代码,粘贴在这里。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.DosFileAttributes;
public class Testing {
public static void main(String[] args) {
File file = new File("e:/ascii.mp4"); //original file path
File file2 = new File("e:/satish.mp4"); //encrypted file path
File file3 = new File("e:/satish2.mp4"); //decrypted file path
try {
String s = new String(Files.readAllBytes(file.toPath()));
s = s+"hi"; //appending hi to mp4 content
FileWriter fw = new FileWriter(file2);
fw.write(s); //writing mp4 content + hi to encrypted file
fw.close();
String s2 = new String(Files.readAllBytes(file2.toPath()));
s2 = s2.substring(0, s2.length()-1-2); //reading content except last 2 characters.
FileWriter fw2 = new FileWriter(file3); //decrypted file
fw2.write(s2); //writing content to decrypted file.
fw2.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
【问题讨论】:
-
数字版权管理系统旨在有效地完成这件事。尝试研究可用于 Android 上 MP4 文件的 DRM 系统。
标签: java android video encryption