1. DRM介绍:

DRM,英文全称Digital Rights Management, 可以翻译为:内容数字版权加密保护技术。

DRM技术的工作原理是,首先建立数字节目授权中心。编码压缩后的数字节目内容,可以利用密钥(Key)进行加密保护(lock),加密的数字节目头部存放着KeyID和节目授权中心的URL。用户在点播时,根据节目头部的KeyID和URL信息,就可以通过数字节目授权中心的验证授权后送出相关的密钥解密(unlock),节目方可播放。

需要保护的节目被加密,即使被用户下载保存,没有得到数字节目授权中心的验证授权也无法播放,从而严密地保护了节目的版权。

2. 安装SDK:

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,0

将文本文档更改为.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-内容数据版权加密保护技术学习(上):视频文件打包实现相关推荐

  1. [破解] DRM-内容数据版权加密保护技术学习(中):License预发放实现

    在上一篇文章里实现了对媒体文体的DRM加密,现在一起来实现License的预发放. 所谓预发放就是在播放媒体文件之前先获取到License,License获取成功后,可直接在电脑上进行媒体文件的播放. ...

  2. DRM-内容数据版权加密保护技术学习(上):视频文件打包实现(转)

    1. DRM介绍: DRM,英文全称Digital Rights Management, 可以翻译为:内容数字版权加密保护技术. DRM技术的工作原理是,首先建立数字节目授权中心.编码压缩后的数字节目 ...

  3. 软件加密保护技术简介

    加密技术 软件加密保护技术简介 在这里并不是要系统的讨论软件加密保护技术,只是简单介绍一些和破解相关的软件保护方式,目的是让大家搞清楚哪些是解密的对象.有一点是要首先明确的,并不是所有的受限制软件都可 ...

  4. linux如何锁定文件夹,如何在没有加密的情况下保护Linux / Unix上的文件夹? | MOS86...

    如果您不需要或想要加密计算机上的文件,但希望停止随意窥探,那么在Linux / Unix上密码保护文件夹的最佳方法是什么?今天 今天的问题 照片由Nathan Meijer(Flickr)提供. 问题 ...

  5. Java 将数据写入磁盘并读取磁盘上的文件

    package test; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; i ...

  6. web内容如何保护:如何有效地保护 HTML5 格式的视频内容?

    文章资料还没有整理完,现在还不通顺,但是可以做笔记看 HTML是用于创建web页面和web应用程序的公开标准的标记语言.HTML文件基本上是纯文本文件,这意味着软件应用程序和普通人可以轻松地创建.读取 ...

  7. 泰课在线选择DRM-X 4.0加密保护其高品质IT课程

    泰课在线以移动应用开发.游戏开发课程为核心,主要面向立志投身互联网技术开发的朋友,或者以自我提升或就业为目标的求学人员.通过优质的视频课程.直播教学.网络组队项目实战.网络班级管理.线上教学社区等教学 ...

  8. 如何使用HTTPS加密保护网站?

    加密 Web 内容并不是什么新鲜事:自发布通过SSL/TLS协议来加密 Web 内容的规范以来,已经过去了近 20 年.然而,近年来,运行安全的HTTPS加密 Web 服务器已经从一种选择变成了一种安 ...

  9. CPI学院通过DRM-X 4.0加密保护其在线课程(Zoom会议直播和录制的MP4课程)

    CPI学院是一家来自西班牙马德里的工程类技术培训学院.CPI团队由多学科的工程师组成,课程学科包括:航空航天工程.海事工程.土木和国土工程.采矿工程.能源工程.材料工程和工业工程等.CPI为学员提供理 ...

最新文章

  1. 乾坤 微前端_微前端架构初探以及我的前端技术盘点
  2. 里程碑:BCH网络出现首例Schnorr Multisig交易
  3. Selenium3自动化测试——5. 鼠标悬停操作
  4. python文字教程-Python 爬虫零基础教程(3):输出一个网页上的文字
  5. 算法提高课-搜索-多源BFS-AcWing 173. 矩阵距离:bfs、多源bfs
  6. _cdecl、_stdcall 、_fastcall、_thiscall 函数调用方式与区别
  7. Kotlin学习笔记23 协程part3 lambda表达式深入 挂起函数 全局协程
  8. [转]解决2003不支持FLV的方法
  9. 面试了一个 35+ 岁的大佬,一言难尽......
  10. 李宏毅机器学习笔记——Transformer
  11. 百度搜索移动端流量词热度统计方法
  12. html5脑图_使用HTML5技术绘制思维导图
  13. RestTemplate的用法
  14. 由 excel 转换为 markdown,及收获
  15. 书香云集Pc版书籍导出
  16. BookKeeper设计介绍及其在Hadoop2.0 Namenode HA方案中的使用分析
  17. 专利申请需要注意什么
  18. geotools 的书籍
  19. FPGA:程序的固化和下载(Vivado为例)
  20. win10 安装 Ganache

热门文章

  1. 对企业网站建设的若干建议
  2. 安卓端功能强大的Gif工具箱 | 超好用的Gif图片编辑软件
  3. 6.3_精灵对象的行为
  4. JS秒表倒计时器 (转)
  5. python生成的exe文件打不开
  6. LNK1104: cannot open file MSVCRTD.lib
  7. Python中的单引号和双引号是否存在区别
  8. unity 射线 碰撞 连线烘焙
  9. 笔记本连不上网,搜不到WiFi。更新无线网卡后出现网卡错误代码56的解决办法
  10. 如何让一句话木马绕过waf的检测 ?