PlayReady 内容加密

本主题概述了用于保护 PlayReady 生态系统中内容的加密算法。

注释

请参阅加密术语和定义的 术语表

加密基础知识

对称密钥加密 是最简单的加密类型。 使用对称密钥加密,同一密钥用于加密内容并进行解密。 对称密钥算法通常较小且快速。 通常,大部分加密任务都由某种形式的对称密钥加密处理。

相比之下,公钥加密使用已发布的公钥进行加密,以及用于解密的其他机密私钥。 因此,如果用户“A”向用户“B”提供公钥,B 可以加密 A 的内容而无需任何其他信息。 无论内容是如何传输的,只有 A 才能读取它。 内容拦截器缺少私钥(密钥),无法解密消息。 由于公钥是公开提供的,因此任何人都可以对 A 进行加密,但只能对 A 进行解密。 公钥加密需要计算复杂的算法。

椭圆曲线加密 (ECC)是用于加密和解密内容的公钥加密算法。 它是描述椭圆曲线的计算复杂函数。 此算法的组件作为公钥共享。 用于解密的其他组件构成私钥。

单键消息身份验证代码 (OMAC)是从块密码构造的消息身份验证代码。 有两种 OMAC 算法:OMAC1 和 OMAC2。

证书 用于确保不受信任的实体的真实性。 证书的发送方使用其私钥对其名称(设备标识符)进行签名。 然后,证书的接收方使用发件人的公钥验证证书的签名,以确保发件人的身份。 由于发送方是私钥的唯一所有者,因此很难创建给定公钥的私钥,除非使用私钥进行签名,否则证书将无法正确验证;在这种情况下,假定数据源正确且经过认证的通信是安全的。

PlayReady 加密算法

对称算法

支持以下 AES 加密模式:

  • AES 128 CTR 模式 — 在 CTR 操作模式下,PlayReady 系统可以保护样本完全加密或仅样本的某种模式加密的文件和流。 其中包括通用加密模式“cenc”(通用加密方案)和“cens”(使用未加密/加密字节模式的通用加密方案),这些模式在 ISO/IEC 23001-7 中定义。

  • AES 128 CBC 模式 - 从版本 4.0 开始的 PlayReady 系统可以在 CBC 模式下使用 AES 128 内容密钥完全或部分加密的文件和流进行保护。 其中包括 ISO/IEC 23001-7 中定义的通用加密模式“cbc1”和“cbcs”,以及使用 CBC 模式下 AES 128 内容密钥加密的任何其他格式。

注释

具有版本 1.X、2.X 和 3.X 的 PlayReady 系统只能保护在 CTR 模式下加密的文件(通用加密模式“cenc”)。 不支持“cens”。 具有版本 4.0 及更高版本的 PlayReady 系统可以保护以 CTR 模式(通用加密模式“cenc”)和 CBC 模式(通用加密模式“cbcs”)加密的文件。 不支持其他模式“cens”和“cbc1”。

ECC 算法

Microsoft PlayReady 系统使用 ECC(椭圆曲线加密)来加密内容密钥和签名协议消息。

  • ECC ElGamal 算法 - 用于加密的内容密钥。
  • ECDSA (椭圆曲线数字签名算法) - 用于在 PlayReady 协议中适用的情况下对消息进行签名。
  • NIST — Microsoft PlayReady 系统在适用的情况下使用标准 NIST 算法进行 ECC 加密,并且当前使用的是 P-256 椭圆曲线。

签名算法

对于签名许可证、暂时性密钥或数据,PlayReady 系统使用 AES OMAC1,这相当于 CMAC(基于密码的消息身份验证代码),并在 2005 年 5 月成为 NIST 建议。 密钥是随机生成的,但数据使用 SHA256 进行哈希处理,然后使用 ECC256 对哈希进行签名。

运行时和性能注意事项

触发内容播放时,PlayReady 客户端必须执行一些步骤,然后才能开始初始播放。 这包括查找许可证、绑定或解释许可证、解密内容密钥,最后准备解密内容。 PlayReady 客户端堆栈需要时间才能将许可证绑定到内容,在开始内容解密和呈现之前需要完成此操作。 这意味着绑定许可证的时间会影响开始播放时的第一帧的时间或曲目之间的间隙。 客户端开发人员和应用程序开发人员可能需要考虑优化代码,以解决运行时和性能问题,减少达到首帧的时间,并实现无缝播放。

受保护的容器使用对称密钥加密来加密大部分内容。 但是,公钥加密在许可证中使用。 这是因为许可证包含内容的对称密钥,服务器使用客户端的公钥来加密内容的对称密钥。

当需要解密内容时,客户端的私钥用于从许可证解密对称密钥。 只有许可证绑定到的客户端才能提取对称密钥。

私钥解密在计算上比对称解密更密集;因此,解释许可证的计算密集型。 正确处理许可证后,对称密钥将解密,并且内容可以使用小型且快速的算法进行解密。

对于资源受限的应用程序或设备,启动需要大量的时间和资源。 但是,一旦完成,资源就会释放,解密可能会高效进行,并且需要很少的 CPU 周期或系统资源。