 Der nächste Spieler ist ein Master-Student aus Niederlands. Sein Name ist Dan Sprenkels. Er hat mir gesagt, er sei vielleicht der jüngste Spieler in dieser... Ja, und damit auch herzlich willkommen aus der Übersetzer-Kabine. Du hörst gleich, wir sollten unsere Geheimnisse teilen vom 34. Chaos-Communication-Kongress in der Übersetzung von Flo und Tribut. Und bitte holen Sie die Pen- und Papier, weil dieser Gespräch ist ein Kurs, das Dan auf seiner Universität betrifft. Der Harold sagt gerade, dass das ein Universitätskurs gewesen ist. Das wird also Noten geben, legt also euer Papier und euer Bleistifte bereit. Wir sollten unsere Geheimnisse teilen. Ja, danke, dass für die Einführung... Es ist eine Ehre hier zu sprechen. Mein Name ist Dan Sprenkels. Ich komme von der Radboot-Universität, wo ich eine Forschungsaufenthalte hatte. Und das ging um Shamir's Secret Sharing. Also, den Geheimnisverteil-Algorithmus nach Shamir. Und es geht um Shamir's Secret Sharing. Das ist aber kein neuer Algorithmus, sondern es geht auch um die Implementierung. Denn ich möchte euch auch einen bestimmten Punkt vorstellen. Also, mein Name ist Dan Sprenkels. Ich habe an der Radboot-Universität Chemie studiert. Und nach Chemie bin ich zu Informatik weitergegangen. Denn das ist offensichtlicher besser. Applaus im Saal. An einem normalen Tag implementiere ich aktuell eliptische Kurven-Kryptografie. Das ist ein sehr spezielles Feld. Aber ich möchte hier ein paar kryptografische Implementierungen, wie Kryptografische Implementierung tatsächlich funktioniert, mit euch teilen. Andere Leute, die hier auch beteiligt sind, ist Peter Schwabe. Das ist mein Betreuer und Sean Moss. Der ist Geschäftsführer einer Firma in Taipei. Und die machen Dinge mit Bitcoin und der Blockchain. Also, als Allererstes, ich weiß nicht, wie euer mathematischer Hintergrund ist. Ich würde zuerst mal fragen wollen, wer hat das hier schon mal gehört? Entwickelt nicht eure eigene Kryptografie? Ja, das ist ziemlich gut. Zweite Frage. Wer weiß, wieso wir das die ganze Zeit sagen? Ja, also, das ist schade, denn das wollte ich kurz erklären. Aber ich wollte eigentlich auch das zweite hier erklären. Also, die eigene Kryptografie zu entwickeln, ist nicht so einfach. Man kann leicht Dinge falsch machen. Und die zweite Punkt, implementiere nicht deine eigene Kryptografie, da ist es dasselbe. Wir haben gestern in dem Talk von Philippo gesehen, es ist wirklich schwierig, die eigene Kryptografie zu implementieren. Und in dem Fall war es so, dass ein Übertragsfleck in der CPU die gesamte Sicherheit kompromittiert hat und in seinem Fall den gesamten privaten Schlüssel rekonstruieren ließ. Und ich werde jetzt hier erklären, wieso es so schwierig ist, eigene Kryptografie zu implementieren. Und daher habe ich den einfachsten Krypto-Algorithmus genommen, das Chemie Secrets Sharing eben. Das ist der Inhalt meines Talks. Ich werde über die Theorie sprechen, was Chemie Secrets Sharing ist, wie man das auf Papier machen kann. Und dann in die Implementierung reingehen. Ich denke, das hier ist ein besserer Überblick über meinen Talk. Ich werde mich bemühen, den ersten Teil sehr einfach verständlich zu machen. Der zweite wird vielleicht weniger einfach zu verstehen sein, aber ich denke, jeder, der hier ist, kann dem ganzen Talk gleich folgen. Also, zum ersten Teil. Wir haben das Problem, also viele Leute halten das nicht wirklich für ein Problem, aber wenn ihr einen Schlüssel besetzt und ich nehme mal als Beispiel ein Bitcoin Wallet, denn Bitcoin ist ja ein aktuell sehr hippes Wort und alle kommen zu einem Talk, wenn man das im Abstract ein, zwei Mal erwähnt. Dann kommen alle zu dem Talk. Und ihr habt diesen Bitcoin Schlüssel und ihr wollt den sicher halten, denn da sind 10.000 Euro im schlimmsten Fall und das Sicher machen bedeutet zwei Dinge. Das erste ist, dass niemand jemals diese Geheimnisse kompromittieren kann. Also, das Geheimnis muss geheim sein. Und die andere Sache ist, man möchte das Geheimnis auch nicht verlieren, denn wenn man das Geheimnis verliert, dann ist das Geld auch weg. Und der offensichtliche Weg, wie man den Schlüssel in den Back ablegen kann, ist, einen Schlüssel gibt man an die Bank und man hebt es auf einem Stück Papier auf oder man gibt es jemanden, den man sehr gut vertraut, also Ehepartner oder Anwalt. Aber dann gibt es so eine Sache, die Single Point of Failure heißt. Einzelner Punkt, an dem Dinge schiefgehen können und das Problem damit ist, es können Dinge sehr einfach schiefgehen. Und die Auswege in, stattdessen, dass man es einer Person gibt, also wir wollen es nicht einer Person geben, denn eine einzelne Person, das kann einen Fehl schlagen. Zum Beispiel, weil ein Haus abbrennt, in dem das Stück Papier eben aufbewahrt werden will. Sondern stattdessen wollen wir das Vertrauen aufteilen in kleine Teile und wir wollen diese Teile einer gewissen Entität geben, einer Person, den wir vertrauen, dass sie das sicher aufbewahren. Und Chamier's Secret Sharing löst das Problem. Aber schauen wir uns erst ein paar einfache Beispiele an, wie wir das ganz einfach machen könnten. Und die erste Idee, die, wir haben zum Beispiel einen Schlüssel, der ist vielleicht 30 Zeichen lang und wir nehmen einfach nur die ersten 10 und die zweiten 10 und dann die dritten 10 und wir geben die ersten 10 einer Person und die zweiten 10 einer Person und so weiter. Und in dem Fall von kryptografischen Schlüsseln, also zum Beispiel dem Schlüssel zu eurem Bitcoin Wallet, wenn man die ersten 2 hat, dann ist es relativ leicht, den Schlüssel einfach auszuprobieren, bis man die letzten 10 gefunden hat. Das ist also nicht wirklich sicher. Und ein sicherer Ansatz, der noch theoretischer ist, wäre so eine One-Time-Pad-Konstruktion zu benutzen und das funktioniert so, dass man 2 einen zufälligen Schlüssel erzeugt und dieser Schlüssel wird benutzt, um ein Geheimnis zu entschlüsseln. Und bei uns, in unserem Fall, können wir 2 Anteile generieren, A und B, und die sind beide zufällig generiert und diese zufällig generierten A und B benutzen wir, um ein dritten Anteil zu erzeugen, indem wir die X-Ore-Operation benutzen. Von M, A und B und M ist eben das Geheimnis und um das Geheimnis zu rekonstruieren, können wir die X-Ore-Summe von A, B und C erzeugen. Denn wir wissen, das funktioniert, denn C war ja X-Ore von M, A und B und die A und B heben sich gegenseitig auf und dann kriegen wir M zurück. Aber hier haben wir nur dieses Problem mit dem Single-Point-of-Failure, also mit dem einzelnen Punkt, bei dem Dinge schiefgehen können, gelöst. Wir wissen immer noch, also wenn wir das machen, wird das Geheimnis sicher bleiben. Aber wenn wir jetzt einen dieser Teile verlieren, dann ist das Problem nicht gelöst. Also wenn wir ein Backup erstellen wollen, wenn das Problem, das wir lösen wollen, ist, dass wir den Schlüssel möglicherweise verlieren, dann löst das gar nichts. Also wir wollen was Besseres haben. Und es gibt was Besseres. Wir hatten das in den letzten 40 Jahren, also 40 Jahre lang gibt es das schon. Und das ist vor Adi Shamir, ist das veröffentlicht worden, vor 40 Jahren. Und das ist ein Grenzwertschema. Und das bedeutet, dass wir eine gewisse Menge von Teilen verteilen können. Und wir können eine Zahl wählen, die notwendig ist an Anzahl von Teilen, die notwendig ist, um das Geheimnis wiederherzustellen. Das heißt, wir brauchen nicht alle Teile, um das Geheimnis wiederherzustellen, sondern wir können einfach fünf Teile verteilen und sagen, drei davon sind genug, um das Geheimnis herzustellen. Und ein oder zwei Teile dazu verlieren, ist dann kein Problem mehr. Und dieses Schema ist auch beweisbar sicher. Beweisbar sicher ist ein Name, den ich nicht mag. Das bedeutet eigentlich nichts, deswegen sage ich sicher im Sinne der Informationstheorie, was ein besserer Ausdruck ist. Denn das bedeutet, wenn du nicht genug Teile hast in diesem Fall, dann bist du nicht in der Lage, das Geheimnis wiederherzustellen. Und das ist nicht wie Verschlüsselung, wo der Schlüssel unbekannt ist und man kann jeden Schlüssel ausprobieren. Und einfach der Schlüsselraum ist so groß, dass das unmöglich ist. Sondern in diesem Fall, selbst wenn wir hier unmöglich, also unbeliebig viel Macht hätten, also beliebig viel Computer zur Verfügung hätten, dann wären wir trotzdem nicht in der Lage, das Geheimnis zu rekonstruieren. Und das bedeutet auch, dass sicher ist gegen Quantencomputer, denn mehr Rechenpower bringt uns hier überhaupt nichts. Also hier ein Beispiel. Ich habe eine geheime Nachricht, mein geheimer Schlüssel M und ich möchte den verteilen bei meinen Freunden, damit die nur ihren Anteil haben, mit dem sie nichts anfangen können. Aber ich kann das ursprüngliche Geheimnis wiederherstellen, falls ich das zu irgendeinem Zeitpunkt verliere. Das heißt, ich verteile fünf von diesen Teilen. Ich rechne die aus. Und dann hat jeder meiner Freunde so ein Teil, und ich brauche die möglicherweise irgendwann in der Zukunft und dann frage ich, hier, gib mir mal eure Teile wieder. In diesem Fall hat einer meinen Teil nicht zurückgegeben, entweder weil er böse ist oder weil er ihn verloren hat. Und das bedeutet in unserem Fall, können wir das wiederherstellen. Also am Anfang hatte ich ja den Grenzwert auf vier gesetzt und in diesem Fall reichen also vier Teile, um mein Geheimnis wiederherzustellen. Ich benutze diese vier Teile und ich berechne meinen Geheimnis wieder und ich kriege mein ursprüngliche Nachricht M zurück. Das ist also leicht zu verstehen, wenn man sich das anschaut. Und jetzt schauen wir uns kurz noch die Mathematik an. Die Mathematik ist relativ unterhaltsam. Die Notation ist schwierig zu verstehen, aber ich werde es euch trotzdem zeigen, um ein Grenzwertschema, wo wir Teile verteilen wollen und der Grenzwert, um es wieder zusammenzubauen, ist K. Dann konstruieren wir ein zufälliges Polinom mit Grad K-1. Das heißt A mal X bis hoch K-1 bis runter zum niedrigsten Koeffizienten. Und statt dass wir den niedrigsten Koeffizienten zufällig wählen, wählen wir den niedrigsten Koeffizienten als unsere geheime Nachricht. Das ist in dem Fall einfach nur eine Nummer. Das heißt, wir haben jetzt hier ein Polinom P erzeugt und wir erzeugen Punkte auf diesem Polinom. Also für X ist gleich 1, X ist gleich 2 und so weiter bis N. Und dann verteilen wir diese Punkte als Teile und wir verteilen diese Anteile so, dass wir am Ende aus diesen Punkten das Geheimnis wiederherstellen können. Und in unserem Fall, wenn wir dieses Polinom haben, wenn wir alle diese Koeffizienten haben, dann haben wir auch den niedrigsten Koeffizienten natürlich, also die Nachricht M. Und wir nehmen jetzt also diesen Punkt und wir können eine Gleichungssysteme erzeugen, wie damals in der Linearen Algebra Vorlesung. Und wir können dieses Gleichungssystem lösen, indem wir die X- und Y-Werte einsetzen. Und wenn wir genug Punkte haben, dann können wir das originale Polinom zurück ausrechnen. In der Praxis benutzen wir die sogenannte Lagrange Interpolation, das könnt ihr euch auf Wikipedia anschauen, was das ist, aber es ist leichter zu erklären, deswegen erkläre ich es damit. Es ist vielleicht schwer zu verstehen, aber ich habe auch Bilder für euch. Zuerst nehmen wir 42 als geheime Nachricht, selbstverständlich, was sonst. Und dann erzeugen wir ein zufälliges Polinom. In dem Fall ist unser erster Koeffizient 4, unser zweiter ist minus 25. Das heißt, wer hat eine schöne Parabel und auf dieser Parabel wählen wir jetzt Punkte. Also in diesem Fall 4 Punkte. Und wir haben gesehen 3 Koeffizienten, das heißt, der Grenzwert ist 3. Und wir sehen, dass wenn man jetzt nur 2 Punkte hat, um das zu rekonstruieren, dann kann man nur, also man könnte eine gerade generieren, dann erzeugt das auf dem niedrigen Koeffizienten einen zufälligen Wert, der aber eben nicht das Geheimnis liefert. Aber wenn man den dritten Punkt dazu kriegt, kann man die Parabel rekonstruieren, X gleich 0 einsetzen und man erhält die Nachricht. Das heißt, dieses Gleichungssystem hier zu lösen das setzt man einfach die X und Y Werte ein und dann kann man das auf einem Stück Papier lösen, das könnt ihr wahrscheinlich alle in 5 Minuten machen und dann kriegt ihr die Nachricht, die ist 42 zurück. Ja, das ist also alles super, aber wir wissen, das ist im Sinne der Informationstheorie, aber es kann aber doch was schiefgehen. Das ist zwar, was die Geheimhaltung betrifft sicher, das heißt, wenn das Geheimnis geheim ist, dann wird es auch weiterhin geheim bleiben, aber niemand hat gesagt, dass man das Geheimnis nicht vielleicht ändern könnte. Was wir jetzt machen wollen, ist, wir wollen das hacken. Wir hätten gerne so einen Teil, einer der Personen und wir wollen diesen Anteil verändern. Das sieht vielleicht aus wie der originale Anteil, aber es führt auf ein anderes Geheimnis. Also wenn wir hier zum Beispiel ein Polynom vom Grad 1 haben, also einfach eine Gerade, dann nehmen wir zwei Punkte auf dieser Gerade und wenn wir einen anderen Punkt generieren und eine neue Gerade durch diesen Punkt malen, dann kriegen wir einen neuen Punkt. Also wenn ich zum Beispiel einen bösartigen Teil zurückgehe, und wenn ich keine Informationen über das originale Geheimnis habe, dann kann ich auch diesen Punkt wählen. Wie kann man das jetzt lösen? Und ich werde da nachher nochmal drüber sprechen. Das erste ist, ich wusste, dass die anderen Punkte, also ich wusste, dass der andere Punkt, der auch verteilt wurde, bei x gleich 2 lag. Das heißt, das gibt mir Informationen, wie kann ich diese bestimmte Steigung hier wählen, um meinen neuen Wert zu wählen. Und ich wusste auch was über das originale Geheimnis. Aber wir hatten ja angenommen, dass das Geheimnis geheim ist. Aber das ist ja vielleicht nicht immer der Fall. Also ich wusste was über das originale Geheimnis. Das heißt, die Lösung wäre, dieses Geheimnis zufällig zu wählen. Aber die Frage ist, na gut, aber ich meine, dann kann ich ja nichts teilen, wenn das Geheimnis zufällig ist, und da reden wir nachher drüber. Fangen wir mit Teil 2 an. Das war jetzt die Einführung. Jetzt kommen wir zur Implementierung. Und das ist der Punkt, den die meisten Krypografen aufhören zu sprechen. Wir haben dieses schöne Schema, das funktioniert, und wir wissen, wie wir es anwenden können, und jetzt fertig. Implementation ist magie, die ist einfach. Lass mal weg. Und als ein Krypografie-Engineer möchte ich jeden Punkt machen, dass die Implementation nicht der einfachste Teil dieses Prozesses ist. Die Geschichte ist, Bitmark, die Firma in Taiwan, hat uns gefragt, wir möchten eine Library für Secret Sharing haben. Wir haben gefragt, wie möchten wir das? Und sie sagten, wir möchten das überall brauchen können, auf allen Plattformen, auf Android, auf IOS, vielleicht auf Microcontrollers, irgendwann in der Zukunft. Wir dachten uns, welche Technik gibt es da? Das sind die beiden beliebtesten. Und wir haben uns den Code angeschaut, und wir brauchten ein Code, der wirklich sicher ist, und auch gegenseitig im Kanal Angriffe resistent ist. Dieser Code lässt sich entweder nicht gut auf andere Plattformen portieren, oder hat Cash-Timing-Probleme. In unserem Fall war das nicht akzeptabel. Das heißt also, ich will nicht sagen, dass diese Libraries schlecht sind, die haben gute Code, aber für unsere Anforderungen waren sie nicht die richtigen Gewahlen. Also, wir müssen es selber bauen. Gut. Ich habe vier Herausforderungen ausgewählt, die ich mit meiner Implementation hatte, und das waren nicht die einzigen Herausforderungen, es gab viele andere. Aber ich denke, diese vier sind die besten, um aufzuzeigen, wo die Herausforderungen in der Implementation liegen. Das erste ist, das Integritätsproblem aus der letzten Folie vom vorherigen Teil. Das zweite Problem ist, wie wir die Werte encodieren, denn wir haben einfach Werte, nicht Bytes und nicht Integer. Wir müssen etwas haben, um damit zu rechnen. Das dritte Problem ist, wie wir Seitenkanal Angriffe vermeiden. Wie machen wir das, dass das Ding schnell läuft, weil ich mag schnellen Code. Und ich mag Herausforderungen in der Optimierung von Code. Der erste Teil ist Integritätsproblem. Wir könnten entweder diese X-Werte randomisieren oder die Geheimnisse randomisieren. Die X-Werte sind nicht wirklich einfach randomisierbar, weil wir müssen wirklich große X-Werte wählen. Und das würde die Berechnung deutlich verlangsamen. Die Sicherheit nimmt mit der Anzahl Teile, die wir verteilen ab. Das heißt, wir versuchen zu randomisieren, was in den Algorithmen geht und verlieren wir. Stattdessen nehmen wir und statt die Nachricht direkt in das Schema einzugeben, generieren wir einen randomisierten Schlüssel, den wir durch dieses Schema durchschleusen können und nutzen diesen Schlüssel dann, um unsere Message zu verschlüsseln. Mit diesem Vorgehen müssen wir also keinen Text durch diesen Algorithmen schleusen, der eigentlich für Zahlen vorgesehen wäre. Und was noch wichtiger ist, wir können eine zufällige Zahl durch Algorithmen schleusen, der für zufällige Zahlen gemacht ist. So funktioniert das. Wir verschlüsseln also das Secretmeiden in den zufälligen Schlüssel und nehmen dann die Keyshares kombinieren daraus den und nutzen diesen Schlüssel um die Message, den Ciphertext zu entschlüsseln. Und damit kommen wir auf die Message zurück. Die zweite Herausforderung wie inkludieren wir unsere Werte? Es könnte ein bisschen schwer zu verstehen sein, wenn ihr für die Finite Fields, Arithmetic stuff, für Leute, die sich noch nicht mit der Materie befasst haben. Es kommt rauf zu wir können nicht einfach alle Zahlen mit Computern verwenden. Wir sind eingeschränkt und können nur markierte Integer oder Bytes oder etwas ähnliches verwenden. Was wir wollen ist eine Struktur, eine mathematische Struktur in der wir berechnen können, in dem wir Zahlen berechnen können. Und wir wollen unseren originalen Schlüssel nehmen den in dieser Struktur abbilden. Abbilden. Was wir da normalerweise in der Cryptographie machen, ist normalerweise nehmen wir eine riesengroße Primzahl und können dann Modulo dieser Primzahl. Das funktioniert sehr gut für Situationen, wo wir eine Primordnung brauchen. In diesem Fall ist das keine Anforderung, also können wir eine andere Struktur verwenden, eine mit genau 256 Elementen. Solche Struktur, die genau 256 Elemente hat, können wir in einem Byte abbilden. Ein Byte, das auf jede dieser Zahlen zeigt. Für die Mathematiker. Was wir nutzen, endlich ist ein Körper, auf dem wir jede dieser Zahlen abbilden können. So können wir die Berechnung deutlich optimieren. Aber Ende bedeutet das, dass wenn wir jedes Byte in diesem Schlüssel separat haben, dann können wir ein Algorithmus für jedes Byte ausführen und für jedes dieser Bytes können wir das Secret Sharing ausführen und können den Prozess parallelisieren. Da werde ich euch nachher darauf eingehen, wie wir das machen. Aber erst mal, die Seitenkanalangriffe sind Angriffe, die nicht auf den Output eines Algorithmus gehen. Also nicht ich packe was in den Algorithmus rein und schaue was rauskommt und weiss dann, was er getan hat. Sondern die funktionieren anders. Statt den Output nehmen wir eine Eigenschaft des Algorithmus. Eine Eigenschaft, die wir messen können. Das beste Beispiel ist das Timing. Wir können messen, wie lange ein Algorithmus läuft und wir wissen, wenn ein Schlüssel eine Eins an einer bestimmten Position enthält und dann der Algorithmus die Länge erdauert, dann können wir messen, wie lange der Algorithmus läuft und wenn er eine lange Zeit läuft, dann wissen wir, ah, da ist ein Eins und wenn er schnell läuft, dann können wir iterativ tun wieder und wieder und mit einer großen statistischen Werkzeugkiste Tests laufen lassen und damit wir es manchmal echt einfach ein Algorithmus zu klacken. Das erste Tool gegen seinen Kanalangriff ist, wir dürfen nie entscheidend treffen, wie ein Algorithmus keine Branches eingehen. Wenn Statements sind verboten L-Statements sind verboten Switch und so weiter, alles verboten. Das zweite ist Verwandt mit dem ersten. Hat aber einen spezifischen Trick, zwar ein Cash-Timing-Angriff. Wir nutzen den Fakt, dass wenn wir etwas aus dem Speicher lesen, dass Timing anders ausschauen könnte als wenn dieses Element schon im CPU-Speicher ist. Das kann ein riesiger Unterschied sein und da kann es richtig hässliche Verwundbarkeiten geben. Das dritte ist, wir dürfen keine Instruktionen benutzen die variable Zeitanforderungen haben in der CPU. Intel-Prozessoren ist das zum Beispiel Division, die oftmals einen variable Zeitraum beansprucht und wenn man sich zum Beispiel die Spezifikationen in älterer CPUs anschaut, dann sind teilweise Instruktionen wie Multiplikation betroffen, die variable Zeitanforderungen haben. Das bringt mich auch zu meinem letzten Punkt. Wie tun wir so was in einer High-Level-Sprache, wie zum Beispiel C und wie können wir das schnell tun und das tun wir durch Bit-Slicing. Das ist eine richtig geniale Technik. Wir haben also alle diese Bites und teilen diese Bites separat. Was wir jetzt machen können ist parallelisieren über diese Bites und ihr erinnert euch eine CPU bestehend nur aus logischen Instruktionen. Was wir also machen können ist multiplizieren und hinzufügen mit logischen Operatoren. Was wir jetzt tun ist, wir nehmen diese Bites wir nehmen das erste Bit von jedem dieser Bites und parken es in ein anderes Register und dann nehmen wir das zweite Bit jedes dieser Bites und parken es in ein anderes Register und so weiter. Am Ende werden wir 8 verschiedene Register gebraucht haben dort alle Bites dieser Bites verteilt haben und jetzt implementieren wir diesen Algorithmus statt mit normalen Operatoren wie Division und Multiplikation jetzt können wir nur logische Bitwise Operators benutzen also nur Bitwise und XOR und OR was ihr hier seht, ist ein komplette Erde für 2 Bits das ist ein sehr sehr sehr kleine Teil davon wie eine CPU 2 Zahlen zusammenzählt dass man so was machen kann das ganze Ding werden wir innerhalb dieser Schaltkreise abbilden in einer 32 Bit Platform damit es also auch zum Beispiel auf Eltern Arm Devices läuft und wenn wir eine viel größere Berechnung haben dann haben wir auch den Paralysierungsfaktor von 32 dazu dass wir Performance Gewinn haben dass hier ist eine 32 Bit Platform wenn wir eine 64 Bit Platform haben dann haben wir 64 fache Paralysät es funktioniert auch mit AVX 2 oder 512 damit haben wir am Ende diese Übersicht wie wir das implementieren können und wir nehmen also dieses wirklich zufällige Konstrukt das Zahl das ist eine andere Herausforderung über die ich heute nicht sprechen werde wir generieren einen zufälligen Schlüssel wir verschlüsseln mit diesem Schlüssel die geheime Nachricht und dann und dann und dann nehmen wir diesen Schlüssel und Bitsleißen den Bitsleiß damit unsere Secret Shares parallel berechnen können und wenn wir mit dieser Berechnung durch sind dann müssen wir die Bitsleiß-Operation wieder umkehren und damit haben wir unsere Shares und um das Secret wieder rauszubekommen funktioniert das ganze genau den anderen Weg rum den nehmen die Shares Bitsleißen sie haben damit unsere Share-Values Share-Werte machen damit eine Lagrange-Interpolation in der End umkehren das Bitsleißing wieder um und nutzen diesen Schlüssel um die originale Message zu entschlüsseln und zu verifizieren die Performance von dieser Imlementation ist ziemlich gut, denke ich sind ziemlich schlechte Benchmarks weil ich sie nicht wirklich sauber durchgeführt habe ich habe diese Präsentation gemacht ein paar Benchmarks dafür gemacht ich habe mich nicht wirklich detailliert aber eine enge C-Schleife geht ungefähr 10 Mikrosekunden die anderen auch ungefähr 10 Mikrosekunden ich habe keine Ahnung wieso die Rustbindings schneller sind wenn jemand eine Idee hat wieso dann sag mir das bitte aber am Ende bedeutet das ungefähr 100.000 Calls jede Sekunde die wir machen können das ist locker genügend Performance mehr brauchen wir nicht wenn wir mehr brauchen dann was mir aufgefallen ist ist über die Hälfte der Zeit wird im Verschlüsselungsverfahren benutzt und nicht im Secret Sharing Algorithmus um das weiter zu verbessern könnten wir eine andere Verschlüsselungsverfahren verwenden wir verwenden Tweetsault was wirklich gut ist, sehr portabel ist aber es ist nicht auf Performance optimiert und da könnten wir mehr rausholen am Ende, Dinge die falsch hätten offen können selbst als dass wir als Krypografen oft sehen zum Beispiel auf Stack Overflow Leute denken, dass wenn man ein Geheimnis verschlüsselt dass es damit die Integrität gesichert ist weil wenn es verschlüsselt ist dann wissen Leute nicht wie man es verändern kann und wissen nicht was man damit machen könnte aber das ist falsch das Integrität Funktionale hat man nur dann zugesichert dass man eine Message Authentication eine Nachrichtenauthentisierung hat das zweite was falsch hätte laufen können sind Timing Angriffe Timing Angriffe sind Verwundbarkeiten die wirklich oft in Implementationen heißt die Menge von Kryptografie-Engineuren in dieser Welt ist vielleicht ein bisschen zu klein sonst hätten wir für Beispiel in den Ghosten Kryptor Implementationen in verschiedenen Libraries die wir, denke ich mal, nicht haben wir hätten wahrscheinlich dann auch keine Timing Leaps in G-Crypt die die letzten May the Fourth be with you paper veröffentlicht wurden das ist ein Problem das letzte Problem ist in Armory das ist ein hofsicheres Bitcoin Wallet Armory hat Shamir Secret Sharing implementiert und was sie aber nicht gemacht haben ist, dieses Polinom ist nicht komplett zufällig generiert und das führt zu ziemlich bösen Verwundbarkeiten in ihre Implementationen also ziemlich gefährliches Gebiet solchen kryptografischen Code implementieren hier ein Side Track liegen wir mal ab es ist etwas das die meisten programmieren nicht nur Kryptografen, sondern wirklich die meisten programmieren denken über ihre Tools macht was ihr wollt ich denke es ist wichtig, als Entwickler wie uns fragen wir haben diese Software gebaut was, wofür soll sie benutzt werden kann sie von Leuten mit bösen Absichten genutzt werden für Leute die nicht an die Regeln halten wollen und ich erwähne das hier weil ich denke die meisten Programmierer sollten sich das ein bisschen mehr überlegen in unserem Fall verteiden wir Geheimnisse an die Massen und wir verteilen Geheimnisse an vertrauenswürdige Personen und so ich denke nicht dass hier ein böswilliger Nutzer dass für viele böswillige Zwecke verwenden kann weil die Macht ist oft zentralisiert und mit diesem Tool kann man den größten Teil der Zeit dezentralisieren aber der wichtigste Punkt ist, dass wir verantwortlich dafür sind was für Software wir schreiben und wenn wir eine kryptografische Bibliothek schreiben oder wenn wir Testing Code für Volkswagen schreiben dann sind wir dafür verantwortlich was damit gemacht wird damit kommen wir zurück und fangen wir an mit einer kurzen Demo ich habe dieses Geheimnis so ich installieren oder ich versuche erstmal konnte wir uns plus nutzen ja, können wir wie funktioniert das denn wir machen uns 5 Secrets das sind 5 Geheimnis, wohin wo was ist mein Secrets was sind meine Geheimnisse ja, ich weiss ja, aber nein wir haben hier ein paar Secrets wir haben ein Geheimnis das ist die dritte hier das ist mein Restoration Skript zu meinem Skript also, ich zähle den ersten und ich zähle den zweiten zur 5. wir nutzen nicht die 1. wir nutzen nur dieses 2. bis die 5. und Applaus im Saal ja, Demogods ok, also in der Beginn des Talks habe ich gesagt du sollst nicht die Krypto implementieren wir haben gesagt, du sollst die Krypto implementieren Krypto ich hoffe, dass du ich habe ein paar Gründe gesehen und ich habe gegeben dir eine gute Gefühle warum, das ist eigentlich schwer zu machen und deswegen ich sage euch bitte, implementieren Krypto versuchen, wie die Krypto funktioniert aber, wenn du nicht 100% sicher wenn du nicht 100% sicher 100% sicher und wenn das Sicher gegen jeder Attack Factor vielleicht Side-General Resistance oder checken das Single-Carry-Bit wenn das Single-Carry-Bit ist sicher oder nicht dann put a big warning aber, geben eine große Wohnung ganz vorne in der Readme-File und sagt hey Leute, guck mal das ist nur akademische Code aus dem Uni und die haben nur genutzt das selbst zu nennen und die haben nicht weitergeguckt mit ex-Kryptographers zu nutzen bitte, ich nutze das für deine hochsächer Applikation dabei das ist alles wir wünschen die folgenden Leute zu danken meine Slices können auf meinem Website meine Folie sind in meiner Website ich habe auch weitere Lesungen für euch ich habe vergessen meine Deck Extension dieses hier auf dem Folie nicht funktioniert deswegen lasst es alles haben Sie euch fragen Danz Prenkels, danke sehr danke keine Fragen please feel free to assemble behind the microphones and I will put you through then, let's start with number 3 how do you make sure you didn't make an implementation mistake do you have a unit test wie sind diese hier, das ist keine Fehler by deine Implementation gemacht das ist das das ist das terrible thing das ist das schlimme angryptographische Implementation klar ich habe unit tests aber unit tests lösen nicht alle deine Probleme weil der Schlüsselspace ist so groß, dass man nicht alles testen kann im Fall meiner elektrischen Kurvenimplementation das einzige was ich dort tun kann ist, dass jede einzelne Funktion beweisen kann das ist fehleranfällig ich bin nicht 100% sicher ich bin nicht 100% sicher dass meine Implementation keine Fehler enthält ich habe sie geprüft andere Leute haben sie für mich geprüft ich bin ziemlich sicher aber am Ende, nein, ich bin nicht 100% sicher ich denke, das ist das Problem mit allem security-relevanten Code danke für das interessante Talk eine Frage ich habe es gesehen mit den Verfüllungen der actualen Schere das hat dieses Vorteil das ist eigentlich größer als die ursprüngliche Text die die Menge Beitsinformationen die Numerfahre Das ist gar nicht wahr. Mit den Required Shares. Okay. So, ich gehe jetzt zurück zu dieser Folie. Was wir hier tun, ist, wir haben diesen Schlüssel. Wir haben diesen Punkt, diesen x-Wert. Was wir machen müssen, ist, wir haben einen einzelnen Wert für x. Wir arbeiten erstmal mit bytes. Das ist ein 1, ein 2, ein 3. Das wird das erste byte unseres Shares sein. Und dann nehmen wir diesen Schlüssel. Dieser Schlüssel muss zufällig generiert sein. Dieser Schlüssel, in unserem Fall nehmen wir es als 20, als Verschlüsselung seiner Größe. Der nutzt einen 256-Bit-Schlüssel, also 32 bytes. Am Ende haben wir so 33 bytes, die zu unseren Shares dazugerechnet werden. Aber die Menge der Shares und der Grenzwert werden immer dieselbe Anzahl bytes für jedes Share berechnen. Interessanterweise, von den Shares selbst ist nicht erkennbar, was der Grenzwert ist. Wir haben eine Frage von der IRC Chat. Yes, first of all, Gailas ist studying on Twitter. Thank you for losing Lateech, so I just forward this. Es ist ein bisschen zu�tig, dass du usst, Lateechkunst. Es ist ein bisschen zufrieden, dass du usst, Lateechkunst. What if some of the shareholders evenly plot against you and are they any ideas to remedy this issue? Yeah, that's a good question. Eine gute Frage, wie ich mich gegen Social Engineering schütze. Das ist etwas, das ich für mich selbst nicht lösen kann, weil ich kontrolliere nicht das Umfeld der alle Personen. Meine Empfehlung in der Readme ist, mach dir fünf Shares und setze den Grenzwert auf vier. Aber ich weiß nicht, ob das sicher ist. In deinem Fall, du musst dich selbst entscheiden, wem du vertraust, wem du mit deinen Geheimnissanteilen vertraust. Ich kann dir diese Frage eigentlich nicht beantworten. Wie kann dieses Verschluss so egal gegen die Hilfe mit diesem Problem? Ah, ja, das ist eine gute Frage. Hier könnten wir das Secret eigentlich verpuschen, weil das originale Secret war ein Wert, den wir kannten. Was es tut, ist, es randomisiert den Wert, der aus dem Secret rauskommt. Wenn wir mit dem Share rumpuschen, dann ist der Wert, der aus dem Secret rauskommt, komplett zufällig, weil der originale Wert komplett zufällig wäre. Was unser Algorithmus tun wird, ist in Salsa 20, PolyAns 3.05 Verschlüsselung, in diesem Entschlüsselungsschritt, wird es den Authentizierungs-Tag der Verschlüsselung scheitern. Und dann sprechen sie, die Rekombination konnte nicht gemacht werden. Der Schlüssel ist ungültig. Es wird einfach, nein, sagen, das funktioniert nicht. Das ist ähnlich zu einer anderen Frage. Lass uns nehmen, ich suche so sehr meine Bitcoin-Wallet. Ist das möglich? Das ist für meine Family-Komponenten, das drei von meinen Freunden von mir eigentlich teilen zusammen, und dann nimmt das weg von mir. Aber dann hast du natürlich auch das größere Problem, wenn shares verloren gehen, wenn das ein Risiko für dich ist. Das ist ein Trade-off. Eine Zeit für eine kleine Anekdote, ein Beispiel. Wenn du dein Bitcoin-Wallet hast und du möchtest, dass deine Verwandten dich beerben können, dann kannst du deine Anteile unter deinen Familienmitgliedern und Menschen verteilen, damit du, wenn du sterbst, dein Geheimnis rekonstruieren können und damit deinen Bitcoin-Wollstand zugreifen können. Aber in diesem Fall, wenn du ein System hast, wo du die meisten shares hast, dann hast du den Fakt, dass, wenn du diese Anteile verlierst, dass du damit möglicherweise auch das ganze Secret verlierst, was möglicherweise das ist, was du möchtest. Doddic is asking, if you are separating the message into individual bytes and then applying SSS for each byte separately, doesn't it suffer from the similar problems as the electronic code-book-Mode in streaming styles, namely that data patterns are not hidden? Yes. Ja, das ist auch der Grund, wieso wir dieses Hybrideschema verwenden. In diesem Hybrideschema läuft auf dem ganzen Block der ganzen Message und das Secret-Sharing funktioniert auf den einzelnen bytes, weil es dort kein Zufälligen, kein Muster drin hat, weil wir einen komplett zufälligen Schlüssel verwenden. Well, I come from a field which is quite similar in a way to use the programs that you have considered here, which are error correction codes. Well, in my fields there are a lot of error correction codes which can be from my point of view a person in a way hacked to make a similar implementation. But have you considered other codes? So, I did. Die Frage war, ob du überlegt hast, Fehlerkorrektur kurz anzuwecken. Und die Antwort ist, wir haben das nicht getan für Security-Anwendung, weil es also 20-Pole105 schon da war, wenn ich das in einem ausführlichen Wegen machen würde. Schammer-Secret-Sharing ist nicht das einzige Grenzwertschema. Es gibt auch zum Beispiel Feldmann-Verifiable-Secret-Sharing. Es gibt auch Petersen-Verifiable-Secret-Sharing. Und das sind beides Secret-Sharing-Schämmer-Tart, die das Interessiertes-Problem lösen. Aber sie sind ein bisschen komplexer. Wahrscheinlich hätte ich eines davon verwendet, wenn das eine Anforderung gewesen wäre. Sehr gut gemacht. Für implementieren. Konnten Sie Wetterklären, die Optimizieren besiegeln für die Compilers? Und was wir tun aus Programmieren, tun wir selbst? Und zu Problemen ist allgemein. Hassen Sie Compiler-Developers? Also, Compiler machen manchmal Annahmen, die für einen normalen Code zutreffen. Nein, ich hasse Compiler-Developers nicht. Ich habe mich entschieden, ein C zu entwickeln. Und die Low-Level-Dinge, die schreibe ich selbst in Assembly. Die Compiler-Entwickler haben nicht die Verpflichtung, uns Kryptografie-Engineers zu betreuen. Ich finde es wäre schön, wenn es eine Option gebe, in die ich sagen könnte, ja, ich will wirklich, wirklich diese Dinge tun und bitte nimm nicht an, weil dieses Zeug im Speicher nach dieser Zeile nicht gelesen wird, dass du es nicht auf Null zurücksetzen musst. Weil ich will diesen Schlüssel wirklich auf Null zurücksetzen. Es gibt Tricks in diesen Compilern, die man ausnutzen kann. Und das ist normalerweise der Weg, den wir gehen, wenn wir einem Compiler wirklich sagen wollen, ja, wir wollen das tun, und zwar genauso. Normalerweise, wenn Peter und ich uns Code anschauen, dann sehen wir, ja, das haben wir es getan. Das ist wahrscheinlich okay. Außer natürlich, wenn es wirklich kritisch ist, dann implementieren wir es in Assembly. Was sind deine Vorschläge dann, wenn du sagst, Leute, sollte deine einzigen Krypto entwickelt? Was sagst du die Leute, wie kann man gucken, wenn da sein Problem gibt? Also, ja. Was man immer tun kann, ist den Assembly Code angucken, ob dort Probleme auftauchen. Die, die ich dir gezeigt habe, keine Branches verwenden, keine Lookups verwenden. Wenn ihr, da machen Compiler keine Fehler. Wenn ihr kein If reinpackt, dann macht der Compiler auch keinen Branch rein. Und wenn ihr keine Multiplikation ins Programm baut, dann macht der Compiler das auch nicht von selbst. Das heißt, wenn man solche Schritte vermeidet, dann ist das eigentlich nicht so ein Problem, Timing-Probleme zu verweiden. Das sollte ich vielleicht nicht sagen, aber es gibt viele nicht wirklich gute Implementationen, die mind. rumgeistern. Und wenn eure besser ist, als die andere, dann ist das ein Schritt nach vorn. Hallo. Was du hat gesagt, ist, wir haben keine Threshold in den Shares. Was passiert, wenn die Ex-Assembly anwenden, hat mehr oder weniger Shares, als wir haben, eigentlich abwattet, ist das eine Polinomie auf der falschen Nebel? Nein, wenn wir zu wenig haben, dann rekonstruiert es das falsche Polinom und nimmt den tiefsten Koeffizienten dieses Polinoms und bricht dann ab. Wenn wir zu viele Anteile haben, dann lassen sich die Gleichungen einfach auflösen. Mehr Anteile sind kein Problem, das funktioniert. Es gibt nur ein Problem, wenn man Shares doppelt hinzufügt, dann wird es mit demselben Fehler abbrechen, wie im ersten Fall, wie bei zu wenigen Shares. Das ist ein Problem, das ich noch nicht lösen konnte, noch nicht in einem guten Nahe weg. Hallo, danke sehr. Wie nahe kommt du, dass dieses Code nutzbar ist? Ich meine... Wie sicher ist das, jetzt zu nutzen? Das ist eine wirklich gefährliche Frage. Wenn ich sage, es ist super sicher, dann benutzen es Leute und wenn ich sage, es ist nicht besonders sicher, dann nutzt es keiner. Also der Aufwand, den ich betrieben habe, ich habe es gemacht. Ich habe es überprüft, indem ich es selbst und andere Kryptografie-Engineere angeschaut haben, die Methode angeprüft haben. Ich will sagen, ich erwarte keine Probleme mit diesem Code und der Weg mit diesen BitSlices-Operatoren, den wir gegangen sind, macht es ziemlich einfach, das richtig zu machen. Vielen Dank. Wir sprechen über Optimisationen, und ich habe über Optimisationen geöffnet, und über diese Frage über Körper. Wenn das ein bisschen weite aus deinem Geheimnis verbreitet, ist das dann nutzbar als ein Problem? Ja, aber... Modularreduktionen sind... Tricky sind gefährlich, in Constantime zu bauen. Was wir machen in modulare Reduktionen, in elektrischen Kurven, dann verwenden wir normalerweise diese eine konditionale Subtration, die wird nur dann gemacht, wenn eine Zahl größer ist als eine andere Primzahl, oder wenn sie ein Overflow produzieren würde während der Subtration. Das kann in Software ziemlich einfach gemacht werden, weil es dort in Constant der Zeit funktioniert. Aber es wird schwieriger, wenn unsere Primzahl nicht während dem Bild der Software gebaut wurde, sondern auch wenn sie nicht regulär ist. Es gibt da diese Primzahl 2,55 minus 19, die wirklich praktisch ist, weil sie sehr einfach reduzierbar ist, weil jede Zahl, die höher ist, kann einfach zum tiefsten Glied getragen und multipliziert werden. Mit anderen Zahlen wird es aber richtig schwierig, weil wir dort eine Multi-Precision-Bibliothek nutzen müssen, und das ging nicht so einfach in Constantime. Wie ihr versteht, die Sicherheit in die ganze Zeuge und die Integrität und Sicherheit von dieses Reckner und ist das möglich, eigentlich eigentlich zu verteilen in dieses Computation? Ich denke, es gibt Grenzwertschämter, in denen man diese Dinge separat berechnen kann. In Shami's Secret Sharing gehen wir davon aus, dass der Computer vom Herausgeber der Zahlen vertrauenswürdig ist. Der muss ja auch das Secret beinhalten. Also wenn er das Secret beinhalten kann, dann kann er auch die Shares beinhalten. Keine weiteren Fragen? Nein. So, dann bitte ein warmer Applaus für Darn Sprenkels. Keine weitere Frage. Wir hören gerade Applaus in dem Saal. Und dann verabschieden Sie auch...