DRM-内容数据版权加密保护技术学习(上):视频文件打包实现(转)
?
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 seedSet 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;elsemsg = "打包失敗!" + 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獲取。
?
謝謝,希望我的文章對大家有幫助!
?
文章源代碼:
下載
轉載于:https://www.cnblogs.com/zgqys1980/archive/2011/11/08/2241537.html
總結
以上是生活随笔為你收集整理的DRM-内容数据版权加密保护技术学习(上):视频文件打包实现(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ?php $postsperpage=9
- 下一篇: Kooboo 全文索引研究