以前用 C++ 做过的 DRM 项目,现抽取出其中核心的代码, 演示一下如何借助 DRM 对流媒体文件进行保护。
虽然微软的 DRM 技术被破解了, 但那是以用户通过认证并下载证书为前提的。由是观之, 运用 DRM 对流媒体
文件施以保护仍有一定意义,这毕竟比什么都不做要强嘛!

/* drm.h*/
#ifndef __DRM_H__
#define __DRM_H__

#include <string>
#import "wmrmobjs.dll"

class DRMObject {
public:
  DRMObject(char* inFile, char* outFile, char* licenseURL, char* corpName);
  bool Encrypt();

public:
  std::string key;
  std::string seed;
  std::string keyID;
  std::string contentID;
  std::string publicKey;
  std::string privateKey;

private:
  std::string _inFile;
  std::string _outFile;
  std::string _corpName;
  std::string _licenseURL;
};

#endif

// drm.cxx
#include "drm.h"
#include <comdef.h>
#include <iostream>

DRMObject::DRMObject(char* inFile, char* outFile, char* licenseURL, char* corpName)
{
  _inFile = inFile;
  _outFile = outFile;
  _corpName = corpName;
  _licenseURL = licenseURL;
}

bool DRMObject::Encrypt()
{
  try {
    HRESULT hr;

// Initialize the COM library on the current thread
    hr = CoInitialize(NULL);
    if (FAILED(hr))
      _com_issue_error(hr);

WMRMOBJSLib::IWMRMKeysPtr    keysObj("Wmrmobjs.WMRMKeys");  
    WMRMOBJSLib::IWMRMHeaderPtr  headerObj("Wmrmobjs.WMRMHeader");
    WMRMOBJSLib::IWMRMProtectPtr protectObj("Wmrmobjs.WMRMProtect");

// Generate keyID,seed,contentID
    keyID = keysObj->GenerateKeyID();
    seed  = keysObj->GenerateSeed();
    contentID = keysObj->GenerateKeyID();

// Generate key
    keysObj->KeyID = keyID.c_str();
    keysObj->Seed  = seed.c_str();
    key = keysObj->GenerateKey();

// Set protected header
    headerObj->KeyID = keyID.c_str();
    headerObj->ContentID = contentID.c_str();
    headerObj->LicenseAcqURL = _licenseURL.c_str();
    headerObj->Attribute["Copyright"] = _corpName.c_str();

// verify the key
    headerObj->SetCheckSum(key.c_str());

//Generate public and private key 
    _variant_t privKey, pubKey;
    VariantInit(&privKey);
    VariantInit(&pubKey);
    keysObj->GenerateSigningKeys(&privKey, &pubKey);    
    headerObj->IndividualizedVersion = "2.2";

// Save private and public kyes
    privateKey = (_bstr_t)privKey;
    publicKey  = (_bstr_t)pubKey;

// Sign key
    headerObj->Sign((_bstr_t)privKey);

// Set protect object
    _bstr_t header;
    header = headerObj->Header;
    protectObj->Header = header;
    protectObj->Key = key.c_str();
    protectObj->V1KeyID = keyID.c_str();

// start encrypt
    protectObj->InputFile = _inFile.c_str();  
    protectObj->ProtectFile(_outFile.c_str());
  }
  catch (const _com_error& e) {
    std::cerr << "COM Exception: "
       << e.ErrorMessage()
       << std::endl;
    if (e.ErrorInfo())
      std::cerr << (char*)e.ErrorInfo()
  << std::endl;
    return false;
  }

CoUninitialize();
  return true;
}

// drm_test.cxx
#include "drm.h"
#include <iostream>
using namespace std;

int main() {
  DRMObject* drmObj = new DRMObject("d:\\test.wma",
        "d:\\test2.wma",
        "http://localhost/test.asp",
        "test corp");
  if (drmObj->Encrypt()) {
    cout << "KeyID: "
           << drmObj->keyID
           << endl;

cout << "Seed: "
            << drmObj->seed
            << endl;

cout << "Key: "
           << drmObj->key
           << endl;

cout << "ContentID: "
            << drmObj->contentID
            << endl;

cout << "Public Key: "
           << drmObj->publicKey
           << endl;

cout << "Private Key: "
           << drmObj->privateKey
           << endl;
  }
  delete drmObj;
}

转 http://www.cppblog.com/jb8164/archive/2008/02/27/43338.html

转载于:https://www.cnblogs.com/papam/archive/2009/08/26/1554715.html

