[破解] DRM-内容数据版权加密保护技术学习(上):视频文件打包实现
1. DRM介绍:
DRM,英文全称Digital Rights Management, 可以翻译为:内容数字版权加密保护技术。
DRM技术的工作原理是,首先建立数字节目授权中心。编码压缩后的数字节目内容,可以利用密钥(Key)进行加密保护(lock),加密的数字节目头部存放着KeyID和节目授权中心的URL。用户在点播时,根据节目头部的KeyID和URL信息,就可以通过数字节目授权中心的验证授权后送出相关的密钥解密(unlock),节目方可播放。
需要保护的节目被加密,即使被用户下载保存,没有得到数字节目授权中心的验证授权也无法播放,从而严密地保护了节目的版权。
![]()
2. 安装SDK:
3. 去微软的网站注册以保证获得许可授权:
网站地址:http://licenseserver.windowsmedia.com/registration.asp?v2=true
填写邮箱、公司、国家等信息进行提交。
稍候你的邮箱会收到一封邮件,点击邮件里的地址,输入你的邮箱和邮件里收到的token。
3. 现在就要开始打包程序的编写了,在以下的例子中用WinForm程序实现
DRM打包需要公钥、私钥还有种子,我们只要新建一个文本文件,然后将如下代码复制进去
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell") dim keysobjs
dim privkey
dim pubkey
dim seed Set keysobj= CreateObject("wmrmobjs.WMRMKeys")
keysobj.GenerateSigningKeys privkey, pubkey
seed = keysobj.GenerateSeed()
Dim cmd ' Write the private key to privkey.txt.
cmd = "command.com /C echo " + privkey + " > privkey.txt"
WSHShell.Run cmd,0 'Write the public key to pubkey.txt.
cmd = "command.com /C echo " + pubkey + " > pubkey.txt"
WSHShell.Run cmd,0 ' Write the license key seed to seed.txt.
cmd = "command.com /C echo " + seed + " > seed.txt"
WSHShell.Run cmd,
将文本文档更改为.vbs文件,运行该文件,会在本目录下形成PRIVKEY.TXT、PUBKEY.TXT、SEED.TXT三个文件,其中PRIVKEY.TXT中是私钥、PUBKEY.TXT中是公钥、SEED.TXT中是种子。
新建WinForm工程,添加对WMRMObjs.dll的引用,如果SDK安装成功的话,在SDK安装目录的Bin目录下可以找到。
将生成的公钥、私钥和种子在配置文件内进行配置
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!-- 私钥 -->
<add key="PrivateKey" value="!qYNXRckn69VzoSNmGJ9umMfgSw=" />
<!-- 公钥 -->
<add key="PublicKey" value="R76wg3M2nq3yDRWWI2hFESO*zRXNo2qcNdeVocH7cjwBSN!WnOi8Gg==" />
<!-- 种子 -->
<add key="Seed" value="eQ50hSVGytB3IEr0Tr6UAUMEVlJfcD9XObjE8UhP" />
<!-- License获取页面URL -->
<add key="LicenseAcpURL" value="http://localhost:8080/GetLicense.aspx" />
</appSettings>
</configuration>
WinForm界面,这里简单画一个界面,界面上包括一个用来显示选择文件的本文框,选择文件按钮,开始打包按钮和一个OpenFileDialog控件,在OpenFileDialog控件的Filter属性内加上“支持DRM加密文件|*.WMV;*.WMA;*.ASF;*.WMS”
![]()
VideoDRMPackageForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace VideoDRMPackageApplication
{
public partial class VideoDRMPackageForm : Form
{
public VideoDRMPackageForm()
{
InitializeComponent();
} /// <summary>
/// 选择文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSelectFile_Click(object sender, EventArgs e)
{
openVideoFile.ShowDialog();
} /// <summary>
/// 开始打包
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnBeginPackage_Click(object sender, EventArgs e)
{
//检查是否选择了文件
if (String.IsNullOrEmpty(txtFilePath.Text))
{
MessageBox.Show("请选择要进行打包的文件!", "提示");
return;
} //打包Key
string keyID = "DRMTest";
//消息
string msg = ""; if (Package.PackageVideoFile(keyID, txtFilePath.Text, out msg))
msg = "打包成功!" + msg;
else
msg = "打包失败!" + msg; MessageBox.Show(msg, "提示");
} /// <summary>
/// 文件选择完成
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void openVideoFile_FileOk(object sender, CancelEventArgs e)
{
txtFilePath.Text = openVideoFile.FileName;
}
}
}
Package.cs
using System;
using System.IO;
using System.Configuration;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using WMRMOBJSLib;
using System.Runtime;
using System.Runtime.InteropServices; namespace VideoDRMPackageApplication
{
public class Package
{
/// <summary>
/// 打包视频文件
/// </summary>
/// <param name="keyID">用于打包的Key</param>
/// <param name="sourcePath">打包文件地址</param>
/// <param name="msg">输出消息</param>
/// <returns>返回打包结果:true-成功,false-失败</returns>
public static bool PackageVideoFile(string keyID, string sourcePath, out string msg)
{
//创建WMRMHeaderClass对象
WMRMOBJSLib.WMRMHeaderClass myWMRMHeaderClass = new WMRMOBJSLib.WMRMHeaderClass();
//创建WMRMProtectClass对象
WMRMOBJSLib.WMRMProtectClass myWMRMProtectClass = new WMRMOBJSLib.WMRMProtectClass(); //生成DRM加密后文件路径,在源文件名后加上_DRM,和源文件放在同一目录
string drmFilePath = Path.GetDirectoryName(sourcePath) + Path.GetFileNameWithoutExtension(sourcePath) + "_DRM" + Path.GetExtension(sourcePath); try
{
//从配置文件内获得私钥、公钥、种子和后发放License获取URL地址
string privateKey = ConfigurationManager.AppSettings["PrivateKey"];
string publicKey = ConfigurationManager.AppSettings["PublicKey"];
string seed = ConfigurationManager.AppSettings["Seed"];
string licenseAcpUrl = ConfigurationManager.AppSettings["LicenseAcpUrl"]; //创建用于DRM加密的Key
string drmKey = KeyGenerate(keyID, seed); //给myWMRMHeaderClass对象赋值
myWMRMHeaderClass.KeyID = keyID;
myWMRMHeaderClass.IndividualizedVersion = "2.2";
myWMRMHeaderClass.ContentID = keyID;
myWMRMHeaderClass.LicenseAcqURL = licenseAcpUrl;
myWMRMHeaderClass.SetCheckSum(drmKey);
myWMRMHeaderClass.Sign(privateKey); myWMRMProtectClass.Header = myWMRMHeaderClass.Header;
myWMRMProtectClass.InputFile = sourcePath;
myWMRMProtectClass.Key = drmKey;
myWMRMProtectClass.V1LicenseAcqURL = licenseAcpUrl;
myWMRMProtectClass.V1KeyID = keyID;
myWMRMProtectClass.ProtectFile(drmFilePath);
}
catch (Exception e)
{
msg = "错误信息:" + e.ToString();
return false;
}
finally
{
try
{
//释放对象
if (myWMRMHeaderClass != null)
{
Marshal.ReleaseComObject(myWMRMHeaderClass);
myWMRMHeaderClass = null;
}
if (myWMRMProtectClass != null)
{
Marshal.ReleaseComObject(myWMRMProtectClass);
myWMRMProtectClass = null;
}
}
catch (Exception ex)
{
}
}
msg = "打包后文件:" + drmFilePath;
return true;
} /// <summary>
/// 创建用于DRM加密的Key
/// </summary>
/// <param name="keyID">用于打包的Key</param>
/// <param name="seed"></param>
/// <returns></returns>
private static string KeyGenerate(string keyID, string seed)
{
//创建WMRMKeysClass对象
WMRMKeysClass myWMRMKeysClass = new WMRMKeysClass();
myWMRMKeysClass.KeyID = keyID.Trim();
myWMRMKeysClass.Seed = seed.Trim();
return myWMRMKeysClass.GenerateKey();
}
}
}
运行该程序,选择要进行打包的文件,点开始打包,过一会就打包完成了,现在去播放打包后的视频文件,嘿嘿,是不是开始获取License了啊,不过现在是获取不成功的,下一篇文章将会介绍License获取。
谢谢,希望我的文章对大家有帮助!
文章源代码:
[破解] DRM-内容数据版权加密保护技术学习(上):视频文件打包实现的更多相关文章
- [破解] DRM-内容数据版权加密保护技术学习(中):License预发放实现
在上一篇文章里实现了对媒体文体的DRM加密,现在一起来实现License的预发放. 所谓预发放就是在播放媒体文件之前先获取到License,License获取成功后,可直接在电脑上进行媒体文件的播放. ...
- 数据採集之Web端上传文件到Hadoop HDFS
前言 近期在公司接到一个任务.是关于数据採集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志採集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好近期都有在这方面 ...
- Java 将数据写入磁盘并读取磁盘上的文件
package test; import java.io.BufferedReader;import java.io.FileReader;import java.io.FileWriter;impo ...
- 基于隐私保护技术的DNS通信协议介绍
本文提出了一种基于用户数据报协议的DNS传输中用户隐私保护的加密方法:DNSDEA.该方法采用PKI加密体系与DNS协议相融合,不仅解决了域名隐私保护问题,而且与传统DNS体系相兼容,保持了DNS系统 ...
- js 获取上传文件的字节数及内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- .NET 产品版权保护方案 (.NET源码加密保护) (转载)
说 明:你希望自己用.net辛辛苦苦做出来的软件被人轻易破解吗?你希望自己花了大量人力物力用.net开发出来的产品被竞争对手轻易获取核心代码吗?这是 一篇比较详尽地介绍如何保护自己的.net源代码的文 ...
- [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护)
[C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护) 标签: .net加密产品c#dll工具 2011-03-24 21:06 27009人阅读 评论(13) 收藏 举报 分类: C ...
- Unity3D内容加密保护
仅管资源 (Assets) 在传输时可使用加密进行保护,但在数据流入客户手中后.其内容就有可能被获取.比如,有工具可记录驱动程序级别上的 3D 数据,同意用户提取传送至 GPU 的模型和纹理. 因此, ...
- 网络安全——数据的加密与签名,RSA介绍
一. 密码概述 发送者对明文进行加密然后生成密文,接受者再对密文解密得到明文的过程. 现在使用的所有加密算法都是公开的!但是密钥肯定不是公开的. 1 散列(哈希)函数 通常有MD5.SHA1.SHA2 ...
随机推荐
- java中File类的相关学习
File类 1.关于系统路径分割符. 在Windows中,使用反斜杠“\”作为路径分割符,比如“c:\test”,但是java中反斜杠表示转义,所以需要用“C:\\test”在程序中来表示路径.还可以 ...
- 第10讲- UI线程阻塞及其优化
第10讲UI线程阻塞及其优化 .UI 阻塞demo (首先在activity_main.xml中放置两个button,分别命名为button1,button2) //首先设置一个button1用来进行 ...
- Spark常用函数讲解之Action操作
摘要: RDD:弹性分布式数据集,是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作,一个RDD代表一个分区里的数据集RDD有两种操作算子: Trans ...
- AFNetwork 作用和使用方法具体解释
转自:http://www.maxiaoguo.com/clothes/269.html AFNetworking是一个轻量级的iOS网络通信类库.它建立在NSURLConnection和NSOper ...
- 跟我学系列教程——《13天让你学会Redis》火热报名中
学习目标 每天2小时,13天让你学会Redis. 本课程针对Redis新手,甚至连Redis是什么都没有听说过的同学.课程会具体介绍Redis是什么以及为什么要使用Redis,结合项目实践旨在让学生从 ...
- Spring (二) OOP V.S AOP
介绍 这是两种不同的编程思想就好比初中数学中学习的横纵坐标,一种是横向的一种是纵向,OOP是代表X轴而AOP代表Y轴,如下图: 数学几乎可以解释生活中所有的现象,无论是物体运动还是静止,也可以通过数学 ...
- [core java学习笔记][第十章部署应用程序]
第10章 部署应用程序和applet jar文件 Java Web Start 10.1 jar文件 jar文件就是一个压缩了类,图像和声音的ZIP压缩文件 创建一个新的JAR文件应该使用的常见命令格 ...
- CGFloat和float
CGFloat :在mac上自适应,在64位的系统,会变宽,32位会变窄,手机没变化float:没有变化
- [转载]启用 VIM 中的 Python 自动补全及提示功能
转载: http://zhongwei-leg.iteye.com/blog/941474 周围的同事不喜欢使用 VIM 写 Python 代码的原因之一就是,VIM 不能像 Visual Studi ...
- (原+转)C++中的lambda表达式
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5073376.html 参考网址: http://www.cnblogs.com/zhuyp1015/a ...