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,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獲取。
謝謝,希望我的文章對大家有幫助!
文章源代碼: