Поделиться через


Режимы шифрования содержимого PlayReady

В этом разделе представлен обзор режимов шифрования содержимого в системах PlayReady. Общие сведения о шифровании контента PlayReady и шифровании содержимого см. в разделе "Шифрование содержимого PlayReady". См. глоссарий для терминов и определений шифрования.

PlayReady версии 1.0 ввела режим шифрования содержимого AES-128 CTR, в дополнение к специфическому для Microsoft режиму шифрования COCKTAIL, который использовался ранее в WMDRM (Windows Media Digital Rights Management). В режиме шифрования содержимого AES-128 CTR используются ключи AES с длиной 128 бит, используемых в файлах содержимого в режиме счетчика (CTR).

Начиная с версии 4.0 системы PlayReady поддерживают 128-разрядные ключи AES в режиме счетчика (CTR) и режиме цепочки блоков шифров (CBC).

Это изменение гарантирует, что службы с помощью PlayReady могут полностью воспользоваться уникальным форматом потока и файла на всех устройствах. Кроме того, корпорация Майкрософт поддерживает стандарт CMAF (общий формат приложения мультимедиа), как определено в iso/IEC ПИИ 23000-19.

Общие режимы шифрования

Стандарт ISO/IEC 23001-7 определяет четыре режима общего шифрования.

Общие режимы шифрования

Клиенты PlayReady, начиная с версии 4.0, поддерживают ключи AES CBC, что позволяет поддерживать общий режим шифрования cbcs, а также ключи AES CTR для общего режима шифрования cenc. До версии 4.0 AES CTR был режимом, который в основном поддерживается клиентами PlayReady, что позволяет поддерживать режим общего шифрования cenc. Обратите внимание, что общие режимы шифрования "cens" и "cbc1" разрешены и технически доступны в экосистеме PlayReady, но не поддерживаются.

Поддержка схемы шифрования 'cbcs' AES-CBC

Все клиенты, созданные на основе PlayReady PK версии 4.0, могут поддерживать ключи CBC. Поддержка для клиентов является необязательной, но, если она предоставляется, сигнализируется серверам лицензий через дополнительное свойство в протоколе приобретения лицензий.

Версия КОКТЕЙЛЬ ценз cbcs
Клиент PlayReady 1.0 поддерживаемый поддерживаемый Не поддерживается
PlayReady Client 2.0 поддерживаемый поддерживаемый Не поддерживается
Клиент PlayReady 2.5 поддерживаемый поддерживаемый Не поддерживается
Клиент PlayReady 3.0 Не поддерживается поддерживаемый Не поддерживается
Клиент PlayReady 3.3 Не поддерживается поддерживаемый Не поддерживается
Клиент PlayReady 4.0 Не поддерживается поддерживаемый поддерживаемый

Замечание

  • Все устройства Xbox One, обновленные до версии 1709 или более поздней, поддерживают 'cbcs'.
  • Все серверы лицензий PlayReady, начиная с версии 4.0, поддерживают выдачу лицензий с помощью ключей CBC.

Сигнализация ALGID в заголовке PlayReady

Заголовок PlayReady — это XML-документ, который обычно включается в заголовок файла содержимого или потока. В нем описываются атрибуты PlayReady, необходимые для расшифровки этого содержимого клиентом. Заголовок PlayReady имеет собственную спецификацию и версионирование. Для получения дополнительной информации см. спецификацию заголовка PlayReady.

Версия Заголовок PlayReady 4.3 Заголовок PlayReady 4.2 Заголовок PlayReady 4.1 Заголовок PlayReady 4.0
Клиент PlayReady 4.0
(см. примечание 4)
Клиент PlayReady 3.3
(см. примечание 3)
Клиент PlayReady 3.0
(см. примечание 3)
Клиент PlayReady 2.5
(см. примечание 2)
PlayReady Client 2.0
(см. примечание 2)
Клиент PlayReady 1.0
(см. примечание 1)

