С точки зрения функциональности, система HDCP, как это было задумано, должна решать три главных задачи: (1) она шифрует контент так, чтобы его нельзя было брать от кабеля; (2) она позволяет каждому оконечному устройству удостовериться, что другая оконечная точка связи — это тоже HDCP-лицензированное устройство; и (3) она позволяет «отзывать» уникальные ключи прежде легитимных, но впоследствии скомпрометированных пиратами устройств, создавая «черные списки» заблокированных ключей.
С точки зрения собственно защиты информации, принципиально важным этапом в работе системы HDCP является процедура начального «рукопожатия», в ходе которой формируется общий секретный ключ, который затем используется для шифрования коммуникаций между двумя устройствами. В то же самое время данная процедура позволяет каждому устройству удостовериться, что другое устройство является лицензированным для обработки HD-контента.
Всякий раз, когда речь заходит о криптотехнологии, исходная позиция для понимания конструкции системы — это разобраться с работой секретных ключей: сколько именно таких ключей предусмотрено, кому конкретно они известны и как именно они применяются.
В HDCP каждое устройство имеет уникальную пару ключей: один открытый ключ, который не является тайной; и один секретный ключ, который положено знать исключительно только этому устройству. Кроме того, система в целом имеет один-единственный мастер-ключ, который предполагается известным исключительно Центральному органу, управляющему всей системой HDCP. А также имеется особый алгоритм генерации ключей (который по давней традиции удобно для краткости называть Keygen), используемый Центром для формирования секретных ключей устройств. Этот генератор ключей на основе секретного мастер-ключа Центра и открытого ключа устройства неким хитрым способом формирует уникальный секретный ключ, который соответствует исключительно данному открытому ключу. Поскольку генератор ключа использует секретный мастер-ключ, заниматься созданием ключевых пар может только центральный орган власти.
Каждое HDCP-лицензированное устройство (например, Blu-Ray-плеер или HD-телевизор) имеет зашитые в него открытый ключ и соответствующий ему секретный ключ. Чтобы получить эти ключи для своих устройств, их изготовителям нужно содействие центрального органа власти HDCP, потому что лишь там занимаются генерацией и раздачей легитимных ключевых пар.
Теперь предположим, что два устройства, которые для простоты называют А и Б, собираются выполнить процедуру «рукопожатия». Для этого А посылает свой открытый ключ в Б, а Б, соответственно, свой открытый ключ в А. После чего каждая из сторон по заранее известному правилу комбинирует свой собственный секретный ключ с открытым ключом партнера, чтобы в результате получить общий секретный ключ для шифрования сеанса связи. Этот сеансовый ключ предполагается секретным — то есть известным исключительно сторонам А и Б — потому что для порождения общего ключа обязательно требуется знать либо секретный ключ А, либо секретный ключ Б.
Надо подчеркнуть, что для получения этого общего секрета А и Б фактически выполняют разные вычисления. Ведь А комбинирует свой секретный ключ с открытым ключом Б, а Б, наоборот, комбинирует свой секрет с открытой информацией от А. Если «случайно повстречавшиеся» А и Б производят существенно разные вычисления, то возникает естественный вопрос: каким образом в итоге у них получится один и тот же результат? Чтобы ответить на этот вопрос с исчерпывающей полнотой, понадобилось бы без нужды углубляться в дебри алгебраических уравнений. Здесь же вполне достаточно ограничится кратким ответом: потому что таким образом устроены математические свойства алгоритма Keygen.
Принципиально важно, что от этой особенности критически зависит безопасность всей криптосистемы: если ваше устройство имеет секретный ключ, изготовленный в процессе работы Keygen, тогда «рукопожатие HDCP» для вас сработает — в том смысле, что в итоге вычислений это устройство получит тот же самый общий ключ, что и вторая легитимная сторона на другом конце кабеля. Но если же вы пытались применить какой-нибудь левый или случайный «секретный ключ», который сгенерировали сами, тогда рукопожатие не сработает: вы придете к совершенно иному сеансовому ключу, нежели у второй стороны, поэтому устройства не смогут связаться друг с другом.