运用 DRM 对流媒体文件加密相关推荐

  1. EZ-Lock易锁 DRM 文件加密保护系统

    本产品应用范围:    使用目的在于防止企业内部人员,将机密文件非法复制窃取外流.举凡原始设计图纸.开发技术信息.客户往来信息等等.客户端计算机于编辑文件时,全程透明皆在加密环境下受到最严谨的保护,客 ...

  2. 猫抓m3u8,遇到该媒体已加密,请注意下载key文件

    用到工具: 带有猫抓插件浏览器; 迅雷; 安装ffmpeg; 方案: 一.下载.ts视频文件.m3u8文件.key文件; 二.TS文件合并; 具体实施: 介绍m3u8加密: 简单一点说m3u8加密技术 ...

  3. FFmpeg 与媒体文件关系

    1. 容器/文件(Container/File):即特定格式的多媒体文件,比如MP4,flv,mov等. 2. 媒体流(Stream):表示在时间轴上的一段连续的数据,比如一段声音数据.一段视频数据或 ...

  4. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  5. Java文件操作大全(包括文件加密,String加密)

    1.创建文件夹 //import java.io.*; File myFolderPath = new File(%%1); try { if (!myFolderPath.exists()) myF ...

  6. 文件下载时直接对流进行zip加密压缩

    下载文件时直接对流进行zip加密压缩 1.使用form提交表单,请求下载.do 2.使用zip4j_1.3.1.jar <span style="white-space:pre&quo ...

  7. 各种数据文件加密和数字签名服务解决方案

    各种数据文件是指非PDF格式文件和数据,因为PDF格式文件有数字签名和加密标准,所以,我们必须按照其标准实现数字签名和加密.而其他格式文件,如文本文件.图片文件.音频文件.视频文件.Office文件. ...

  8. Java 企业微信会话内容(聊天记录)存档功能实现,并获取媒体文件

    注:本文档是在Linux环境下进行测试的. 今天终于有空来聊聊企业微信"会话内容存档",虽然官方有给出开发文档,但确实是有点晦涩难懂啊,对于我这种菜鸟来说. 在网上翻阅许多教程,也 ...

  9. 局域网网络监控和透明文件加密原理、需求、模式、实例、功能、部署、方案全攻略

    关键词:局域网,网络监控,全攻略,监控软件,监控原理,网络监控软件,上网行为管理,内网管理,透明文件加密,反复制,信息安全,流量监控,网桥模式,QQ聊天记录监控,驱动,WINPCAP缺点 第一章 什么 ...

最新文章

  1. Delphi 与 DirectX 之 DelphiX(52): TDIB.DoSaturation();
  2. 在FreeBSD上安装Bugzilla
  3. linux下.rar的文件,Linux下.rar压缩文件处理 (RAR 4.11 for linux )
  4. [转载] 七龙珠第一部——第092话 孙悟空上场了
  5. (十三)react hooks
  6. Redis实战(十三)Redis的三种集群方式
  7. Ubuntu22.04(Linux Mint 21)安装使用绿联USB无线网卡CM448(rtl8821CU)的方法
  8. arcgis api for js绘制箭头图
  9. imitate wechat - 1
  10. JavaScript-162:表格隔行变色
  11. ThreadLocal原理及使用场景
  12. 如何在Windows系统上实现共享文件夹
  13. 关于风险管理,如何将思维从项目升维到项目群?
  14. Trunk支持vlan的范围
  15. [OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-上...
  16. 同步FIFO和异步FIFO的Verilog实现
  17. 随机森林计算特征重要性_随机森林中计算特征重要性的3种方法
  18. 比较两组数据的差异用什么图更直观_你真的懂如何展示数据吗?
  19. 新版标准日本语初级_第四十二课
  20. 解压oracle 失败,CentOS5.9 安装oracle 11g 遇到的各种问题

热门文章

  1. Matlab怎么计算信号的能量,学习用Matlab计算离散信号的功率和能量.PPT
  2. MySQL-排序加去重sql语句
  3. 产品分析必看!抖音App产品及竞品分析(快手)报告(最完善的商业分析、资料截止2019年5月)
  4. cdr存成html格式的文件格式,cad文件怎么转换成cdr格式
  5. luckysheet添加文本后缀(kg)、金额大写等单元格格式
  6. CentOS安装达梦数据库
  7. 计算机专业用苹果哪款笔记本,2019笔记本电脑排行榜 苹果笔记本电脑哪款好
  8. BroadcastReceiver
  9. php代码静态检查工具,代码静态检查工具汇总
  10. 常规加速乐cookie分析