文章目录
本文章主要讲解关于SD卡的CPRM(Content Protection for Recordable Media)功能,关于SD卡的基础概念和其它内容请参考以下文章。
SD2.0 Specification简述
CPRM是一种防止内容未经许可而被复制传播的技术,可用于商业娱乐影音内容、版权等的保护。SD卡应用该技术,可防止卡里面的内容被非法复制传播。
1 CPRM简介
背景
CPRM技术由4C Entity, LLC开发与授权,4C Entity, LLC是一个产业组织,成员有以下几家公司,包括Intel Corporation,International Business Machines Corporation,Panasonic Corporation,Toshiba Corporation。
技术关键
- 密钥管理
- 内容加密
系统运行简化示例
- 设备生产商在每个设备上都存放有device keys ,device keys 由4C Entity, LLC提供。
- 存储介质生产商在每个介质上都存放一个Media Identifier和Media Key Block 。
- 通过设备的device keys和介质的Media Key Block 可以生成一个Media Key。
- 存储介质的内容是通过Content Key进行加解密的,而Content Key是通过Title Key和copy control information (CCI) 进行计算得到的,Title Key则是通过Media Unique Key进行加密保存的,而Media Unique Key是由Media Key和Media Identifier生成的。
要素介绍
密码功能
C2块密码算法(C2 Block Cipher Algorithm)
C2是Cryptomeria Cipher的简称,公共密码功能是基于C2 block cipher实现的,具体有2种模式:Electronic Codebook (ECB) mode 和Converted Cipher Block Chaining (C-CBC) mode。
- ECB mode
加密函数表达:C2_E(k, d),其中k是56 bits的key,d是需要加密的64 bits数据,返回的是64 bits已加密的数据。
解密函数表达:C2_D(k, d),其中k是56 bits的key,d是需要解密的64 bits数据,返回的是64 bits已解密的数据。 - C-CBC mode
加密函数表达:C2_ECBC(k, d),其中k是56 bits的key,d是需要加密的64 bits数据,返回的是64 bits已加密的数据。
解密函数表达:C2_DCBC(k, d),其中k是56 bits的key,d是需要解密的64 bits数据,返回的是64 bits已解密的数据。
C2哈希函数(Hash Function)
CPRM的哈希处理是建立在C2加密基础上的,函数表达式为:C2_H(d),其中d是需要做哈希处理的任意长度数据,返回的是64 bits数据。下图所示为整个哈希过程,其中d’代表输入的数据,其长度必须是64 bits的整倍数,不满足该条件的话,需要按照一定规则补满数据,然后分成n份64 bits的数据顺序处理。函数f定义为:f(x) = [x]lsb_56,其中x是64 bits的输入,输出56 bits的ki,首次输入的固定初始化值h0是由4C Entity, LLC提供的。
ki = f(hi-1),i>=1
hi = C2_E(ki, di’) ⊕ di’,⊕表示XOR
C2单向函数(One-way Function)
CPRM的单向函数是建立在C2加密基础上的,函数表达式为:C2_G(d1, d2),其中d1是56 bits有效值,d2是64 bits有效值,返回的是64 bits数据。具体流程如下图所示
C2_G(d1, d2) = C2_E(d1, d2) ⊕ d2.
随机数生成器
这里的随机数生成器有2种,一种是随机,一种是伪随机,二者都与C2单向函数有关。
C2随机数生成器
随机数生成流程如下图所示,其中初始化值s0是在生产时就固定,k是56 bits值,由设备随机产生或者4C Entity, LLC提供,ei跟run-time entropy(没搞懂这个是什么意思)有关,大小为1 bit
ri = C2_G(ki, si),
ki = f(k, ei),ki是k的最后1bit与ei异或的结果
si+1 = ri.
C2伪随机数生成器
随机数生成流程如下图所示,其中初始化值s0是在生产时就固定,k是56 bits值,由设备随机产生或者4C Entity, LLC提供。
ri = C2_G(k, si)
si+1 = [si + 1]lsb_64
密钥管理
CPRM包含多个密钥,它们的关系如下图所示
2 SD的CPRM应用
CPRM组成成分
内容加解密协议
上图展示SD卡上的整个加解密过程,下面针对图中展示做解释
- (1) 设备从SD卡获取MKB,然后使用设备密钥(Device Keys)和MKB计算出Media Key(Km)
- (2) 设备从SD卡中获取Media Identifier (IDmedia),然后使用Km和IDmedia计算出Media Unique Key (Kmu)
- (3) 相互之间的身份验证(AKE流程),具体参考下一节。
- (4a) AKE流程会生成一个Session Key (Ks),在写设备种先使用Kmu对Title Key (Kt) 和CCI (Copy Control Information) 进行加密,然后在总线传输前再使用Ks加密,SD卡在收到内容后,先使用Ks解密,再把内容存到保护区。
- (4b) 在读设备读取保护区数据时,SD卡先使用Ks将已加密Kt和CCI再进行一次加密后发送给读设备,读设备接收到数据后,先用Ks解密,然后再用Kmu解密,还原出原始的Kt和CCI。
- (5a) 设备在向SD总线传输用户区数据前,需要先使用Kt对数据进行加密
- (5b) 设备在收到SD发送过来的用户区数据时,需要使用Kt对数据进行解密。
总结:在AKE流程之后,在总线上传输的内容都是经过加密的。区别在于所使用的密钥。
上图展示的是设备与SD卡之间的身份验证与密钥交换过程(Authentication and Key Exchange,简称AKE),下面针对流程图里标记的步骤逐步解释
- (3a-1) 将SD命令的32 bits参数与一个32 bits的随机数拼接成64 bits数值,参数部分是MSB,随机数是LSB
- (3a-2) 使用Kmu (Media Unique Key)对上一步的64 bits数据进行C2_E加密处理,得到一个新的64 bits数据。
- (3a-3) 将上一步输出的64 bits数据(这里称为Challenge1)发送给SD卡
- (3a-4) SD卡使用Kmu (Media Unique Key)对接受到的Challenge1进行C2_D解密。
- (3b) SD卡生成一个64 bits的随机数(这里称为Challenge2)发送给设备
- (3c) 设备收到Challenge2后计算出Response2 = C2_G (Kmu, Challenge2),并且将Response2发送给SD卡。而SD卡也计算出Vresponse2 =C2_G (Kmu, Challenge2),SD判断收到的Response2与自身计算出来的Vresponse2是否相等,如果相同,则继续后续验证流程(3d),如果不同,整个身份验证流程宣布失败。
- (3d) SD卡使用Challenge1计算出Response1 = C2_G (Kmu, Challenge1),并将Response1发送给设备。而设备也计算出Vresponse1 = C2_G (Kmu, Challenge1),将Response1和Vresponse1 做比较,如果相同,则继续后续验证流程(3e),如果不同,整个身份验证流程宣布失败。
- (3e) 设备和SD卡都将Kmu按位取反得到一个~Kmu值
- (3f) 设备和SD卡利用~Kmu、Challenge1、Challenge2三者计算出Session Key (Ks) ,Ks用于对数据进行加解密。
Ks = [C2_G (~Kmu, Challenge1⊕ Challenge2)] lsb_56
总结:整个过程思路很简单,就是给对方发送数据,看对方计算出来的数据是否与自己计算的一致。
未完
参考资料:
- Content Protection for Recordable Media Specification: SD Memory Card Book Common Part, Revision 0.97,December 15, 2010
- Content Protection for Recordable Media Specification: Introduction and Common Cryptographic Elements, Revision 1.1,December 15, 2010
- SD Specifications Part 3 Security Specification Version 3.00