Замечание

  • (4) Xbox One версии 1709 или более поздней — клиенты PlayReady 4.X.
  • (3) Windows 10 для всех версий и Xbox One версии 1703 или ниже — клиенты PlayReady 3.X. Новейшие устройства, отличные от Windows (например, смарт-телевизоры), выпущенные после 2017 года, являются клиентами PlayReady 3.X.
  • (2) Silverlight и Windows 8, 8.1 — клиенты PlayReady 2.X. Большинство устройств, отличных от Windows (например, смарт-телевизоров), выпущенных в период с 2011 по 2017 год, являются клиентами PlayReady 2.X.
  • (1) Большинство устройств, отличных от Windows (например, смарт-телевизоров), выпущенных в период с 2008 по 2011 год, являются клиентами PlayReady 1.X.

Ниже приведен пример заголовка PlayReady версии 4.2.

<WRMHEADER
          version="4.2.0.0"
          xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
  <DATA>
    <PROTECTINFO>
      <KIDS>
        <KID ALGID="AESCTR" CHECKSUM="xNvWVxoWk04=" VALUE="0IbHou/5s0yzM80yOkKEpQ=="></KID>
        <KID ALGID="AESCTR" CHECKSUM="GnKaQIRacPU=" VALUE="/qgG2xbs4k2SKCxx6bhWqw=="></KID>
       </KIDS>
    </PROTECTINFO>
    <LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
    <DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
    <DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
  </DATA>
</WRMHEADER>

ALGID (идентификатор алгоритма) является свойством элемента KID и задает алгоритм шифрования, используемый для шифрования содержимого. Начиная с PlayReady Header версии 4.2, ALGID является обязательным и должен иметь значение AESCTR или COCKTAIL. Однако, начиная с версии 4.3, значение "AESCBC" также может быть установлено для ALGID. Следующий пример демонстрирует заголовок PlayReady версии 4.3, в котором параметры ALGID установлены на значение "AESCBC".

<WRMHEADER
          version="4.3.0.0"
          xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
  <DATA>
    <PROTECTINFO>
      <KIDS>
        <KID VALUE="PV1LM/VEVk+kEOB8qqcWDg==" ALGID="AESCBC"/>
        <KID VALUE="tuhDoKUN7EyxDPtMRNmhyA==" ALGID="AESCBC"/>
      </KIDS>
    </PROTECTINFO>
    <LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
    <DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
    <DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
  </DATA>
</WRMHEADER>

На следующем рисунке показан поток содержимого, где запрос лицензии основан на заголовке PlayReady и указан ALGID.

Поток содержимого с заданным ALGID

Отсутствующие ALGIDs

Начиная с заголовка PlayReady версии 4.3, ALGID может отсутствовать. В следующем примере показан заголовок PlayReady версии 4.3 с отсутствующими значениями ALGID.

<WRMHEADER
          version="4.3.0.0"
          xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader">
  <DATA>
    <PROTECTINFO>
      <KIDS>
        <KID VALUE="PV1LM/VEVk+kEOB8qqcWDg=="/>
      </KIDS>
    </PROTECTINFO>
    <LA_URL>http://rm.contoso.com/rightsmanager.asmx</LA_URL>
    <DS_ID>AH+03juKbUGbHl1V/QIwRA==</DS_ID>
    <DECRYPTORSETUP>ONDEMAND</DECRYPTORSETUP>
  </DATA>
</WRMHEADER>

На следующем рисунке показан поток содержимого, в котором запрос лицензии использует модуль CDMi, а ALGID отсутствует.

Поток данных, в котором отсутствует ALGID

Замечание

У каждого заголовка PlayReady может быть:

  • Только один тип шифрования. Например, если ALGID="AESCTR", все ключи, связанные с заголовком, используются в режиме CTR. Когда ALGID="AESCBC", все ключи для этого заголовка используются в режиме CBC.
  • Если ALGID отсутствует, все ключи, относящиеся к этому заголовку, используются в режиме счётчика или режиме цепочки блоков шифрования, но его значение не вставляется в заголовок.
  • Создание запроса на получение лицензии с заголовком PlayReady версии 4.3 на сервер лицензий с версией ниже 4.0 вызовет исключение.
  • Ответ на лицензию может включать одну или несколько лицензий, где каждая лицензия содержит один ключ и любое количество политик.

