|
@@ -115,13 +115,17 @@
|
|
|
<section id="speck" class="slide level1">
|
|
|
<h1>Speck</h1>
|
|
|
<ul>
|
|
|
-<li>Symmentrische ARX Schiffre</li>
|
|
|
-<li>Entworfen von der NSA (Zusammen mit Simon)</li>
|
|
|
+<li>Symmentrische ARX Schiffre
|
|
|
+<ul>
|
|
|
+<li>Add/Rotate/XOR</li>
|
|
|
+</ul></li>
|
|
|
+<li>Entworfen von der NSA (Zusammen mit der Schiffre Simon)</li>
|
|
|
<li>Performant in Hard-/Software</li>
|
|
|
<li>Speck bietet mehrere mögliche Modis
|
|
|
<ul>
|
|
|
-<li>Runden, Schlüssellänge, …</li>
|
|
|
+<li>Anzahl Runden, Schlüssellänge, Blocklänge</li>
|
|
|
</ul></li>
|
|
|
+<li>Paper: <a href="https://csrc.nist.gov/csrc/media/events/lightweight-cryptography-workshop-2015/documents/papers/session1-shors-paper.pdf">Simon and Speck: Block Ciphers for the Internet of Things</a></li>
|
|
|
</ul>
|
|
|
</section>
|
|
|
<section id="speck---setups" class="slide level1">
|
|
@@ -253,50 +257,226 @@
|
|
|
<section id="speck---möglicher-angriff-1" class="slide level1">
|
|
|
<h1>Speck - Möglicher Angriff</h1>
|
|
|
<ul>
|
|
|
-<li>Der Roundkey steckt in der XOR Operation</li>
|
|
|
+<li>Der Rundenschlüssel steckt in der XOR Operation</li>
|
|
|
</ul>
|
|
|
-<p><img data-src="img/er16_annot.png" /></p>
|
|
|
+<p><img data-src="img/er16_enc_rk.png" /> <img data-src="img/er16_annot.png" /></p>
|
|
|
</section>
|
|
|
<section id="correlation-power-analysis" class="slide level1">
|
|
|
<h1>Correlation Power Analysis</h1>
|
|
|
<ul>
|
|
|
<li>Variante von Differential Power Analysis (DPA)</li>
|
|
|
<li>Nutzt Pearson Correlation Coefficient (PCC)</li>
|
|
|
-<li><strong>Bei Speck:</strong> Korrelation zwischen Power-Trace und Key</li>
|
|
|
+<li><strong>Bei Speck:</strong> Korrelation zwischen Power-Trace und Rundenschlüssel</li>
|
|
|
+<li>Vorgehen:
|
|
|
+<ul>
|
|
|
+<li>Modell erstellen</li>
|
|
|
+<li>Finden der Korrelationen im Modell</li>
|
|
|
+<li>Anwenden auf Hardware Implementierung</li>
|
|
|
+</ul></li>
|
|
|
</ul>
|
|
|
</section>
|
|
|
<section id="theoretischer-angriff" class="slide level1">
|
|
|
<h1>Theoretischer Angriff</h1>
|
|
|
</section>
|
|
|
-<section id="speck---modell" class="slide level1">
|
|
|
-<h1>Speck - Modell</h1>
|
|
|
-</section>
|
|
|
<section id="hamming-weight" class="slide level1">
|
|
|
<h1>Hamming Weight</h1>
|
|
|
+<ul>
|
|
|
+<li>Passendes Modell zum ‘bewerten’ des Stromverbrauchs</li>
|
|
|
+<li>Chip hat ein gewissen Basisverbrauch (IDLE)</li>
|
|
|
+<li>Werden Bytes im Chip verändert (<span class="math inline">0 → 1; 1 → 0</span>) wird Strom benötigt</li>
|
|
|
+<li>Verhalten kann durch die Hamming-Distanz simuliert werden</li>
|
|
|
+<li><strong>Hamming Distanz:</strong> Anzahl der Veränderter Bits:</li>
|
|
|
+</ul>
|
|
|
+<p><span class="math display"><em>H</em><em>a</em><em>m</em><em>m</em><em>i</em><em>n</em><em>g</em><em>D</em><em>i</em><em>s</em><em>t</em><em>a</em><em>n</em><em>c</em><em>e</em>(0100101,0010101) = 2</span></p>
|
|
|
+<p>Der Unterschied zweier per XOR verknüpfter Daten, wird als Hamming-Gewicht bezeichnet:</p>
|
|
|
+<p><span class="math display"><em>H</em><em>a</em><em>m</em><em>m</em><em>i</em><em>n</em><em>g</em><em>D</em><em>i</em><em>s</em><em>t</em><em>a</em><em>n</em><em>c</em><em>e</em>(0100101,0010101) = <em>H</em><em>a</em><em>m</em><em>m</em><em>i</em><em>n</em><em>g</em><em>W</em><em>e</em><em>i</em><em>g</em><em>h</em><em>t</em>(0100101⊕0010101)</span></p>
|
|
|
+</section>
|
|
|
+<section id="speck---modell" class="slide level1">
|
|
|
+<h1>Speck - Modell</h1>
|
|
|
+<ul>
|
|
|
+<li>Einfaches Modell der Speck Verschlüsselung</li>
|
|
|
+<li>Kann für die ersten 2 Byte des Rundenschlüssels genutzt werden:</li>
|
|
|
+</ul>
|
|
|
+<div class="sourceCode" id="cb3"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> simple_speck(plaintext, key):</span>
|
|
|
+<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a> Ct_0 <span class="op">=</span> (<span class="bu">int</span>(plaintext[<span class="dv">1</span>]) <span class="op"><<</span> <span class="dv">8</span>) <span class="op">+</span> <span class="bu">int</span>(plaintext[<span class="dv">0</span>]) <span class="co"># RIGHT Key</span></span>
|
|
|
+<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a> Ct_1 <span class="op">=</span> (<span class="bu">int</span>(plaintext[<span class="dv">3</span>]) <span class="op"><<</span> <span class="dv">8</span>) <span class="op">+</span> <span class="bu">int</span>(plaintext[<span class="dv">2</span>]) <span class="co"># LEFT Key</span></span>
|
|
|
+<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a> </span>
|
|
|
+<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a> Ct_1, Ct_0 <span class="op">=</span> ER16(Ct_1, Ct_0, key) <span class="co"># Calculate Roundfunction</span></span>
|
|
|
+<span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a> </span>
|
|
|
+<span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> popcount((Ct_1 <span class="op"><<</span> <span class="dv">8</span>) <span class="op">+</span> Ct_0) <span class="co"># Return Hamming Wight (aka Popcount)</span></span></code></pre></div>
|
|
|
</section>
|
|
|
<section id="t-test" class="slide level1">
|
|
|
<h1>T-Test</h1>
|
|
|
+<ul>
|
|
|
+<li>Wird verwendet um <em>Leakage</em> zu erkennen
|
|
|
+<ul>
|
|
|
+<li>Gibt das Berechnen einer Chiffre mehr Information zurück als geplant: Leakage</li>
|
|
|
+<li>z.B. durch die Power Traces</li>
|
|
|
+</ul></li>
|
|
|
+<li>Berechnet durch:</li>
|
|
|
+</ul>
|
|
|
+<p><img data-src="img/ttest_calc.png" /></p>
|
|
|
+<ul>
|
|
|
+<li>Vergleicht zwei unabhängige Stichproben miteinander, und vergleicht Mittelwerte</li>
|
|
|
+<li>Je unterschiedlicher die Mittelwerte <span class="math inline">→</span> desto weniger Leakage</li>
|
|
|
+</ul>
|
|
|
+</section>
|
|
|
+<section id="t-test-1" class="slide level1">
|
|
|
+<h1>T-Test</h1>
|
|
|
+<ul>
|
|
|
+<li>T-Test der aufgezeichneten Power-Traces:</li>
|
|
|
+</ul>
|
|
|
+<p><img data-src="img/t_test_original.png" /></p>
|
|
|
</section>
|
|
|
<section id="angriff" class="slide level1">
|
|
|
<h1>Angriff</h1>
|
|
|
+<ol type="1">
|
|
|
+<li>Implementierung von Speck auf CW</li>
|
|
|
+<li>Aufzeichnen von X PowerTraces</li>
|
|
|
+<li>Berechnung des Software Modells</li>
|
|
|
+<li>Berechnen der Korrelationen zwischen Modell/Powertraces
|
|
|
+<ol type="1">
|
|
|
+<li>Keybyte für Keybyte</li>
|
|
|
+<li>Rückrechnen des Rundenschlüssels</li>
|
|
|
+</ol></li>
|
|
|
+</ol>
|
|
|
+</section>
|
|
|
+<section id="korrelationen-des-ersten-keybytes" class="slide level1">
|
|
|
+<h1>Korrelationen des ersten Keybytes</h1>
|
|
|
+<ul>
|
|
|
+<li>Correlationen des ersten Keybytes</li>
|
|
|
+<li>Deutliches Maximum der Korrelation bei 0x11</li>
|
|
|
+</ul>
|
|
|
+<p><img data-src="img/correlation_keybyte.png" width="550" /></p>
|
|
|
+</section>
|
|
|
+<section id="problem-blocksize" class="slide level1">
|
|
|
+<h1>Problem: Blocksize</h1>
|
|
|
+<ul>
|
|
|
+<li>Bei <strong>Speck1632:</strong> Operationen nicht auf Byte sondern auf 16-Bit Ebene</li>
|
|
|
+<li>Erste Idee: Modell und Korrelation auf <span class="math inline">2<sup>16</sup></span> Keys</li>
|
|
|
+<li><span class="math inline">→</span> Zu langsam, Unschön</li>
|
|
|
+<li><span class="math inline">→</span> Nicht möglich für andere Modis von Speck</li>
|
|
|
+<li><strong>Lösung:</strong> Modell funktioniert auch auf allen Teilbytes:</li>
|
|
|
+</ul>
|
|
|
+<div class="sourceCode" id="cb4"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a>rightkey <span class="op">=</span> <span class="bn">0x00</span></span>
|
|
|
+<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> guess_key <span class="kw">in</span> <span class="bu">range</span>(<span class="dv">256</span>):</span>
|
|
|
+<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a> leftkey <span class="op">=</span> model( (guess_key <span class="op"><<</span> <span class="dv">8</span>) <span class="op">+</span> righkey )</span>
|
|
|
+<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a></span>
|
|
|
+<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> guess_key <span class="kw">in</span> <span class="bu">range</span>(<span class="dv">256</span>):</span>
|
|
|
+<span id="cb4-6"><a href="#cb4-6" aria-hidden="true" tabindex="-1"></a> rightkey <span class="op">=</span> model( (leftkey <span class="op"><<</span> <span class="dv">8</span>) <span class="op">+</span> guess_key )</span></code></pre></div>
|
|
|
+<ul>
|
|
|
+<li>Auch umsetzbar auf Speck mit Blocksize > 16 Bit</li>
|
|
|
+</ul>
|
|
|
+</section>
|
|
|
+<section id="problem-nth-keybytes" class="slide level1">
|
|
|
+<h1>Problem: <span class="math inline"><em>n</em><sup><em>t</em><em>h</em></sup></span> Keybytes</h1>
|
|
|
+<ul>
|
|
|
+<li>Modell kann nur für die ersten zwei Keybytes genutzt werden, da:</li>
|
|
|
+</ul>
|
|
|
+<div class="sourceCode" id="cb5"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="cf">for</span> i in <span class="fl">0.</span><span class="er">.</span><span class="op"><</span><span class="dv">22</span></span>
|
|
|
+<span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a> ER16<span class="op">(</span>Ct<span class="op">[</span><span class="dv">1</span><span class="op">],</span> Ct<span class="op">[</span><span class="dv">0</span><span class="op">],</span> rk<span class="op">[</span>i<span class="op">++])</span></span></code></pre></div>
|
|
|
+<ul>
|
|
|
+<li>Die Rundenkeys zuvor müssen miteingeschlossen werden</li>
|
|
|
+<li>Muss an der richtigen Stelle passieren (<span class="math inline">⊕</span>-Operation)</li>
|
|
|
+</ul>
|
|
|
+</section>
|
|
|
+<section id="problem-nth-keybytes-1" class="slide level1">
|
|
|
+<h1>Problem: <span class="math inline"><em>n</em><sup><em>t</em><em>h</em></sup></span> Keybytes</h1>
|
|
|
+<div class="sourceCode" id="cb6"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a> <span class="co"># -------------- for one key -----------------#</span></span>
|
|
|
+<span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a> x <span class="op">=</span> ((x <span class="op"><<</span> (<span class="dv">16</span> <span class="op">-</span> ALPHA)) <span class="op">+</span> (x <span class="op">>></span> ALPHA)) <span class="op">&</span> mod_mask <span class="co"># x = ROR(x, 7)</span></span>
|
|
|
+<span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a> x <span class="op">=</span> (x <span class="op">+</span> y) <span class="op">&</span> mod_mask <span class="co"># x = ADD(x, y)</span></span>
|
|
|
+<span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a> </span>
|
|
|
+<span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a> x <span class="op">=</span> x <span class="op">^</span> knownkey[<span class="dv">0</span>] </span>
|
|
|
+<span id="cb6-6"><a href="#cb6-6" aria-hidden="true" tabindex="-1"></a> </span>
|
|
|
+<span id="cb6-7"><a href="#cb6-7" aria-hidden="true" tabindex="-1"></a> <span class="co"># -------------- for second key -----------------#</span></span>
|
|
|
+<span id="cb6-8"><a href="#cb6-8" aria-hidden="true" tabindex="-1"></a> </span>
|
|
|
+<span id="cb6-9"><a href="#cb6-9" aria-hidden="true" tabindex="-1"></a> y <span class="op">=</span> ((y <span class="op">>></span> (<span class="dv">16</span> <span class="op">-</span> BETA)) <span class="op">+</span> (y <span class="op"><<</span> BETA)) <span class="op">&</span> mod_mask <span class="co"># y = ROL(y, 2)</span></span>
|
|
|
+<span id="cb6-10"><a href="#cb6-10" aria-hidden="true" tabindex="-1"></a> y <span class="op">=</span> y <span class="op">^</span> x <span class="co"># y = XOR(y, x)</span></span>
|
|
|
+<span id="cb6-11"><a href="#cb6-11" aria-hidden="true" tabindex="-1"></a> x <span class="op">=</span> ((x <span class="op"><<</span> (<span class="dv">16</span> <span class="op">-</span> ALPHA)) <span class="op">+</span> (x <span class="op">>></span> ALPHA)) <span class="op">&</span> mod_mask <span class="co"># x = ROR(x, 7)</span></span>
|
|
|
+<span id="cb6-12"><a href="#cb6-12" aria-hidden="true" tabindex="-1"></a> x <span class="op">=</span> (x <span class="op">+</span> y) <span class="op">&</span> mod_mask <span class="co"># x = ADD(x, y)</span></span>
|
|
|
+<span id="cb6-13"><a href="#cb6-13" aria-hidden="true" tabindex="-1"></a> </span>
|
|
|
+<span id="cb6-14"><a href="#cb6-14" aria-hidden="true" tabindex="-1"></a> x <span class="op">=</span> x <span class="op">^</span> knownkey[<span class="dv">1</span>] <span class="co"># x = XOR(x, k) </span></span>
|
|
|
+<span id="cb6-15"><a href="#cb6-15" aria-hidden="true" tabindex="-1"></a> </span>
|
|
|
+<span id="cb6-16"><a href="#cb6-16" aria-hidden="true" tabindex="-1"></a> <span class="co"># -------------- for third key -----------------#</span></span>
|
|
|
+<span id="cb6-17"><a href="#cb6-17" aria-hidden="true" tabindex="-1"></a> <span class="co"># [...]</span></span></code></pre></div>
|
|
|
+</section>
|
|
|
+<section id="korrelationen-des-ersten-keybytes-1" class="slide level1">
|
|
|
+<h1>Korrelationen des ersten Keybytes</h1>
|
|
|
+<p><img data-src="img/traces.png" width="550" /></p>
|
|
|
</section>
|
|
|
<section id="gegenmaßnahmen" class="slide level1">
|
|
|
<h1>Gegenmaßnahmen</h1>
|
|
|
</section>
|
|
|
<section id="hiding" class="slide level1">
|
|
|
<h1>Hiding</h1>
|
|
|
+<ul>
|
|
|
+<li>Verstecken des eigentlichen “Leakages” in Rauschen</li>
|
|
|
+<li><span class="math inline">→</span> Erhöhung des vorhandenen Rauschens während der Berechnung</li>
|
|
|
+<li>Mehrere Möglichkeiten
|
|
|
+<ul>
|
|
|
+<li>Mischen der Instruction-Order</li>
|
|
|
+<li><strong>Hinzufügen von “Dummy Instructionen”</strong></li>
|
|
|
+<li>Clock Jitter</li>
|
|
|
+</ul></li>
|
|
|
+</ul>
|
|
|
</section>
|
|
|
<section id="hiding---code" class="slide level1">
|
|
|
<h1>Hiding - Code</h1>
|
|
|
+<ul>
|
|
|
+<li><strong>Ansatz:</strong> Korrelation kommt von <code>ER16()</code>
|
|
|
+<ul>
|
|
|
+<li>XOR/Add/Rotate</li>
|
|
|
+</ul></li>
|
|
|
+<li>Hinzufügen weitere RXA Operationen um Noice zu erhöhen</li>
|
|
|
+<li>Ersetzen von jeder XOR Operatione mit folgender:</li>
|
|
|
+</ul>
|
|
|
+<div class="sourceCode" id="cb7"><pre class="sourceCode c"><code class="sourceCode c"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="dt">uint16_t</span> XOR<span class="op">(</span><span class="dt">uint16_t</span> a<span class="op">,</span> <span class="dt">uint16_t</span> b<span class="op">,</span> <span class="dt">int</span> random<span class="op">)</span> <span class="op">{</span></span>
|
|
|
+<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a> <span class="dt">uint8_t</span> tmp <span class="op">=</span> random <span class="op">^</span> <span class="bn">0x5F</span><span class="op">;</span></span>
|
|
|
+<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a> tmp <span class="op">^=</span> <span class="op">(</span>random <span class="op">^</span> a<span class="op">);</span></span>
|
|
|
+<span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a> tmp <span class="op">^=</span> <span class="op">(</span>tmp <span class="op">^</span> b<span class="op">);</span></span>
|
|
|
+<span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a> tmp <span class="op">&=</span> <span class="op">(</span>tmp <span class="op">&</span> a<span class="op">);</span></span>
|
|
|
+<span id="cb7-6"><a href="#cb7-6" aria-hidden="true" tabindex="-1"></a> tmp <span class="op">&=</span> <span class="op">(</span>tmp <span class="op">&</span> b<span class="op">);</span></span>
|
|
|
+<span id="cb7-7"><a href="#cb7-7" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> a <span class="op">^</span> b<span class="op">;</span></span>
|
|
|
+<span id="cb7-8"><a href="#cb7-8" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>
|
|
|
+<ul>
|
|
|
+<li>Random wird bei jeder Verschlüsslung erneut generiert</li>
|
|
|
+</ul>
|
|
|
</section>
|
|
|
<section id="hiding---t-test" class="slide level1">
|
|
|
<h1>Hiding - T-Test</h1>
|
|
|
+<ul>
|
|
|
+<li>Ergebnisse des T-Tests mit implementierter Hiding Maßnahmen:</li>
|
|
|
+</ul>
|
|
|
+<p><img data-src="img/t_test_hiding_random.png" /></p>
|
|
|
+<ul>
|
|
|
+<li>Bedarf weitere Analysen, Unterschied der beiden T-Tests sind nur Minimal</li>
|
|
|
+<li>Keine Indikation dass Hiding funktioniert</li>
|
|
|
+</ul>
|
|
|
</section>
|
|
|
-<section id="korrelationen" class="slide level1">
|
|
|
-<h1>Korrelationen</h1>
|
|
|
+<section id="korrelationen-des-ersten-keybytes-2" class="slide level1">
|
|
|
+<h1>Korrelationen des ersten Keybytes</h1>
|
|
|
+<ul>
|
|
|
+<li>Besseres Ergbniss der Korrelationen bis 5000 Traces</li>
|
|
|
+<li>Keine Korrelation sticht heraus</li>
|
|
|
+</ul>
|
|
|
+<p><img data-src="img/corr_traces_hiding_5k.png" width="550" /></p>
|
|
|
+</section>
|
|
|
+<section id="hiding-bypass" class="slide level1">
|
|
|
+<h1>Hiding Bypass</h1>
|
|
|
+<ul>
|
|
|
+<li>Korrelation sollte weiterhin möglich sein wenn man die Operationen in Betracht zieht</li>
|
|
|
+<li>Schwierigkeit hängt am Zufallszahlengenerator</li>
|
|
|
+<li><strong>Problem:</strong> Sichere Zufallszahlen auf Embedded Chips ist nicht trivial</li>
|
|
|
+</ul>
|
|
|
+<p><span class="math inline">→</span> Bypass konnte <strong>nicht</strong> realisiert werden</p>
|
|
|
</section>
|
|
|
<section id="referenzen" class="slide level1">
|
|
|
<h1>Referenzen</h1>
|
|
|
+<ul>
|
|
|
+<li><a href="Improved%20Differential%20Cryptanalysis%20of%20Round-Reduced%20Speck">Improved Differential Cryptanalysis of Round-Reduced Speck</a></li>
|
|
|
+<li><a href="Breaking%20Speck%20cryptosystem%20using%20correlation%20power%20analysis%20attack">Breaking Speck cryptosystem using correlation power analysis attack</a></li>
|
|
|
+<li><a href="%7BSpeck-R:%20An%20ultra%20light-weight%20cryptographic%20scheme%20for%20Internet%20of%20Things">{Speck-R: An ultra light-weight cryptographic scheme for Internet of Things</a></li>
|
|
|
+</ul>
|
|
|
</section>
|
|
|
</div>
|
|
|
</div>
|