PlayReady 内容加密
本主题概述了用于保护 PlayReady 生态系统中内容的加密算法。
注意
有关加密术语和定义 ,请参阅术语表 。
加密基础知识
对称密钥加密 是最简单的加密类型。 使用对称密钥加密,同一密钥用于加密内容并将其解密。 对称密钥算法通常较小且快速。 通常,大部分加密任务都由某种形式的对称密钥加密处理。
相比之下,公钥加密使用已发布的公钥来加密,以及用于解密的其他机密、私钥。 因此,如果用户“A”为用户提供“B”公钥,B 可以加密 A 的内容,而无需任何其他信息。 无论内容是如何传输的,只有 A 才能读取它。 内容拦截器缺少私钥 (密钥) 且无法解密消息。 由于公钥是公开提供的,因此任何人都可以对 A 进行加密,但只能对 A 进行解密。 公钥加密需要计算复杂的算法。
椭圆曲线加密 (ECC) 是用于加密和解密内容的公钥加密算法。 它是描述椭圆曲线的计算复杂函数。 此算法的组件作为公钥共享。 用于解密的其他组件构成了私钥。
一键消息身份验证代码 (OMAC) 是由块密码构造的消息身份验证代码。 有两种 OMAC 算法:OMAC1 和 OMAC2。
证书 用于确保不受信任的实体的真实性。 证书的发送方使用其私钥 (设备标识符) 对名称进行签名。 然后,证书的接收方使用发件人公钥验证证书的签名,以确保发件人的身份。 由于发送方是私钥的唯一所有者,因此在给定公钥的情况下很难创建私钥,除非使用私钥进行签名,否则证书将无法正确验证;在这种情况下,假定数据源正确且经过认证的通信是安全的。
PlayReady 加密算法
对称算法
支持以下 AES 加密模式:
AES 128 CTR 模式 - PlayReady 系统可以保护文件和流,其中样本完全加密,或者只有样本模式加密,在 CTR 模式下。 其中包括通用加密模式“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 周期或系统资源。