Почему значение ALGID отсутствует

Корпорация Майкрософт рекомендует, чтобы шифраторы всегда включали то же значение ALGID в заголовок PlayReady, который они включали при обработке содержимого.

В стандартном сценарии шифратор шифрует содержимое и создает заголовок PlayReady в содержимом. Шифратор знает, какой режим AES он использовал для шифрования; таким образом, он содержит эти сведения в свойстве ALGID заголовка PlayReady. Клиенты инициируют запросы лицензий на основе заголовков PlayReady, проанализированных из реального содержимого, поэтому значение ALGID присутствует и допустимо.

В некоторых сценариях клиент инициирует запрос лицензии на основе простого значения KID (128-разрядного GUID). В этом случае значение ALGID в заголовке PlayReady, вставленное в запрос на лицензию, будет отсутствует (также известное как не указано). Один из примеров заключается в том, что клиент выполняет запрос на лицензию с помощью API EME HTML5.

Как клиент обрабатывает отсутствующий ALGID

Если клиент инициирует запрос лицензии на основе входящего заголовка PlayReady, то значение ALGID в запросе лицензии будет отражать значение, найденное в заголовке, так как задача приобретения лицензии включает копию заголовка PlayReady. В данном случае:

  • Для всех заголовков PlayReady версии 4.2 или ниже требуется значение ALGID и должно быть допустимым.
  • Для заголовков PlayReady версии 4.3 или позже значение ALGID может присутствовать и быть допустимым, или отсутствовать.

Как пакет SDK сервера обрабатывает отсутствующий ALGID

Все лицензии, предоставляемые с помощью ответа на лицензию, должны содержать допустимое значение ALGID.

Если ALGID не указан в запросе на входящие лицензии, сервер лицензий должен получить эти сведения из серверной части службы и поместить правильное значение в ответ на лицензию.

Вектора Инициализации (ВИ)

В PlayReady версии 3.3 и более ранних версиях поддерживаются только 64-разрядные IV (8-байтовые IV) в режиме CTR. Начиная с PlayReady версии 4.0, в режимах CTR и CBC поддерживаются 64-разрядные и 128-разрядные IVs (8-байтовые и 16-байтовые IV).

Примеры.

  • Теперь поддерживаются потоки, совместимые с HLS, которые часто используют 128-разрядные IV в режиме CBC.
  • Теперь поддерживаются некоторые потоки, соответствующие стандартам HbbTV, использующие 128-битные начальные значения (IV) в режиме CTR.

Ограничения

  • Заголовок PlayReady должен использовать только одно значение ALGID для всех элементов KID. Другими словами, все ключи, используемые для шифрования различных треков и качеств ресурса, должны быть AES CTR или AES CBC. Если ALGID отсутствует в любом элементе KID, он должен быть отсутствует во всех элементах KID.
  • До версии PlayReady 4.4, создание лицензии с ключом CBC при получении клиентского сертификата для Windows и SL2000 вызывает исключение. Это связано с тем, что клиенты Windows поддерживают CBC только в единицах SL3000. Можно предоставить лицензию с ключом CBC клиенту SL2000, если этот клиент использует PlayReady версии 4.0 или выше и заявляет поддержку режима CBC.
  • Создание лицензии с ключом CBC, если входящий сертификат клиента — это устройство, использующее версию комплекта портов до версии 4.0, вызовет исключение.
  • Создание лицензии с ключом CBC, если входящий запрос на лицензию не указывает на поддержку AES CBC, вызовет исключение.

Это важно

Службы не должны шифровать один фрагмент содержимого в режиме CTR и в режиме CBC с помощью того же {KID, Ck}.

  • По функциональным причинам клиент, приобретающий лицензию для {KID, Ck, AESCTR} и для {KID, Ck, AESCBC}, может не функционировать.
  • По соображениям надежности злоумышленник, имеющий доступ к одному содержимому, зашифрованному с одним и тем же ключом в режимах CBC и CTR, может более легко расшифровать содержимое без авторизации.