Skip to content

Commit

Permalink
Обновлён раздел про схему Блома
Browse files Browse the repository at this point in the history
  • Loading branch information
vlsergey committed Nov 18, 2019
1 parent 8d1a484 commit fc7dc20
Show file tree
Hide file tree
Showing 4 changed files with 200 additions and 11 deletions.
28 changes: 17 additions & 11 deletions protocols/bloms_scheme.tex
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
\subsection{Схема Блома}\label{section-bloms-scheme}\index{схема!Блома|(}
\selectlanguage{russian}

Рассмотрим распределение ключей по \emph{схеме Блома} (\langen{Rolf Blom},~\cite{Blom:1984, Blom:1985}), в которой каждые два из общего числа $N$ пользователей могут создать общий секретный ключ, причём секретные ключи каждой пары различны. Данная схема используется в протоколе HDCP\index{протокол!HDCP} (\langen{High-bandwidth Digital Content Protection}) для предотвращения копирования высококачественного видеосигнала.
Схема Блома (\langen{Rolf Blom},~\cite{Blom:1984, Blom:1985}) используется в протоколе HDCP\index{протокол!HDCP} (\langen{High-bandwidth Digital Content Protection}) для предотвращения копирования высококачественного видеосигнала. Предполагается, что некоторый доверенный центр распределит ключи таким образом, что легальные производители видеокарт, мониторов высокого разрешения и других компонент будут передавать видеоконтент по защищённому каналу, а <<пиратские>> устройства не смогут эти данные перехватить, и, например, записать на другой носитель.

На этапе инициализации доверенный центр выбирает симметричную матрицу $D_{m,m}$ над конечным полем $\GF p$. Для присоединения к сети распространения ключей, новый участник либо самостоятельно, либо с помощью доверенного центра выбирает новый открытый ключ (идентификатор) $I$, представляющий собой вектор длины $m$ над $\GF p$. Доверенный центр вычисляет для нового участника закрытый ключ $K$:
На этапе инициализации доверенный центр выбирает симметричную матрицу $D_{m,m}$ над конечным полем $\GF p$. Для присоединения к сети распространения ключей, новый участник либо самостоятельно, либо с помощью доверенного центра выбирает новый открытый ключ (идентификатор) $I_i$, представляющий собой вектор длины $m$ над $\GF p$. Доверенный центр вычисляет для нового участника закрытый ключ $K_i$:
\begin{equation}
K = D_{m,m} I.
K_i = D_{m,m} I_i.
\label{eq:blom_center_matrix}
\end{equation}

Симметричность матрицы $D_{m,m}$ доверенного центра позволяет любым двум участникам сети создать общий сеансовый ключ. Пусть Алиса и Боб -- легальные пользователи сети, то есть они обладают открытыми ключами $I_A$ и $I_B$ соответственно, а их закрытые ключи $K_A$ и $K_B$ были вычислены одним и тем же доверенным центром по формуле~\ref{eq:blom_center_matrix}. Тогда протокол выработки общего секретного ключа выглядит следующим образом.
Симметричность матрицы $D_{m,m}$ доверенного центра позволяет любым двум участникам сети создать общий сеансовый ключ. Пусть Алиса и Боб -- легальные пользователи сети, то есть они обладают открытыми ключами $I_A$ и $I_B$ соответственно, а их закрытые ключи $K_A$ и $K_B$ были вычислены одним и тем же доверенным центром по формуле~\ref{eq:blom_center_matrix}. Тогда протокол выработки общего секретного ключа выглядит следующим образом (рис.~\ref{fig:key_distribution-bloms-scheme}).

\begin{enumerate}
\item Алиса отправляет Бобу свой открытый ключ $I_A$.
\item Боб отправляет Алисе свой открытый ключ $I_B$.
\item Алиса вычисляет значение $s_{AB} = K^T_A I_B = I^T_A D_{m,m} I_B$.
\item Боб вычисляет значение $s_{BA} = K^T_B I_A = I^T_B D_{m,m} I_A$.
\end{enumerate}
\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{pic/key_distribution-bloms-scheme}
\caption{Взаимодействие участников в схеме Блома\label{fig:key_distribution-bloms-scheme}}
\end{figure}

Из симметричности матрицы $D_{m,m}$ следует, что значения $s_{AB}$ и $s_{BA}$ совпадут, они же и будут являться общим секретным ключом для Алисы и Боба. Этот секретный ключ будет свой для каждой пары легальных пользователей сети.
\begin{protocol}
\item[(1)] $Alice \to \left\{ I_A \right\} \to Bob$
\item[(2)] Боб вычисляет $K_{BA} = K^T_B I_A = I^T_B D_{m,m} I_A$.
\item[{}] $Bob \to \left\{ I_B \right\} \to Alice$
\item[(3)] Алиса вычисляет $K_{AB} = K^T_A I_B = I^T_A D_{m,m} I_B$.
\end{protocol}

Из симметричности матрицы $D_{m,m}$ следует, что значения $K_{AB}$ и $K_{BA}$ совпадут, они же и будут являться общим секретным ключом для Алисы и Боба. Этот секретный ключ будет свой для каждой пары легальных пользователей сети.

Присоединение новых участников к схеме строго контролируется доверенным центром, что позволяет защитить сеть от нелегальных пользователей. Надёжность данной схемы основывается на невозможности восстановить исходную матрицу. Однако для восстановления матрицы доверенного центра размера $m \times m$ необходимо и достаточно всего $m$ пар линейно независимых открытых и закрытых ключей. В 2010-м году компания Intel, которая является <<доверенным центром>> для пользователей системы защиты HDCP, подтвердила, что криптоаналитикам удалось найти секретную матрицу (точнее, аналогичную ей), используемую для генерации ключей в упомянутой системе предотвращения копирования высококачественного видеосигнала.

Expand Down
183 changes: 183 additions & 0 deletions protocols/pic/key_distribution-bloms-scheme.graphml
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--Created by yFiles for HTML 2.2.0.2-->
<graphml xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml.html/2.0/ygraphml.xsd " xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:demostyle="http://www.yworks.com/yFilesHTML/demos/FlatDemoStyle/1.0" xmlns:bpmn="http://www.yworks.com/xml/yfiles-for-html/bpmn/2.0" xmlns:demotablestyle="http://www.yworks.com/yFilesHTML/demos/FlatDemoTableStyle/1.0" xmlns:uml="http://www.yworks.com/yFilesHTML/demos/UMLDemoStyle/1.0" xmlns:compat="http://www.yworks.com/xml/yfiles-compat-arrows/1.0" xmlns:GraphvizNodeStyle="http://www.yworks.com/yFilesHTML/graphviz-node-style/1.0" xmlns:VuejsNodeStyle="http://www.yworks.com/demos/yfiles-vuejs-node-style/1.0" xmlns:y="http://www.yworks.com/xml/yfiles-common/3.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/3.0" xmlns:yjs="http://www.yworks.com/xml/yfiles-for-html/2.0/xaml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<key id="d0" for="node" attr.type="boolean" attr.name="Expanded" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/folding/Expanded">
<default>true</default>
</key>
<key id="d1" for="node" attr.type="string" attr.name="url"/>
<key id="d2" for="node" attr.type="string" attr.name="description"/>
<key id="d3" for="node" attr.name="NodeLabels" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/NodeLabels"/>
<key id="d4" for="node" attr.name="NodeGeometry" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/NodeGeometry"/>
<key id="d5" for="all" attr.name="UserTags" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/UserTags"/>
<key id="d6" for="node" attr.name="NodeStyle" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/NodeStyle"/>
<key id="d7" for="node" attr.name="NodeViewState" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/folding/1.1/NodeViewState"/>
<key id="d8" for="edge" attr.type="string" attr.name="url"/>
<key id="d9" for="edge" attr.type="string" attr.name="description"/>
<key id="d10" for="edge" attr.name="EdgeLabels" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/EdgeLabels"/>
<key id="d11" for="edge" attr.name="EdgeGeometry" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/EdgeGeometry"/>
<key id="d12" for="edge" attr.name="EdgeStyle" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/EdgeStyle"/>
<key id="d13" for="edge" attr.name="EdgeViewState" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/folding/1.1/EdgeViewState"/>
<key id="d14" for="port" attr.name="PortLabels" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/PortLabels"/>
<key id="d15" for="port" attr.name="PortLocationParameter" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/PortLocationParameter">
<default>
<x:Static Member="y:FreeNodePortLocationModel.NodeCenterAnchored"/>
</default>
</key>
<key id="d16" for="port" attr.name="PortStyle" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/PortStyle">
<default>
<x:Static Member="y:VoidPortStyle.Instance"/>
</default>
</key>
<key id="d17" for="port" attr.name="PortViewState" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/folding/1.1/PortViewState"/>
<key id="d18" attr.name="SharedData" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/SharedData"/>
<data key="d18">
<y:SharedData>
<yjs:SolidColorFill x:Key="1" color="Black"/>
<yjs:SolidColorFill x:Key="2" color="Black"/>
<yjs:Arrow x:Key="3" type="NONE"/>
</y:SharedData>
</data>
<graph id="G" edgedefault="directed">
<data key="d5">
<y:Json>{"version":"2.0.0","theme":{"name":"light","version":"1.0.0"}}</y:Json>
</data>
<node id="n0">
<data key="d3">
<x:List>
<y:Label>
<y:Label.Text>A</y:Label.Text>
<y:Label.LayoutParameter>
<y:RatioAnchoredLabelModelParameter LayoutOffset="10.998046875,7.6494140625"/>
</y:Label.LayoutParameter>
<y:Label.Style>
<yjs:DefaultLabelStyle horizontalTextAlignment="CENTER" autoFlip="false" textFill="#FF000000">
<yjs:DefaultLabelStyle.font>
<yjs:Font fontSize="12" fontFamily="'Dialog'"/>
</yjs:DefaultLabelStyle.font>
</yjs:DefaultLabelStyle>
</y:Label.Style>
</y:Label>
</x:List>
</data>
<data key="d4">
<y:RectD X="510" Y="385" Width="30" Height="30"/>
</data>
<data key="d6">
<yjs:ShapeNodeStyle fill="{x:Null}" shape="ELLIPSE">
<yjs:ShapeNodeStyle.stroke>
<yjs:Stroke fill="#FF000000" miterLimit="1.45"/>
</yjs:ShapeNodeStyle.stroke>
</yjs:ShapeNodeStyle>
</data>
<port name="p0">
<data key="d15">
<y:FreeNodePortLocationModelParameter Ratio="0.5101705386666671,0.21321396906666715"/>
</data>
</port>
<port name="p1">
<data key="d15">
<y:FreeNodePortLocationModelParameter Ratio="0.5012226901333331,0.7679805781333339"/>
</data>
</port>
</node>
<node id="n1">
<data key="d3">
<x:List>
<y:Label>
<y:Label.Text>B</y:Label.Text>
<y:Label.LayoutParameter>
<y:RatioAnchoredLabelModelParameter LayoutOffset="10.998046875,7.6494140625"/>
</y:Label.LayoutParameter>
<y:Label.Style>
<yjs:DefaultLabelStyle horizontalTextAlignment="CENTER" autoFlip="false" textFill="#FF000000">
<yjs:DefaultLabelStyle.font>
<yjs:Font fontSize="12" fontFamily="'Dialog'"/>
</yjs:DefaultLabelStyle.font>
</yjs:DefaultLabelStyle>
</y:Label.Style>
</y:Label>
</x:List>
</data>
<data key="d4">
<y:RectD X="610" Y="385" Width="30" Height="30"/>
</data>
<data key="d6">
<yjs:ShapeNodeStyle fill="{x:Null}" shape="ELLIPSE">
<yjs:ShapeNodeStyle.stroke>
<yjs:Stroke fill="#FF000000" miterLimit="1.45"/>
</yjs:ShapeNodeStyle.stroke>
</yjs:ShapeNodeStyle>
</data>
<port name="p0">
<data key="d15">
<y:FreeNodePortLocationModelParameter Ratio="0.5054368597333336,0.21321396906666715"/>
</data>
</port>
<port name="p1">
<data key="d15">
<y:FreeNodePortLocationModelParameter Ratio="0.48754116266666564,0.7679805781333339"/>
</data>
</port>
</node>
<edge id="e0" source="n0" target="n1" sourceport="p0" targetport="p0">
<data key="d9"><![CDATA[]]></data>
<data key="d10">
<x:List>
<y:Label>
<y:Label.Text>1.</y:Label.Text>
<y:Label.LayoutParameter>
<y:FreeEdgeLabelModelParameter Ratio="0.4976555608933971" Distance="-7.0009999999999195"/>
</y:Label.LayoutParameter>
<y:Label.Style>
<yjs:DefaultLabelStyle horizontalTextAlignment="CENTER" textFill="#FF000000">
<yjs:DefaultLabelStyle.font>
<yjs:Font fontSize="12" fontFamily="'Dialog'"/>
</yjs:DefaultLabelStyle.font>
</yjs:DefaultLabelStyle>
</y:Label.Style>
</y:Label>
</x:List>
</data>
<data key="d12">
<yjs:PolylineEdgeStyle sourceArrow="{y:GraphMLReference 3}">
<yjs:PolylineEdgeStyle.stroke>
<yjs:Stroke fill="{y:GraphMLReference 1}" miterLimit="1.45"/>
</yjs:PolylineEdgeStyle.stroke>
<yjs:PolylineEdgeStyle.targetArrow>
<yjs:Arrow stroke="#FF000000" fill="{y:GraphMLReference 1}"/>
</yjs:PolylineEdgeStyle.targetArrow>
</yjs:PolylineEdgeStyle>
</data>
</edge>
<edge id="e1" source="n1" target="n0" sourceport="p1" targetport="p1">
<data key="d9"><![CDATA[]]></data>
<data key="d10">
<x:List>
<y:Label>
<y:Label.Text>2.</y:Label.Text>
<y:Label.LayoutParameter>
<y:FreeEdgeLabelModelParameter Ratio="0.49830763166484143" Distance="-7.0009999999999195"/>
</y:Label.LayoutParameter>
<y:Label.Style>
<yjs:DefaultLabelStyle horizontalTextAlignment="CENTER" textFill="#FF000000">
<yjs:DefaultLabelStyle.font>
<yjs:Font fontSize="12" fontFamily="'Dialog'"/>
</yjs:DefaultLabelStyle.font>
</yjs:DefaultLabelStyle>
</y:Label.Style>
</y:Label>
</x:List>
</data>
<data key="d12">
<yjs:PolylineEdgeStyle sourceArrow="{y:GraphMLReference 3}">
<yjs:PolylineEdgeStyle.stroke>
<yjs:Stroke fill="{y:GraphMLReference 2}" miterLimit="1.45"/>
</yjs:PolylineEdgeStyle.stroke>
<yjs:PolylineEdgeStyle.targetArrow>
<yjs:Arrow stroke="#FF000000" fill="{y:GraphMLReference 2}"/>
</yjs:PolylineEdgeStyle.targetArrow>
</yjs:PolylineEdgeStyle>
</data>
</edge>
</graph>
</graphml>
Binary file added protocols/pic/key_distribution-bloms-scheme.pdf
Binary file not shown.
Binary file added protocols/pic/key_distribution-bloms-scheme.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit fc7dc20

Please sign in to comment.