<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kryptographie on kenji.blog</title><link>http://kenji.blog/de/tags/kryptographie/</link><description>Recent content in Kryptographie on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 05 Sep 2026 22:09:22 +0900</lastBuildDate><atom:link href="http://kenji.blog/de/tags/kryptographie/index.xml" rel="self" type="application/rss+xml"/><item><title>[PQC] Das gesamte Bild der Post-Quanten-Kryptographie, der Kryptographie der nächsten Generation im Zeitalter der Quantencomputer</title><link>http://kenji.blog/de/p/post-quantum-cryptography/</link><pubDate>Sat, 05 Sep 2026 22:09:22 +0900</pubDate><guid>http://kenji.blog/de/p/post-quantum-cryptography/</guid><description>&lt;img src="http://kenji.blog/p/post-quantum-cryptography/post_quantum_cryptography_1788613735417.jpg" alt="Featured image of post [PQC] Das gesamte Bild der Post-Quanten-Kryptographie, der Kryptographie der nächsten Generation im Zeitalter der Quantencomputer" />&lt;h2 id="einführung-die-bedrohung-der-kryptographie-durch-quantencomputer">Einführung: Die &amp;ldquo;Bedrohung&amp;rdquo; der Kryptographie durch Quantencomputer
&lt;/h2>&lt;p>Heutzutage wird ein Großteil unserer alltäglichen Kommunikation im Internet – Online-Banking-Zahlungen, das Surfen auf Websites (HTTPS), Nachrichten in Messenger-Apps bis hin zu Blockchain- und Krypto-Asset-Transaktionen – durch eine Technologie namens &amp;ldquo;Public-Key-Kryptographie&amp;rdquo; geschützt. Konkret bilden Algorithmen wie die RSA-Kryptographie und die Elliptische-Kurven-Kryptographie (ECC) die Grundlage für die Zuverlässigkeit unserer modernen digitalen Gesellschaft.&lt;/p>
&lt;p>Diese Verschlüsselungsmethoden basieren auf der Sicherheit mathematischer Probleme, wie der &amp;ldquo;Faktorisierung riesiger Zahlen&amp;rdquo; und dem &amp;ldquo;diskreten Logarithmusproblem&amp;rdquo;, für deren Lösung heutige klassische Computer (einschließlich Supercomputer) astronomisch lange brauchen würden. Wenn jedoch der in den letzten Jahren rasant voranschreitende &lt;strong>Quantencomputer&lt;/strong> in die Praxis umgesetzt wird, wird diese Prämisse grundlegend auf den Kopf gestellt.&lt;/p>
&lt;p>Der &amp;ldquo;Shor-Algorithmus&amp;rdquo;, der 1994 von Peter Shor veröffentlicht wurde, bewies mathematisch, dass ein Quantencomputer mit ausreichender Leistung Probleme wie Faktorisierung und diskrete Logarithmen in extrem kurzer Zeit lösen kann. Das bedeutet das Risiko, dass die kryptographische Kommunikation, die das heutige Internet schützt, in Zukunft vollständig entschlüsselt wird (ein Problem, das als Y2Q: Years to Quantum oder Q-Day bezeichnet wird).&lt;/p>
&lt;p>Noch gravierender ist die Existenz einer Angriffsmethode namens &amp;ldquo;Harvest Now, Decrypt Later&amp;rdquo; (Jetzt Daten stehlen und speichern, später entschlüsseln, wenn die Kryptographie gebrochen werden kann). Daten, die über Jahrzehnte hinweg vertraulich bleiben müssen, wie nationale Geheimnisse, geistiges Eigentum von Unternehmen und persönliche biometrische Informationen, könnten bereits jetzt gestohlen werden mit der Prämisse einer künftigen Entschlüsselung.&lt;/p>
&lt;p>Um auf diese beispiellose Krise zu reagieren, bündeln Kryptographen und Forschungseinrichtungen auf der ganzen Welt ihre Anstrengungen, um eine kryptographische Technologie der nächsten Generation zu entwickeln, die auch gegen Angriffe durch Quantencomputer sicher bleibt: die &lt;strong>Post-Quanten-Kryptographie (PQC)&lt;/strong> . In diesem Artikel erklären wir die Grundlagen der PQC, die Mechanismen wichtiger Algorithmen und die neuesten Trends in der globalen Standardisierung, die vom US-amerikanischen National Institute of Standards and Technology (NIST) vorangetrieben werden.&lt;/p>
&lt;hr>
&lt;h2 id="was-ist-post-quanten-kryptographie-pqc">Was ist Post-Quanten-Kryptographie (PQC)?
&lt;/h2>&lt;p>Post-Quanten-Kryptographie (Post-Quantum Cryptography, PQC) ist ein Sammelbegriff für kryptographische Algorithmen, die so konzipiert sind, dass sie auf bestehenden klassischen Computern laufen und gleichzeitig resistent gegen Angriffe durch zukünftige große Quantencomputer (wie den Shor-Algorithmus) sind.&lt;/p>
&lt;p>Technologien, die oft damit verwechselt werden, sind die &amp;ldquo;Quantenkryptographie (Quantum Cryptography)&amp;rdquo; und die &amp;ldquo;Quantenschlüsselverteilung (QKD)&amp;rdquo;, aber diese verfolgen völlig andere Ansätze. Die Quantenkryptographie (QKD) ist eine hardwarebasierte Technologie, die physikalische Gesetze der Quantenmechanik (wie die Eigenschaft, dass sich der Zustand bei Beobachtung ändert) nutzt, um Abhören auf dem Kommunikationsweg physikalisch unmöglich zu machen. Sie erfordert dedizierte Glasfasern und spezielle Geräte, was zu Herausforderungen hinsichtlich Einführungskosten und Entfernungsbeschränkungen führt.&lt;/p>
&lt;p>Andererseits ist die &lt;strong>PQC eine rein &amp;ldquo;mathematisch&amp;rdquo; basierte, softwarebasierte kryptographische Technologie&lt;/strong> . Daher kann sie als Software-Update in bestehende Internet-Infrastrukturen, Server, Smartphones, Browser usw. integriert werden und zeichnet sich durch eine sehr hohe Anwendbarkeit in der realen Welt aus. Für IT-Unternehmen und Regierungsbehörden weltweit ist es eine dringende Aufgabe, die derzeit verwendeten RSA und ECC durch diese PQC zu ersetzen (zu migrieren).&lt;/p>
&lt;hr>
&lt;h2 id="die-4-wichtigsten-mathematischen-ansätze-der-pqc">Die 4 wichtigsten mathematischen Ansätze der PQC
&lt;/h2>&lt;p>Basierend auf mathematischen Problemen (wie NP-schweren Problemen), die selbst mit Quantencomputern nicht effizient gelöst werden können, wurden verschiedene PQC-Algorithmen vorgeschlagen. Hier stellen wir die vier wichtigsten Kategorien vor, die derzeit im Mainstream sind.&lt;/p>
&lt;h3 id="hauptansätze-der-post-quanten-kryptographie-pqc">Hauptansätze der Post-Quanten-Kryptographie (PQC)
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span> &lt;span class="n">LR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQC&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">Post&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">Quanten&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">Kryptographie&lt;/span> &lt;span class="n">PQC&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">L&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">Gitterbasierte&lt;/span> &lt;span class="n">Kryptographie&lt;/span> &lt;span class="n">Lattice&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">based&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQC&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">H&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">Hash&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">basierte&lt;/span> &lt;span class="n">Kryptographie&lt;/span> &lt;span class="n">Hash&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">based&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQC&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">M&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">Multivariate&lt;/span> &lt;span class="n">Kryptographie&lt;/span> &lt;span class="n">Multivariate&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQC&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">C&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">Codebasierte&lt;/span> &lt;span class="n">Kryptographie&lt;/span> &lt;span class="n">Code&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">based&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">L&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">L1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FIPS&lt;/span> &lt;span class="mi">203&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ML&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">KEM&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">L&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">L2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FIPS&lt;/span> &lt;span class="mi">204&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ML&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">DSA&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">H&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">H1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FIPS&lt;/span> &lt;span class="mi">205&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">SLH&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">DSA&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">style&lt;/span> &lt;span class="n">PQC&lt;/span> &lt;span class="n">fill&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="c1">#f9f,stroke:#333,stroke-width:2px&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="1-gitterbasierte-kryptographie-lattice-based-cryptography">1. Gitterbasierte Kryptographie (Lattice-based Cryptography)
&lt;/h3>&lt;p>Derzeit gilt die &amp;ldquo;gitterbasierte Kryptographie&amp;rdquo; als die vielversprechendste und am weitesten verbreitete Methode im Bereich der PQC. Gitterbasierte Kryptographie stützt ihre Sicherheit auf Probleme im Zusammenhang mit regelmäßig angeordneten Punkten (Gitterpunkten) in vieldimensionalen Räumen. Bekannte Probleme sind das &amp;ldquo;Kürzeste-Vektor-Problem (SVP: Shortest Vector Problem)&amp;rdquo; und das &amp;ldquo;Learning With Errors (LWE)&amp;quot;-Problem.&lt;/p>
&lt;p>&lt;strong>Überblick über die Funktionsweise:&lt;/strong>
Stellen Sie sich unzählige Punkte vor, die in einem gitterartigen Muster in einem Raum mit extrem hoher Dimension (Hunderte bis Tausende von Dimensionen) angeordnet sind. Einen bestimmten Gitterpunkt in zwei oder drei Dimensionen zu finden, ist einfach, aber in Hunderten von Dimensionen wurde noch kein Algorithmus entdeckt, um ihn effizient zu finden, weder mit einem klassischen noch mit einem Quantencomputer. Insbesondere das LWE-Problem nutzt die Eigenschaft, dass &amp;ldquo;wenn man absichtlich ein kleines &amp;lsquo;Rauschen (Fehler)&amp;rsquo; zu einem System linearer Gleichungen hinzufügt, es drastisch schwieriger wird, die ursprünglichen Variablen zu erraten&amp;rdquo;.&lt;/p>
&lt;p>&lt;strong>Vorteile:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Anwendbar sowohl für Schlüsselaustausch (KEM) als auch für digitale Signaturen.&lt;/li>
&lt;li>Sehr schnelle Verarbeitungsgeschwindigkeit (in einigen Fällen schneller als RSA und ECC).&lt;/li>
&lt;li>Gute Balance mit relativ kleinen Schlüssel- und Chiffretextgrößen.&lt;/li>
&lt;/ul>
&lt;p>Viele der derzeit vom NIST standardisierten Algorithmen (wie ML-KEM und ML-DSA) verwenden diese gitterbasierte Kryptographie.&lt;/p>
&lt;h3 id="2-hash-basierte-kryptographie-hash-based-cryptography">2. Hash-basierte Kryptographie (Hash-based Cryptography)
&lt;/h3>&lt;p>Die hashbasierte Kryptographie ist ein auf digitale Signaturen spezialisierter PQC-Algorithmus. Die Grundlage ihrer Sicherheit hängt ausschließlich von der Kollisionsresistenz und Einwegfunktion sicherer &amp;ldquo;kryptographischer Hash-Funktionen&amp;rdquo; wie SHA-2 und SHA-3 ab.&lt;/p>
&lt;p>&lt;strong>Überblick über die Funktionsweise:&lt;/strong>
Der Ausgangspunkt ist ein Einweg-Signaturschema (One-Time-Signatur), das nur einmal verwendet werden kann, genannt &amp;ldquo;Lamport-Signatur&amp;rdquo;. Durch die Bündelung dieser mit einer baumartigen Datenstruktur, dem sogenannten &amp;ldquo;Merkle-Baum&amp;rdquo;, wird es möglich, mehrere Signaturen mit einem einzigen Schlüsselpaar zu erstellen.&lt;/p>
&lt;p>&lt;strong>Vorteile:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Die Sicherheitsgrundlage ist extrem robust, mit einem starken Beweis, dass sie &amp;ldquo;sicher ist, solange die Hash-Funktion sicher ist&amp;rdquo;.&lt;/li>
&lt;li>Da es weniger Abhängigkeit von mathematischen Strukturen gibt, ist das Risiko, eine unerwartete Entschlüsselungsmethode zu finden, gering.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Nachteile:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Kann nicht für den Schlüsselaustausch (KEM) verwendet werden, nur für digitale Signaturen.&lt;/li>
&lt;li>Die Signaturgrößen neigen dazu, groß zu sein.&lt;/li>
&lt;li>Es gibt &amp;ldquo;Zustandsbehaftete (Stateful)&amp;rdquo; und &amp;ldquo;Zustandslose (Stateless)&amp;rdquo; Versionen, wobei stateful (wie XMSS) bei der Implementierung schwierig sind, da die Anzahl der Schlüsselverwendungen streng verwaltet werden muss.&lt;/li>
&lt;/ul>
&lt;p>NIST standardisiert &amp;ldquo;SLH-DSA (ehemals SPHINCS+)&amp;rdquo; als zustandslose hashbasierte Signatur.&lt;/p>
&lt;h3 id="3-multivariate-kryptographie-multivariate-cryptography">3. Multivariate Kryptographie (Multivariate Cryptography)
&lt;/h3>&lt;p>Multivariate Kryptographie basiert auf der Schwierigkeit, Systeme multivariater quadratischer Polynome mit vielen Variablen (MQ-Problem: Multivariate Quadratic problem) zu lösen. Dieses Problem ist bekanntermaßen NP-schwer.&lt;/p>
&lt;p>&lt;strong>Überblick über die Funktionsweise:&lt;/strong>
Der Sender erstellt einen Chiffretext (Signatur), indem er Klartext (oder einen Hash-Wert) in eine komplexe Gleichung mit vielen Variablen einfügt, die als öffentlicher Schlüssel bereitgestellt wird. Der rechtmäßige Empfänger besitzt &amp;ldquo;verborgene Informationen (eine Trapdoor), die die Struktur der Gleichung in eine leicht lösbare Form umwandeln&amp;rdquo; als privaten Schlüssel und verwendet diesen zum Entschlüsseln (oder zur Signaturüberprüfung).&lt;/p>
&lt;p>&lt;strong>Vorteile:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Sehr kleine Signaturgrößen.&lt;/li>
&lt;li>Extrem schnelle Signaturüberprüfung. Geeignet für IoT-Geräte mit begrenzten Ressourcen.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Nachteile:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Die Größe des öffentlichen Schlüssels ist sehr groß (oft von mehreren Dutzend bis Hunderten von Kilobyte).&lt;/li>
&lt;li>Es gibt Fälle in der Vergangenheit, in denen vielversprechende Algorithmen (wie Rainbow) durch klassische Angriffe gebrochen wurden, was es schwieriger macht, Vertrauen in ihre Sicherheit aufzubauen als bei anderen Methoden.&lt;/li>
&lt;/ul>
&lt;h3 id="4-codebasierte-kryptographie-code-based-cryptography">4. Codebasierte Kryptographie (Code-based Cryptography)
&lt;/h3>&lt;p>Die codebasierte Kryptographie wendet die Theorie der &amp;ldquo;Fehlerkorrekturcodes&amp;rdquo;, die zur Korrektur von Fehlern auf Kommunikationswegen verwendet werden, auf die Kryptographie an. Das 1978 vorgeschlagene &amp;ldquo;McEliece-Kryptosystem&amp;rdquo; ist das bekannteste und eines der ältesten in der PQC.&lt;/p>
&lt;p>&lt;strong>Überblick über die Funktionsweise:&lt;/strong>
Der Sender codiert den Klartext unter Verwendung des öffentlichen Schlüssels des Empfängers (eine Generatormatrix eines Fehlerkorrekturcodes mit verborgener spezifischer Struktur) und fügt absichtliche Fehler (Rauschen) hinzu, bevor er ihn sendet. Der Empfänger verwendet den privaten Schlüssel, um die Fehler zu entfernen und den Klartext zu extrahieren. Ein Kryptoanalytiker muss die Fehler aus einem bloßen Zufallscode korrigieren, dessen Struktur er nicht kennt; dies wird als &amp;ldquo;allgemeines Syndrom-Dekodierungsproblem&amp;rdquo; bezeichnet und es ist bewiesen, dass es NP-schwer ist.&lt;/p>
&lt;p>&lt;strong>Vorteile:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Da es seit über 40 Jahren intensiv erforscht wird und bisher keine wirksamen Angriffe gefunden wurden, ist die Zuverlässigkeit seiner Sicherheit extrem hoch.&lt;/li>
&lt;li>Schnelle Verarbeitungsgeschwindigkeiten für Verschlüsselung und Entschlüsselung.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Nachteile:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Die Größe des öffentlichen Schlüssels ist enorm (kann mehrere Megabyte betragen). Daher ist es schwierig, es in Umgebungen mit begrenzter Kommunikationsbandbreite oder Speicherkapazität (wie bei TLS-Handshakes) zu verwenden.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="neueste-entwicklungen-der-pqc-standardisierung-durch-nist">Neueste Entwicklungen der PQC-Standardisierung durch NIST
&lt;/h2>&lt;p>Das US-amerikanische National Institute of Standards and Technology (NIST) rief 2016 weltweit zur Einreichung von Vorschlägen für Post-Quanten-Kryptographie-Algorithmen der nächsten Generation auf und hat über mehrere Jahre hinweg strenge Evaluierungen und Runden durchgeführt.&lt;/p>
&lt;p>Im Jahr 2024 veröffentlichte NIST schließlich die folgenden drei Algorithmen als offizielle Federal Information Processing Standards (FIPS). Damit wurde ein solides Fundament für Organisationen auf der ganzen Welt geschaffen, um mit der Implementierung in Produktionsumgebungen zu beginnen.&lt;/p>
&lt;h3 id="festgelegte-fips-standards-2024">Festgelegte FIPS-Standards (2024)
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>FIPS 203: ML-KEM (früher: CRYSTALS-Kyber)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verwendung:&lt;/strong> Key Encapsulation Mechanism (KEM) / Verschlüsselung &amp;amp; Schlüsselaustausch&lt;/li>
&lt;li>&lt;strong>Basistechnologie:&lt;/strong> Gitterbasierte Kryptographie (Module-LWE)&lt;/li>
&lt;li>&lt;strong>Eigenschaften:&lt;/strong> Hervorragendes Gleichgewicht zwischen Schlüsselgröße und Geschwindigkeit; dient als Standard-PQC-Schlüsselaustausch für allgemeine Internetanwendungen wie Webkommunikation (TLS) und sichere Messaging-Apps.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>FIPS 204: ML-DSA (früher: CRYSTALS-Dilithium)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verwendung:&lt;/strong> Digitale Signatur&lt;/li>
&lt;li>&lt;strong>Basistechnologie:&lt;/strong> Gitterbasierte Kryptographie (Module-LWE)&lt;/li>
&lt;li>&lt;strong>Eigenschaften:&lt;/strong> Der primäre Standard für digitale Signaturen. Es ermöglicht eine effiziente Verarbeitung und wird der neue Standard für alle elektronischen Signaturanwendungen sein, wie z. B. Software-Signaturen und Dokumentenauthentifizierung.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>FIPS 205: SLH-DSA (früher: SPHINCS+)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Verwendung:&lt;/strong> Digitale Signatur&lt;/li>
&lt;li>&lt;strong>Basistechnologie:&lt;/strong> Hash-basierte Kryptographie (zustandslos)&lt;/li>
&lt;li>&lt;strong>Eigenschaften:&lt;/strong> Spielt eine entscheidende Rolle, da es als Backup fungiert, falls in Zukunft Schwachstellen in der gitterbasierten Kryptographie entdeckt werden sollten. Die Signaturgröße ist größer, aber es eignet sich für Anwendungen, die eine langfristige Zuverlässigkeit erfordern.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="das-streben-nach-weiterer-diversität">Das Streben nach weiterer Diversität
&lt;/h3>&lt;p>Während das NIST seinen ersten Standardisierungsprozess abgeschlossen hat, setzt es die Suche nach weiteren Algorithmen fort. Insbesondere weil die Standards derzeit auf &amp;ldquo;Gitterbasierte Kryptographie&amp;rdquo; ausgerichtet sind, wird der Gewährleistung von &lt;strong>kryptographischer Diversität (Crypto Diversity)&lt;/strong> große Bedeutung beigemessen. Codebasierte Kryptographie und andere werden als Backup-Standards für den Schlüsselaustausch evaluiert, und das Fundament der PQC soll in Zukunft noch robuster werden.&lt;/p>
&lt;hr>
&lt;h2 id="übergangsszenarien-zur-pqc-und-herausforderungen-die-bedeutung-der-crypto-agility">Übergangsszenarien zur PQC und Herausforderungen: Die Bedeutung der &amp;ldquo;Crypto-Agility&amp;rdquo;
&lt;/h2>&lt;p>Mit der Veröffentlichung formeller Standards durch das NIST werden Regierungsbehörden, Finanzinstitute und Technologieunternehmen auf der ganzen Welt den Übergang (Migration) vom bestehenden RSA/ECC zur PQC ernsthaft einleiten. Richtlinien von Organisationen wie der NSA (National Security Agency) empfehlen ebenfalls einen baldigen Abschluss der Migration.&lt;/p>
&lt;h3 id="annahme-eines-hybriden-ansatzes">Annahme eines hybriden Ansatzes
&lt;/h3>&lt;p>Da PQC-Algorithmen neu sind, haben sie im Vergleich zur klassischen Kryptographie nicht den &amp;ldquo;Test der Zeit&amp;rdquo; bestanden. Um das Risiko von Fehlern in der Implementierung oder der Entdeckung neuer Angriffsmethoden zu berücksichtigen, wird während der Übergangsphase ein &lt;strong>&amp;ldquo;hybrider Ansatz&amp;rdquo;&lt;/strong> empfohlen. Hierbei wird ein bewährtes bestehendes Kryptosystem (z. B. ECDHE) mit einem neuen PQC (z. B. ML-KEM) für den Schlüsselaustausch kombiniert. Derzeit schreitet die probeweise Einführung dieses Ansatzes in großen Browsern und Cloud-Diensten rasant voran.&lt;/p>
&lt;h3 id="erreichen-von-crypto-agility-kryptographische-agilität">Erreichen von Crypto-Agility (Kryptographische Agilität)
&lt;/h3>&lt;p>Was Unternehmen und Systementwickler in Zukunft am meisten im Auge behalten sollten, ist die Gewährleistung der &lt;strong>&amp;ldquo;Crypto-Agility&amp;rdquo;&lt;/strong> . Eine flexible Architektur, die es ermöglicht, kryptographische Algorithmen schnell auszutauschen und zu aktualisieren, ohne das System anzuhalten, wenn in Zukunft Schwachstellen in einem Algorithmus entdeckt werden oder neue Standards aufkommen, ist unerlässlich.&lt;/p>
&lt;p>Die Erstellung eines Kryptographie-Inventars (CBOM: Cryptography Bill of Materials), um genau zu verstehen, &amp;ldquo;wo&amp;rdquo;, &amp;ldquo;welche Kryptographie&amp;rdquo; und &amp;ldquo;zu welchem Zweck&amp;rdquo; in den eigenen Systemen verwendet wird, ist ein wichtiger erster Schritt in Richtung PQC-Migration.&lt;/p>
&lt;hr>
&lt;h2 id="fazit-vorbereitung-auf-den-kommenden-q-day">Fazit: Vorbereitung auf den kommenden &amp;ldquo;Q-Day&amp;rdquo;
&lt;/h2>&lt;p>Während die Entwicklung von Quantencomputern der Menschheit enorme Vorteile bringen wird, stellt sie gleichzeitig die größte Bedrohung für die kryptographische Sicherheit dar, die die Grundlage unserer derzeitigen digitalen Gesellschaft bildet. Die Post-Quanten-Kryptographie (PQC) ist kein &amp;ldquo;Forschungsthema der fernen Zukunft&amp;rdquo; mehr. Durch den Meilenstein der Veröffentlichung von FIPS-Standards durch das NIST ist die PQC in eine vollwertige Phase der &amp;ldquo;Implementierung und Migration&amp;rdquo; eingetreten.&lt;/p>
&lt;p>In Anbetracht der Bedrohung durch &amp;ldquo;Harvest Now, Decrypt Later&amp;rdquo; ist der Übergang zur PQC eine oberste Priorität, die für jede Organisation, die mit hochsensiblen Daten umgeht, &amp;ldquo;jetzt sofort&amp;rdquo; angegangen werden muss. Lassen Sie uns die Technologie der Kryptographie der nächsten Generation tief verstehen und die Crypto-Agility unserer Systeme erhöhen, um das kommende Quantencomputer-Zeitalter sicher zu meistern.&lt;/p></description></item><item><title>【Komplette Anatomie】Den stärksten Kryptographie-Knack-Algorithmus „GNFS“ in C++ implementieren und verstehen</title><link>http://kenji.blog/de/p/gnfs-cpp-implementation/</link><pubDate>Sat, 05 Sep 2026 13:04:59 +0900</pubDate><guid>http://kenji.blog/de/p/gnfs-cpp-implementation/</guid><description>&lt;img src="http://kenji.blog/p/gnfs-cpp-implementation/gnfs_cpp_blog_eyecatch_1788580949217.jpg" alt="Featured image of post 【Komplette Anatomie】Den stärksten Kryptographie-Knack-Algorithmus „GNFS“ in C++ implementieren und verstehen" />&lt;h1 id="komplette-anatomieden-stärksten-kryptographie-knack-algorithmus-gnfs-in-c-implementieren-und-verstehen">【Komplette Anatomie】Den stärksten Kryptographie-Knack-Algorithmus „GNFS“ in C++ implementieren und verstehen
&lt;/h1>&lt;p>Die &amp;ldquo;RSA-Verschlüsselung&amp;rdquo;, die das heutige Internet grundlegend stützt. Ihre Robustheit beruht auf der mathematischen Überzeugung, dass &amp;ldquo;es für heutige Computer praktisch unmöglich ist, gigantische zusammengesetzte Zahlen in Primfaktoren zu zerlegen&amp;rdquo;.&lt;/p>
&lt;p>Aber die Menschheit hat nie aufgegeben. Gegenwärtig gibt es für klassische Computer (normale Computer, keine Quantencomputer) den ** stärksten und fortschrittlichsten Algorithmus der Menschheit ** zur Durchführung riesiger Primfaktorzerlegungen. Das ist das ** &amp;ldquo;General Number Field Sieve (GNFS, Allgemeines Zahlkörpersieb)&amp;rdquo; **.&lt;/p>
&lt;p>In diesem Artikel werden wir den gesamten Quellcode einer streng modellierten Implementierung der hochmodernen Berechnungslogik von GNFS in C++ (unter Verwendung von &lt;code>boost::multiprecision&lt;/code> für Multipräzisions-Ganzzahlen aus der Boost-Bibliothek) veröffentlichen und die Tiefen der &amp;ldquo;algebraischen Zahlentheorie&amp;rdquo;, die dahinter steckt, gründlich erklären.&lt;/p>
&lt;p>Bitte genießen Sie das Mysterium der Mathematik und die rohe Kraft der Informatik, die es bezwingt, zusammen mit dem Quellcode.&lt;/p>
&lt;hr>
&lt;h2 id="1-gnfs-state-of-the-art-logik-framework-gesamter-quellcode">1. GNFS State-of-the-Art Logik-Framework (Gesamter Quellcode)
&lt;/h2>&lt;p>Zunächst zeigen wir das vollständige Bild der GNFS-C++-Implementierung, die wir diesmal erläutern. Das eigentliche Zahlkörpersieb (wie CADO-NFS) ist ein riesiges verteiltes System, das in die Hunderttausende von Zeilen geht, aber dieser Code extrahiert die ** &amp;ldquo;5 wesentlichen Pipelines (Phasen)&amp;rdquo; ** , die GNFS ausmachen, entwirft sie als Klassen und modelliert sie in einer Minimalkonfiguration, ohne die mathematische Bedeutung zu verlieren.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;span class="lnt">101
&lt;/span>&lt;span class="lnt">102
&lt;/span>&lt;span class="lnt">103
&lt;/span>&lt;span class="lnt">104
&lt;/span>&lt;span class="lnt">105
&lt;/span>&lt;span class="lnt">106
&lt;/span>&lt;span class="lnt">107
&lt;/span>&lt;span class="lnt">108
&lt;/span>&lt;span class="lnt">109
&lt;/span>&lt;span class="lnt">110
&lt;/span>&lt;span class="lnt">111
&lt;/span>&lt;span class="lnt">112
&lt;/span>&lt;span class="lnt">113
&lt;/span>&lt;span class="lnt">114
&lt;/span>&lt;span class="lnt">115
&lt;/span>&lt;span class="lnt">116
&lt;/span>&lt;span class="lnt">117
&lt;/span>&lt;span class="lnt">118
&lt;/span>&lt;span class="lnt">119
&lt;/span>&lt;span class="lnt">120
&lt;/span>&lt;span class="lnt">121
&lt;/span>&lt;span class="lnt">122
&lt;/span>&lt;span class="lnt">123
&lt;/span>&lt;span class="lnt">124
&lt;/span>&lt;span class="lnt">125
&lt;/span>&lt;span class="lnt">126
&lt;/span>&lt;span class="lnt">127
&lt;/span>&lt;span class="lnt">128
&lt;/span>&lt;span class="lnt">129
&lt;/span>&lt;span class="lnt">130
&lt;/span>&lt;span class="lnt">131
&lt;/span>&lt;span class="lnt">132
&lt;/span>&lt;span class="lnt">133
&lt;/span>&lt;span class="lnt">134
&lt;/span>&lt;span class="lnt">135
&lt;/span>&lt;span class="lnt">136
&lt;/span>&lt;span class="lnt">137
&lt;/span>&lt;span class="lnt">138
&lt;/span>&lt;span class="lnt">139
&lt;/span>&lt;span class="lnt">140
&lt;/span>&lt;span class="lnt">141
&lt;/span>&lt;span class="lnt">142
&lt;/span>&lt;span class="lnt">143
&lt;/span>&lt;span class="lnt">144
&lt;/span>&lt;span class="lnt">145
&lt;/span>&lt;span class="lnt">146
&lt;/span>&lt;span class="lnt">147
&lt;/span>&lt;span class="lnt">148
&lt;/span>&lt;span class="lnt">149
&lt;/span>&lt;span class="lnt">150
&lt;/span>&lt;span class="lnt">151
&lt;/span>&lt;span class="lnt">152
&lt;/span>&lt;span class="lnt">153
&lt;/span>&lt;span class="lnt">154
&lt;/span>&lt;span class="lnt">155
&lt;/span>&lt;span class="lnt">156
&lt;/span>&lt;span class="lnt">157
&lt;/span>&lt;span class="lnt">158
&lt;/span>&lt;span class="lnt">159
&lt;/span>&lt;span class="lnt">160
&lt;/span>&lt;span class="lnt">161
&lt;/span>&lt;span class="lnt">162
&lt;/span>&lt;span class="lnt">163
&lt;/span>&lt;span class="lnt">164
&lt;/span>&lt;span class="lnt">165
&lt;/span>&lt;span class="lnt">166
&lt;/span>&lt;span class="lnt">167
&lt;/span>&lt;span class="lnt">168
&lt;/span>&lt;span class="lnt">169
&lt;/span>&lt;span class="lnt">170
&lt;/span>&lt;span class="lnt">171
&lt;/span>&lt;span class="lnt">172
&lt;/span>&lt;span class="lnt">173
&lt;/span>&lt;span class="lnt">174
&lt;/span>&lt;span class="lnt">175
&lt;/span>&lt;span class="lnt">176
&lt;/span>&lt;span class="lnt">177
&lt;/span>&lt;span class="lnt">178
&lt;/span>&lt;span class="lnt">179
&lt;/span>&lt;span class="lnt">180
&lt;/span>&lt;span class="lnt">181
&lt;/span>&lt;span class="lnt">182
&lt;/span>&lt;span class="lnt">183
&lt;/span>&lt;span class="lnt">184
&lt;/span>&lt;span class="lnt">185
&lt;/span>&lt;span class="lnt">186
&lt;/span>&lt;span class="lnt">187
&lt;/span>&lt;span class="lnt">188
&lt;/span>&lt;span class="lnt">189
&lt;/span>&lt;span class="lnt">190
&lt;/span>&lt;span class="lnt">191
&lt;/span>&lt;span class="lnt">192
&lt;/span>&lt;span class="lnt">193
&lt;/span>&lt;span class="lnt">194
&lt;/span>&lt;span class="lnt">195
&lt;/span>&lt;span class="lnt">196
&lt;/span>&lt;span class="lnt">197
&lt;/span>&lt;span class="lnt">198
&lt;/span>&lt;span class="lnt">199
&lt;/span>&lt;span class="lnt">200
&lt;/span>&lt;span class="lnt">201
&lt;/span>&lt;span class="lnt">202
&lt;/span>&lt;span class="lnt">203
&lt;/span>&lt;span class="lnt">204
&lt;/span>&lt;span class="lnt">205
&lt;/span>&lt;span class="lnt">206
&lt;/span>&lt;span class="lnt">207
&lt;/span>&lt;span class="lnt">208
&lt;/span>&lt;span class="lnt">209
&lt;/span>&lt;span class="lnt">210
&lt;/span>&lt;span class="lnt">211
&lt;/span>&lt;span class="lnt">212
&lt;/span>&lt;span class="lnt">213
&lt;/span>&lt;span class="lnt">214
&lt;/span>&lt;span class="lnt">215
&lt;/span>&lt;span class="lnt">216
&lt;/span>&lt;span class="lnt">217
&lt;/span>&lt;span class="lnt">218
&lt;/span>&lt;span class="lnt">219
&lt;/span>&lt;span class="lnt">220
&lt;/span>&lt;span class="lnt">221
&lt;/span>&lt;span class="lnt">222
&lt;/span>&lt;span class="lnt">223
&lt;/span>&lt;span class="lnt">224
&lt;/span>&lt;span class="lnt">225
&lt;/span>&lt;span class="lnt">226
&lt;/span>&lt;span class="lnt">227
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;cmath&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;map&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;set&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;chrono&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;boost/multiprecision/cpp_int.hpp&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Multipräzisions-Ganzzahlen von Boost.Multiprecision verwenden
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">boost&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">multiprecision&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// [SOTA GNFS] General Number Field Sieve (Allgemeines Zahlkörpersieb) State-of-the-Art Logik-Framework
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Dieser Code ist eine strikte Modellierung der 5 Pipelines des hochmodernen GNFS,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// wie es in CADO-NFS usw. verwendet wird, als C++ (Boost) Klassendesign.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">struct&lt;/span> &lt;span class="nc">Relation&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int64_t&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int64_t&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">rational_primes&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">algebraic_primes&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Phase 1: Polynomial Selection (KleinJung Algorithmus)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">PolynomialSelector&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Polynom der algebraischen Seite f(x)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">g&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Polynom der rationalen Seite g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Generierung des Initialpolynoms basierend auf der base-m Entwicklung (tatsächlich wird eine fortgeschrittenere Gitterbasisreduktion LLL verwendet)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 1] Polynomial Selection (Degree &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">degree&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;) starting...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Einfache base-m Entwicklung (Grad d)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// m = N^(1/d)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">N_copy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Einfache Näherung für m (Näherung ohne Verwendung von Boost-Funktionen)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">high&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">low&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">high&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">high&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">low&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">p&lt;/span> &lt;span class="o">*=&lt;/span> &lt;span class="n">mid&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">p&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">low&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">high&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">mid&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">resize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">degree&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">};&lt;/span> &lt;span class="c1">// g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; m = &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">m&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; f(x) = &amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">--&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;x^&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="s">&amp;#34; + &amp;#34;&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">[Phase 1] Complete.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Phase 2: Lattice Sieving (Gittersieb)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Aktuelle GNFS verwenden anstelle des Line Sieve (Liniensieb) das Special-q Lattice Sieving
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// (Spezielles q-Gittersieb) von Franke, Kleinjung et al. als De-facto-Standard.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">LatticeSieve&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">rational_bound&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">algebraic_bound&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">rational_fb&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">uint32_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">algebraic_fb&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LatticeSieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">rb&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">uint32_t&lt;/span> &lt;span class="n">ab&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">rational_bound&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rb&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">algebraic_bound&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ab&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="nf">generate_factor_bases&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 2] Generating Factor Bases (Rational Bound: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">rational_bound&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;, Algebraic Bound: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">algebraic_bound&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;)&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// (Ausgelassen) In Wirklichkeit werden Primzahlen generiert und mit Legendre-Symbolen etc. gefiltert
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">poly&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 2] Special-q Lattice Sieving active...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Mock-Implementierung: Das tatsächliche Gittersieb scannt blockweise Hunderte von GB an Speicherraum,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// ordnet (a, b) Paare Gittern pro spezieller Primzahl q (a = i*q + j*...) zu
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// und führt ein Sieben mit maximaler Cache-Effizienz aus.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Füge zu Demonstrationszwecken eine Dummy-Relation hinzu
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Relation&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">17&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">rational_primes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">r&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">algebraic_primes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">relations&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 2] Found &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; relations.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Phase 3: Filtering (Singularitäten bereinigen und Cliquen zusammenführen)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">Filter&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 3] Filtering Relations...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Singleton removal (Löschen von Relationen mit Primzahlen, die nur einmal vorkommen)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// 2. Clique merging (Zusammenführen von Relationen, um spärliche Matrizen dicht zu machen)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// In der Praxis werden hunderte Millionen von Zeilen mit Union-Find-Algorithmen usw. auf einige Millionen komprimiert.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 3] Matrix size reduced optimally.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Phase 4: Linear Algebra over GF(2) (Block Wiedemann Methode)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">LinearAlgebraGF2&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// In neueren Supercomputer-Umgebungen wird die für verteiltes Rechnen besser geeignete
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Block Wiedemann Methode (Coppersmith-Implementierung) anstelle der Block Lanczos Methode als State-of-the-Art eingesetzt.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 4] Block Wiedemann algorithm over GF(2) starting...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Iteriert das Produkt von spärlichen Matrizen (Sparse Matrix) und Vektoren,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// und findet mehrere Lösungsvektoren (Kerne), für die M * x = 0 mod 2 gilt.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Liste der Abhängigkeiten
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Dummy-Daten
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">push_back&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 4] Found &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; linear dependencies (perfect squares).&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Phase 5: Algebraic Square Root (Algebraische Quadratwurzel)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">AlgebraicSquareRoot&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">dep&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 5] Algebraic Square Root computation...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Berechnung der Quadratwurzel V der rationalen Seite (einfache Ganzzahlarithmetik)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">V&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// V = sqrt( prod(a - bm) ) mod N
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Berechnung der Quadratwurzel gamma der algebraischen Seite (Montgomery&amp;#39;s Methode etc.)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Findet das Element gamma des riesigen algebraischen Körpers O_K und bildet es mit dem Homomorphismus phi auf die reale Welt ab
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Y = phi(gamma) mod N
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">Y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Es wird vorausgesetzt, dass in Phase 2 und 4 Folgen von quadratischen Resten (Quadratic Characters) hinzugefügt wurden,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// um die Hindernisse (Obstructions) der Idealklassengruppe und der Einheitengruppe zu umgehen.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; -&amp;gt; Homomorphism map phi applied.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[Phase 5] Calculating GCD(V - Y, N)...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">V&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// GCD(X-Y, N)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[SUCCESS] Non-trivial factor found: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; Other factor: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">N&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[FAILURE] Trivial solution. Trying next dependency...&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Main Execution Pipeline
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// ============================================================================
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; [SOTA GNFS] General Number Field Sieve Engine (Boost C++) &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;================================================================&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Die gigantische zusammengesetzte Zahl N, die wir in Primfaktoren zerlegen wollen, z. B. RSA-270
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;233108530344407544527637656910680524145619812480305449042948611968495918245135782867888369318577116418213919268572658314913060672626911354027609793166341626693946596196427744273886601876896313468704059066746903123910748277606548649151920812699309766587514735456594993207&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Der Grad des Polynoms (bei mehr als 130 Stellen wird normalerweise Grad 5 bis 6 gewählt)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">degree&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Initialisierung der Pipeline
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span> &lt;span class="n">poly_select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">degree&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LatticeSieve&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10000000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">20000000&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Tatsächliche Schranken (Bounds) liegen bei Dutzenden bis Hunderten von Millionen
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">Filter&lt;/span> &lt;span class="n">filter&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LinearAlgebraGF2&lt;/span> &lt;span class="n">linalg&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">AlgebraicSquareRoot&lt;/span> &lt;span class="n">sqrt_step&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">start_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">high_resolution_clock&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Polynom-Selektion
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">poly_select&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Sieb-Verarbeitung (Sieving)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">generate_factor_bases&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">relations&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">poly_select&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 3. Filterung (Matrixkompression)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">filter&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 4. Lineare Algebra (Nullraum-Suche über GF(2))
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">dependencies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">linalg&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 5. Berechnung der algebraischen Quadratwurzel und GCD
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="k">auto&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="nl">dep&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">dependencies&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sqrt_step&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">relations&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dep&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">auto&lt;/span> &lt;span class="n">end_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">high_resolution_clock&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">now&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">chrono&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">duration&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">double&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">elapsed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">end_time&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start_time&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">[System] SOTA GNFS Pipeline completed in &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">elapsed&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; seconds.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Nun, wie durchbricht dieser Code die kryptographischen Mauern? Wir werden für jede der 5 Phasen die detaillierten Algorithmen und die fortgeschrittene Mathematik verdaulich erklären.&lt;/p>
&lt;hr>
&lt;h2 id="2-das-ultimative-ziel-von-gnfs-x2-equiv-y2-pmod-n">2. Das ultimative Ziel von GNFS: $X^2 \equiv Y^2 \pmod N$
&lt;/h2>&lt;p>Das Ziel von GNFS, wie auch den meisten modernen Algorithmen zur gigantischen Primfaktorzerlegung, ist es, ein nicht-triviales Paar $(X, Y)$ zu finden, das die folgende Kongruenz erfüllt:&lt;/p>
$$X^2 \equiv Y^2 \pmod N$$
&lt;p>Diese Gleichung bedeutet, dass &amp;ldquo;die Reste von $X^2$ und $Y^2$, wenn man sie durch $N$ teilt, gleich sind&amp;rdquo;. Umgeformt ergibt das:
$X^2 - Y^2 \equiv 0 \pmod N$
Das heißt, $(X-Y)(X+Y)$ ist ein Vielfaches von $N$.&lt;/p>
&lt;p>Wenn $X \not\equiv \pm Y \pmod N$ (eine nicht-triviale Lösung) gilt, gibt es zwischen $(X-Y)$ und $N$ einen &amp;ldquo;gemeinsamen Teiler größer als 1 und kleiner als $N$&amp;rdquo;.
Wenn wir hier den Euklidischen Algorithmus anwenden, um ** $\gcd(X-Y, N)$ ** zu berechnen, finden wir die Primfaktoren von $N$ sehr leicht.&lt;/p>
&lt;p>Jedoch ist die Suche nach diesen $X$ und $Y$ wie die Suche nach der Nadel im Heuhaufen. Daher wählt GNFS den genialen Ansatz, ** &amp;ldquo;zwei Welten&amp;rdquo; ** zu erschaffen – die &amp;ldquo;Welt der realen ganzen Zahlen&amp;rdquo; und die &amp;ldquo;Welt der algebraischen Zahlkörper von Polynomen&amp;rdquo; – und die Berechnungen aufzuteilen.&lt;/p>
&lt;hr>
&lt;h2 id="3-phase-1-polynom-selektion-polynomial-selection">3. Phase 1: Polynom-Selektion (Polynomial Selection)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">PolynomialSelector&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">cpp_int&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Berechnung von m = N^(1/d) und base-m Entwicklung
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">degree&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">/=&lt;/span> &lt;span class="n">m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">};&lt;/span> &lt;span class="c1">// g(x) = x - m
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Der erste Schritt von GNFS ist die Schaffung eines &amp;ldquo;magischen Polynoms&amp;rdquo;, um die beiden Welten zu überbrücken.
Für eine riesige Zahl $N$ wählen wir eine ganze Zahl $m$. Normalerweise wählt man $m \approx N^{1/d}$ (im Code wird ein Polynom $d=6$. Grades angenommen).&lt;/p>
&lt;p>Dann entwickeln wir $N$ im $m$-adischen System (Basis $m$) und verwenden die Koeffizienten, um das Polynom $f(x)$ zu konstruieren.
&lt;/p>
$$N = c_d m^d + c_{d-1} m^{d-1} + \dots + c_1 m + c_0$$
$$f(x) = c_d x^d + c_{d-1} x^{d-1} + \dots + c_1 x + c_0$$
&lt;p>Dieses Polynom $f(x)$ hat eine äußerst wichtige Eigenschaft: ** &amp;ldquo;Wenn man $m$ für die Variable $x$ einsetzt, ergibt es genau $N$ ($f(m) = N$)&amp;rdquo; **. Mit anderen Worten, $f(m) \equiv 0 \pmod N$.
Das Polynom der rationalen Seite ist definiert als $g(x) = x - m$.&lt;/p>
&lt;p>Dadurch werden die ** &amp;ldquo;Welt des algebraischen Zahlkörpers $\mathbb{Z}[\alpha]$&amp;rdquo; **, die durch die Wurzel $\alpha$ von $f(x)=0$ beherrscht wird, und die gewöhnliche ** &amp;ldquo;Welt der rationalen Zahlen (ganzen Zahlen) $\mathbb{Z}$&amp;rdquo; ** durch einen Ringhomomorphismus $x \to m$ fest miteinander verbunden.&lt;/p>
&lt;p>In hochmodernen Implementierungen wie CADO-NFS werden Algorithmen wie der KleinJung-Algorithmus oder die LLL-Gitterbasisreduktion verwendet, um monatelang nach dem &amp;ldquo;absolut besten Polynom $f(x)$&amp;rdquo; zu suchen, bei dem die Koeffizienten nicht extrem groß werden und in nachfolgenden Schritten leicht Primzahlen auftreten (Smoothness/Glattigkeit begünstigt wird).&lt;/p>
&lt;hr>
&lt;h2 id="4-phase-2-spezielles-q-gittersieb-special-q-lattice-sieving">4. Phase 2: Spezielles $q$-Gittersieb (Special-q Lattice Sieving)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LatticeSieve&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">sieve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">PolynomialSelector&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">poly&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Ordnet (a, b) Paare Gittern pro spezieller Primzahl q zu
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// und führt ein Sieben mit maximaler Cache-Effizienz aus.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Nachdem die beiden Welten vorbereitet sind, betreten wir den nächsten Schritt: die Suche nach &amp;ldquo;glatten Zahlen&amp;rdquo; (Zahlen, die nur aus kleinen Primfaktoren bestehen) in beiden Welten.
Wir generieren unzählige ganzzahlige Paare $(a, b)$ und berechnen die folgenden zwei Werte:&lt;/p>
&lt;ol>
&lt;li>** Wert auf der rationalen Seite ** : $a - bm$&lt;/li>
&lt;li>** Norm auf der algebraischen Seite ** : $b^d f(a/b)$&lt;/li>
&lt;/ol>
&lt;p>Das Ziel von GNFS ist es, zig bis hunderte Millionen ** &amp;ldquo;Paare (Relationen), bei denen die Werte sowohl der rationalen als auch der algebraischen Seite vollständig in kleine Primfaktoren zerlegt werden können&amp;rdquo; **, zu sammeln.&lt;/p>
&lt;p>In frühen GNFS-Versionen wurde das &amp;ldquo;Liniensieb (Line Sieve)&amp;rdquo; verwendet, bei dem die $(a, b)$ auf der $xy$-Ebene aufgereiht und der Reihe nach durch Primzahlen geteilt wurden. Da dies jedoch auf den Speicher überall verstreut zugriff, traten häufig Cache-Misses auf, was es sehr langsam machte.&lt;/p>
&lt;p>Deshalb verwenden moderne High-End-Codes die Methode des ** &amp;ldquo;Speziellen $q$-Gittersiebs (Special-q Lattice Sieve)&amp;rdquo; **.
Man fixiert eine relativ große Primzahl $q$ und berücksichtigt nur Paare $(a, b)$, für die &amp;ldquo;der algebraische Wert definitiv durch $q$ teilbar ist&amp;rdquo;. Da die Paare $(a, b)$, die diese Bedingung erfüllen, ein &amp;ldquo;Gitter (Lattice)&amp;rdquo; auf der Ebene bilden, ist die Sprungweite der Speicheradressen bei der Berechnung konstant, was perfekt in die L1/L2-Caches der CPUs passt.
Die Einführung dieses Gittersiebs hat die Rechengeschwindigkeit von GNFS dramatisch erhöht.&lt;/p>
&lt;hr>
&lt;h2 id="5-phase-3-filterung-filtering">5. Phase 3: Filterung (Filtering)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Filter&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">reduce_matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Singleton removal (Löschen von Relationen mit Primzahlen, die nur einmal vorkommen)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// 2. Clique merging (Zusammenführen von Relationen, um spärliche Matrizen dicht zu machen)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Computer weltweit haben in Phase 2 über Monate hinweg Hunderte Millionen von Relationen gesammelt. Wenn wir diese jedoch direkt in den nächsten &amp;ldquo;Schritt zum Lösen von Gleichungssystemen (Matrixberechnung)&amp;rdquo; werfen, würde selbst der Speicher eines Supercomputers überlaufen.&lt;/p>
&lt;p>Daher wird ein extrem starker Matrixkompressionsprozess namens ** Filtering (Filterung) ** durchgeführt.&lt;/p>
&lt;ol>
&lt;li>
&lt;p>** Singleton removal (Singularitäten bereinigen) **
Angenommen, eine riesige Primzahl $p$ tritt in Hunderten Millionen Relationen &amp;ldquo;nur ein einziges Mal&amp;rdquo; auf. Da es unser Ziel ist, &amp;ldquo;die Exponenten aller Primzahlen gerade (ein Vielfaches von 2) zu machen&amp;rdquo;, kann eine Primzahl, die nur einmal auftritt, niemals einen geraden Exponenten erreichen.
Daher werden Relationen, die diese Primzahl enthalten, sofort als &amp;ldquo;nutzloser Müll&amp;rdquo; gelöscht (bereinigt). Da dies kettenreaktionsartig passiert, werden die Hunderte Millionen Datenzeilen rasant reduziert.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>** Clique merging (Cliquen zusammenführen) **
Darüber hinaus werden durch die Kombination (Addition) von Relationen, die bestimmte Primzahlen teilen, die Anzahl der Zeilen reduziert und die spärliche (luftige) Matrix dichter gemacht (es wird ein Ansatz ähnlich der Cliquensuche in der Graphentheorie verwendet).&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Durch diese Optimierung wird die gigantische dünnbesetzte Matrix auf eine rechenbare Größe dramatisch komprimiert.&lt;/p>
&lt;hr>
&lt;h2 id="6-phase-4-lineare-algebra-über-gf2-block-wiedemann-methode">6. Phase 4: Lineare Algebra über GF(2) (Block Wiedemann Methode)
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LinearAlgebraGF2&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">solve_nullspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">Relation&lt;/span>&lt;span class="o">&amp;gt;&amp;amp;&lt;/span> &lt;span class="n">relations&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Iteriert das Produkt von spärlichen Matrizen (Sparse Matrix) und Vektoren,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// und findet mehrere Lösungsvektoren (Kerne), für die M * x = 0 mod 2 gilt.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Endlich der Kern des Puzzles.
Wir multiplizieren die gesammelten Relationen miteinander, um nach einer ** &amp;ldquo;Kombination zu suchen, bei der die Exponenten aller Primfaktoren gerade Zahlen werden&amp;rdquo; **.&lt;/p>
&lt;p>Mathematisch gesehen geht es darum, eine riesige Matrix $M$, deren Elemente die Exponenten der Primzahlen (&amp;ldquo;gerade oder ungerade&amp;rdquo;, also 0 oder 1) sind, und einen Vektor $x$, der angibt, welche Relationen verwendet werden, zu verwenden,
um Lösungsvektoren $x$ (Nullraum / Kern) zu finden, für die gilt:
** $M \cdot x \equiv 0 \pmod 2$ **&lt;/p>
&lt;p>Wir müssen ein Gleichungssystem mit einer Matrix von enormer Größe, Millionen von Zeilen × Millionen von Spalten, lösen. Mit der üblichen Gaußschen Elimination wäre die Komplexität $O(N^3)$ und die Berechnung würde nicht enden, bevor das Universum sein Ende findet.&lt;/p>
&lt;p>Daher wird in hochmodernen Implementierungen die ** &amp;ldquo;Block Wiedemann Methode&amp;rdquo; ** verwendet.
Dies ist eine Art Krylov-Unterraum-Methode, die die Tatsache nutzt, dass die Matrix $M$ &amp;ldquo;sehr spärlich (meistens 0)&amp;rdquo; ist, und durch wiederholte Multiplikationen von Matrix und Vektoren eine Lösung ableitet.
Im Gegensatz zur älteren Block-Lanczos-Methode kann die Block-Wiedemann-Methode den Berechnungsprozess vollständig auf mehrere Cluster aufteilen, wodurch sie bei parallelen Berechnungen im modernen verteilten Cloud-Computing oder auf Supercomputern eine überwältigende Leistung erbringt.&lt;/p>
&lt;hr>
&lt;h2 id="7-phase-5-algebraische-quadratwurzel-algebraic-square-root-und-der-zusammenbruch-der-kryptographie">7. Phase 5: Algebraische Quadratwurzel (Algebraic Square Root) und der Zusammenbruch der Kryptographie
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">AlgebraicSquareRoot&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="n">compute_and_factor&lt;/span>&lt;span class="p">(...)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Berechnung der Quadratwurzel V der rationalen Seite
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">V&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Berechnung der Quadratwurzel gamma der algebraischen Seite
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">Y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">cpp_int&lt;/span> &lt;span class="n">factor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gcd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">V&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">Y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">N&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// GCD(X-Y, N)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Durch die Matrixberechnung in Phase 4 haben wir &amp;ldquo;eine Menge von Relationen $S$, die, miteinander multipliziert, für alle Primfaktoren gerade Exponenten ergeben&amp;rdquo;, erhalten.
Damit können wir in beiden Welten, der rationalen und der algebraischen, ein &amp;ldquo;Quadrat&amp;rdquo; konstruieren.&lt;/p>
&lt;p>Auf der rationalen Seite ist es nur eine Multiplikation von ganzen Zahlen, daher ist die Berechnung der Quadratwurzel $V$ einfach.
&lt;/p>
$$V^2 = \prod_{S} (a - bm)$$
&lt;p>** Aber die wahre Hölle liegt auf der &amp;ldquo;algebraischen Seite&amp;rdquo;. **
In der Welt des algebraischen Zahlkörpers $\mathbb{Z}[\alpha]$ gilt die Eindeutigkeit der Primfaktorzerlegung nicht, weshalb wir Ideale für die Berechnung verwendet haben. Die Matrixberechnung hat nur garantiert, dass es ** &amp;ldquo;das Quadrat eines Ideals&amp;rdquo; ** wird, aber ** nicht, dass es &amp;ldquo;das Quadrat eines Elements ($\gamma^2$)&amp;rdquo; wird **.&lt;/p>
&lt;p>Hier stellen sich uns immense Hürden aus der algebraischen Zahlentheorie in den Weg: das &amp;ldquo;Hindernis der Idealklassengruppe&amp;rdquo; und das &amp;ldquo;Hindernis der Einheitengruppe&amp;rdquo;.
Um diese Hürden zu überwinden, nutzt GNFS die Magie der ** &amp;ldquo;Quadratischen Reste (Quadratic Characters)&amp;rdquo; **.
Man fügt der Matrix aus Phase 4 vorab heimlich Spalten mit quadratischen Resten (Legendre-Symbolen) für einige Dutzend spezielle Primideale hinzu. Dadurch überspringt die gefundene Menge $S$ mit überwältigender Wahrscheinlichkeit die Hindernisse und bildet erfolgreich das &amp;ldquo;Quadrat eines echten Elements $\gamma^2$&amp;rdquo;.&lt;/p>
&lt;p>Der Prozess zur Ermittlung von $\gamma$ (die algebraische Quadratwurzel) verwendet hochkomplexe Algorithmen wie die Montgomery-Methode.&lt;/p>
&lt;p>Und schließlich wird die algebraische Quadratwurzel $\gamma$ durch den Ringhomomorphismus $\phi$ in die reale Welt teleportiert ($m$ für $x$ einsetzen), um $Y$ zu erhalten.
Wenn wir das rationale $V$ einfach $X$ nennen, ist die ultimative Gleichung endlich komplett.&lt;/p>
&lt;p>** &lt;/p>
$$X^2 \equiv Y^2 \pmod N$$
&lt;p> **&lt;/p>
&lt;p>Jetzt müssen wir nur noch $\gcd(X-Y, N)$ berechnen. Sobald dieser 0,001-Sekunden-Prozess durchläuft und die nicht-trivialen Faktoren auf dem Bildschirm gedruckt werden, bricht die so unbezwingbar scheinende RSA-Verschlüsselung vollständig zusammen.&lt;/p>
&lt;hr>
&lt;h2 id="fazit">Fazit
&lt;/h2>&lt;p>GNFS ist nicht nur eine Programmiertechnik.
Es ist die Kristallisation der menschlichen Intelligenz, die den &amp;ldquo;Abgrund der reinen Mathematik&amp;rdquo; wie abstrakte Algebra, Ringtheorie und Idealklassengruppen mit der &amp;ldquo;extremen Ingenieurskunst&amp;rdquo; wie der verteilten Architektur von Supercomputern und der Cache-Optimierung bezwungen hat.&lt;/p>
&lt;p>Die Chats oder Kreditkarteninformationen, die wir jeden Tag beiläufig senden, werden durch einen solchen astronomischen mathematischen Schlagabtausch geschützt.&lt;/p>
&lt;p>Ich hoffe, Sie konnten durch dieses C++-Framework die &amp;ldquo;Romantik von Mathematik und Computern&amp;rdquo;, die hinter modernsten kryptoanalytischen Algorithmen steckt, spüren.&lt;/p></description></item><item><title>Die wahre mathematische Struktur des allgemeinen Zahlkörpersiebs (GNFS)</title><link>http://kenji.blog/de/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/</link><pubDate>Sat, 05 Sep 2026 02:26:13 +0900</pubDate><guid>http://kenji.blog/de/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/</guid><description>&lt;img src="http://kenji.blog/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/rsa_encryption_break_1788542156523.jpg" alt="Featured image of post Die wahre mathematische Struktur des allgemeinen Zahlkörpersiebs (GNFS)" />&lt;h1 id="die-wahre-mathematische-struktur-des-allgemeinen-zahlkörpersiebs-gnfs">Die wahre mathematische Struktur des allgemeinen Zahlkörpersiebs (GNFS)
&lt;/h1>&lt;p>Das ultimative Ziel des GNFS ist es, $X, Y$ so zu finden, dass $X^2 \equiv Y^2 \pmod N$ gilt.
Um dies zu erreichen, bauten Mathematiker eine Brücke zwischen der &lt;strong>&amp;ldquo;Welt der reellen ganzen Zahlen&amp;rdquo;&lt;/strong> und der &lt;strong>&amp;ldquo;Welt der algebraischen Zahlkörper&amp;rdquo;&lt;/strong> . Diese Brücke ist der sogenannte &amp;ldquo;Homomorphismus&amp;rdquo;.&lt;/p>
&lt;h2 id="phase-1-die-welten-mit-homomorphismus-verbinden">Phase 1: Die Welten mit &amp;ldquo;Homomorphismus&amp;rdquo; verbinden
&lt;/h2>&lt;h3 id="1-auswahl-des-polynoms-und-definition-der-wurzeln">1. Auswahl des Polynoms und Definition der Wurzeln
&lt;/h3>&lt;p>Für eine riesige zusammengesetzte Zahl $N$ wählen wir eine ganze Zahl $m$ und ein Polynom $f(x)$ so, dass $f(m) \equiv 0 \pmod N$ gilt.
(Beispiel: Wir entwickeln $N$ zur Basis $m$ und bilden $f(x)$ aus den Koeffizienten. Dabei nehmen wir an, dass $f(x)$ über dem Körper der rationalen Zahlen $\mathbb{Q}$ irreduzibel ist (nicht weiter faktorisiert werden kann)).&lt;/p>
&lt;p>Als Nächstes definieren wir eine der &amp;ldquo;komplexen Wurzeln&amp;rdquo; der Gleichung $f(x) = 0$ als $\alpha$.
Natürlich ist $f(\alpha) = 0$. $\alpha$ ist keine ganze Zahl, sondern eine komplexe Zahl, die Wurzeln und imaginäre Zahlen enthält (eine algebraische Zahl).&lt;/p>
&lt;h3 id="2-konstruktion-von-ringen-und-homomorphismus">2. Konstruktion von Ringen und Homomorphismus
&lt;/h3>&lt;p>Hier bereiten wir zwei mathematische &amp;ldquo;Ringe&amp;rdquo; vor (Welten, in denen Addition und Multiplikation definiert sind).&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Welt A: $\mathbb{Z}[\alpha]$&lt;/strong> (Der Ring der algebraischen ganzen Zahlen, der $\alpha$ enthält)
Eine Zahlenwelt in der Form $a + b\alpha + c\alpha^2 + \dots$.&lt;/li>
&lt;li>&lt;strong>Welt B: $\mathbb{Z}/N\mathbb{Z}$&lt;/strong> (Der Ring der Reste modulo $N$)
Eine Kongruenzwelt (Modulo), die nur aus den ganzen Zahlen von $0$ bis $N-1$ besteht.&lt;/li>
&lt;/ul>
&lt;p>Hier definieren wir eine Abbildung $\phi$ von Welt A nach Welt B wie folgt:
&lt;strong>$$\phi : \mathbb{Z}[\alpha] \to \mathbb{Z}/N\mathbb{Z}$$&lt;/strong>
&lt;strong>$$\phi(\alpha) = m \pmod N$$&lt;/strong>&lt;/p>
&lt;p>Diese Abbildung $\phi$ ist eine magische Operation, die exakt die Variable $\alpha$ in Welt A durch die ganze Zahl $m$ in Welt B ersetzt.
Dieses $\phi$ besitzt eine extrem mächtige Eigenschaft, die &lt;strong>&amp;ldquo;Ringhomomorphismus&amp;rdquo;&lt;/strong> genannt wird.
Homomorphismus ist die Eigenschaft, &lt;strong>&amp;ldquo;in eine andere Welt zu teleportieren, ohne die Struktur von Addition und Multiplikation zu zerstören&amp;rdquo;&lt;/strong> . Das heißt, die folgenden Gleichungen sind gültig:&lt;/p>
&lt;ul>
&lt;li>$\phi(X \times Y) = \phi(X) \times \phi(Y)$&lt;/li>
&lt;li>$\phi(X^2) = \phi(X)^2$&lt;/li>
&lt;/ul>
&lt;p>Was bedeutet das? Wenn wir das &lt;strong>&amp;ldquo;Quadrat ($\gamma^2$)&amp;rdquo;&lt;/strong> eines komplexen Elements $\gamma$ in &amp;ldquo;Welt A (der Welt von $\alpha$)&amp;rdquo; erzeugen und es mithilfe von $\phi$ nach &amp;ldquo;Welt B (der Restewelt)&amp;rdquo; teleportieren können, &lt;strong>bleibt die quadratische Form $\phi(\gamma)^2$ perfekt erhalten&lt;/strong> .&lt;/p>
&lt;hr>
&lt;h2 id="phase-2-der-zusammenbruch-der-primfaktorzerlegung-und-die-geburt-der-ideale">Phase 2: Der Zusammenbruch der Primfaktorzerlegung und die Geburt der &amp;ldquo;Ideale&amp;rdquo;
&lt;/h2>&lt;p>In Welt A ($\mathbb{Z}[\alpha]$) wollen wir viele geeignete Elemente $(a - b\alpha)$ sammeln und sie multiplizieren, um ein &amp;ldquo;perfektes Quadrat (Quadratelement)&amp;rdquo; zu erzeugen.
Normalerweise würden wir jedes gesammelte $(a - b\alpha)$ in Primfaktoren zerlegen und sie so kombinieren, dass die Exponenten der Primzahlen alle gerade sind (durch Lösen mit Matrizen), um ein Quadrat zu bilden.&lt;/p>
&lt;p>&lt;strong>Jedoch stellt sich hier die verzweifelte Mauer der Algebra in den Weg.&lt;/strong>
In algebraischen Welten wie $\mathbb{Z}[\alpha]$ &lt;strong>bricht die &amp;ldquo;Eindeutigkeit der Primfaktorzerlegung (jede Zahl kann eindeutig als Produkt von Primzahlen ausgedrückt werden)&amp;rdquo;, die in der Schule gelehrt wird, zusammen&lt;/strong> .&lt;/p>
&lt;p>(Beispiel: In einer bestimmten algebraischen Welt ist $6 = 2 \times 3$, aber gleichzeitig auch $6 = (1+\sqrt{-5}) \times (1-\sqrt{-5})$, und wir wissen nicht mehr, welche die wahren Primzahlen sind)&lt;/p>
&lt;p>Wenn die Faktorzerlegung nicht eindeutig ist, ist das Rätsel &amp;ldquo;Primzahlen zählen, um sie gerade zu machen&amp;rdquo; (die Siebmethode) im Prinzip unmöglich auszuführen.&lt;/p>
&lt;h3 id="die-rettung-durch-kummer-und-dedekind-ideale">Die Rettung durch Kummer und Dedekind: &amp;ldquo;Ideale&amp;rdquo;
&lt;/h3>&lt;p>Was diesen Zusammenbruch rettete, war das Konzept des &lt;strong>&amp;ldquo;Ideals (Ideal: ideale Zahl)&amp;rdquo;&lt;/strong> , das von Mathematikern des 19. Jahrhunderts geschaffen wurde.
Indem man nicht an das Element selbst dachte, sondern an die &amp;ldquo;Menge der Vielfachen (Ideal)&amp;rdquo;, die von diesem Element erzeugt wird, wurde die Primfaktorzerlegung wieder möglich.&lt;/p>
&lt;p>Im Ganzheitsring eines algebraischen Zahlkörpers $\mathcal{O}_K$ (ein vollständigerer Ring, der $\mathbb{Z}[\alpha]$ enthält) ist bewiesen, dass selbst wenn ein Element nicht eindeutig faktorisiert werden kann, &lt;strong>&amp;ldquo;ein Ideal immer eindeutig als Produkt von &amp;lsquo;Primidealen ($\mathfrak{p}$)&amp;rsquo; faktorisiert werden kann&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;p>Daher faktorisieren wir im GNFS nicht das Element $(a - b\alpha)$ selbst, sondern das &lt;strong>von ihm erzeugte Hauptideal $\langle a - b\alpha \rangle$ in Primideale&lt;/strong> .&lt;/p>
&lt;hr>
&lt;h2 id="phase-3-die-norm-und-die-zwei-siebe">Phase 3: Die Norm und die zwei Siebe
&lt;/h2>&lt;p>Woher wissen wir also, in welche Primideale das Ideal $\langle a - b\alpha \rangle$ zerfällt?
Hier verwenden wir eine Funktion namens &lt;strong>&amp;ldquo;Norm&amp;rdquo;&lt;/strong> . Die Norm ist eine Funktion, die komplexe Elemente algebraischer Körper in &amp;ldquo;normale reelle ganze Zahlen $\mathbb{Z}$&amp;rdquo; umwandelt.&lt;/p>
&lt;p>Die Norm des Elements $(a - b\alpha)$ wird durch eine einfache Polynomrechnung $b^d f(a/b)$ gefunden ($d$ ist der Grad von $f(x)$).&lt;/p>
&lt;p>Durch einen algebraischen Satz wissen wir: &lt;strong>&amp;ldquo;Wenn die Norm eines bestimmten Ideals vollständig in kleine Primzahlen zerlegt werden kann (glatt ist), dann kann das ursprüngliche Ideal auch vollständig in kleine Primideale zerlegt werden&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;p>Daher berechnet GNFS für eine große Anzahl von Ganzzahlpaaren $(a, b)$ gleichzeitig die folgenden zwei Werte und sammelt nur die Paare, bei denen beide zu &amp;ldquo;glatten Zahlen (smooth numbers)&amp;rdquo; werden:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Rationales Sieb (Rational Sieve)&lt;/strong> : $a - bm$ (der Wert in der realen Welt)&lt;/li>
&lt;li>&lt;strong>Algebraisches Sieb (Algebraic Sieve)&lt;/strong> : $b^d f(a/b)$ (die Norm in der algebraischen Welt)&lt;/li>
&lt;/ol>
&lt;p>Indem wir zig Millionen Paare $(a, b)$ sammeln, bei denen beide glatt sind, lösen wir die Daten der Primidealzerlegung (wie viele Primideale enthalten sind) als riesige Matrix (lineare Algebra über GF(2)), um eine Menge $S$ von Paaren zu finden, sodass &amp;ldquo;beim Multiplizieren die Exponenten aller Primideale gerade werden&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="phase-4-die-zwei-hindernisse-und-die-idealklassengruppe">Phase 4: Die zwei &amp;ldquo;Hindernisse&amp;rdquo; und die Idealklassengruppe
&lt;/h2>&lt;p>Aus der Matrixberechnung haben wir herausgefunden, dass das Multiplizieren aller Ideale von $(a - b\alpha)$, die zur Menge $S$ gehören, zum Quadrat eines bestimmten Ideals $I$ führt.
&lt;/p>
$$\prod_{S} \langle a - b\alpha \rangle = I^2$$
&lt;p>&lt;strong>Es ist jedoch noch nicht vorbei. Die tiefste und schwierigste mathematische Mauer des GNFS befindet sich hier.&lt;/strong>&lt;/p>
&lt;p>Was wir am Ende wollen, ist nicht das &amp;ldquo;Quadrat eines Ideals&amp;rdquo;, sondern das &lt;strong>&amp;ldquo;Quadrat eines Elements ($\gamma^2$)&amp;rdquo;&lt;/strong> , das wir in die Abbildung $\phi$ einsetzen können.
Nur weil es zum Quadrat eines Ideals wurde, heißt das nicht zwangsläufig, dass das Element selbst ein Quadrat ist. Hier gibt es &lt;strong>zwei starke mathematische Hindernisse (Obstructions)&lt;/strong> .&lt;/p>
&lt;h3 id="hindernis--die-barriere-der-idealklassengruppe-ideal-class-group">Hindernis ①: Die Barriere der Idealklassengruppe (Ideal Class Group)
&lt;/h3>&lt;p>Das Ideal $I$ ist nicht immer ein &amp;ldquo;Ideal, das von einem einzigen Element erzeugt wird (Hauptideal)&amp;rdquo;.
Es ist unmöglich, ein spezifisches Element $\gamma$ aus einem Ideal zu extrahieren, das kein Hauptideal ist.&lt;/p>
&lt;p>Hier kommt das Konzept der &lt;strong>&amp;ldquo;Idealklassengruppe (Class Group, $Cl_K$)&amp;rdquo;&lt;/strong> ins Spiel. Die Idealklassengruppe ist eine Gruppe, die misst, &amp;ldquo;wie viele Ideale in dieser algebraischen Welt existieren, die keine Hauptideale sind (wie sehr die Eindeutigkeit der Primfaktorzerlegung gebrochen ist)&amp;rdquo;.
Selbst wenn $\prod \langle a - b\alpha \rangle$ zu $I^2$ wird, kann es nicht auf das Quadrat eines Elements zurückgeführt werden, wenn $I$ nicht das Identitätselement (Hauptideal) in der Idealklassengruppe ist.&lt;/p>
&lt;h3 id="hindernis--die-barriere-der-einheitengruppe-unit-group">Hindernis ②: Die Barriere der Einheitengruppe (Unit Group)
&lt;/h3>&lt;p>Angenommen, durch Glück wäre $I$ das Hauptideal $\langle \gamma \rangle$.
Dann hätten wir $\prod \langle a - b\alpha \rangle = \langle \gamma^2 \rangle$.
Man könnte denken: &amp;ldquo;Großartig, das Element ist auch ein Quadrat!&amp;rdquo;, aber das ist ein großer Irrtum.&lt;/p>
&lt;p>Dass Ideale (Mengen von Vielfachen) gleich sind, bedeutet nicht, dass die Elemente perfekt gleich sind. Es wird immer eine Abweichung durch eine &lt;strong>&amp;ldquo;Einheit (Unit: eine Zahl, deren Kehrwert ebenfalls eine ganze Zahl ist. Wie 1 oder -1)&amp;rdquo;&lt;/strong> geben.
Mit anderen Worten, die eigentliche Elementgleichung sieht so aus:
&lt;/p>
$$\prod_{S} (a - b\alpha) = u \cdot \gamma^2$$
&lt;p>
($u$ ist ein Element der Einheitengruppe $U_K$)&lt;/p>
&lt;p>Wenn diese Einheit $u$ nicht selbst das Quadrat von etwas ist, kann die linke Seite niemals ein &amp;ldquo;perfektes Quadrat eines Elements&amp;rdquo; werden.&lt;/p>
&lt;hr>
&lt;h2 id="phase-5-adlemans-magie-quadratische-charaktere-quadratic-characters">Phase 5: Adlemans Magie &amp;ldquo;Quadratische Charaktere&amp;rdquo; (Quadratic Characters)
&lt;/h2>&lt;p>Das Hindernis der Idealklassengruppe und das Hindernis der Einheitengruppe. Wie können wir diese beiden überwinden?
Hier kommt die brillante Methode der &lt;strong>&amp;ldquo;Quadratischen Charaktere (Quadratic Characters)&amp;rdquo;&lt;/strong> ins Spiel, die von dem Kryptographen Leonard Adleman (das &amp;ldquo;A&amp;rdquo; von RSA) und anderen eingeführt wurde.&lt;/p>
&lt;p>Um festzustellen, &amp;ldquo;ob ein bestimmtes Element ein perfektes Quadrat im algebraischen Körper ist&amp;rdquo;, verwenden wir die Zahlkörper-Version des Legendre-Symbols (quadratischer Rest).
In dieser riesigen Matrix (dem Rätsel, um die Primidealzählungen gerade zu machen), &lt;strong>fügen wir heimlich ein paar Dutzend zusätzliche Bedingungen (Spalten) hinzu, die besagen: &amp;ldquo;Die quadratischen Charaktere für einige spezielle Primideale $\mathfrak{q}$ müssen ebenfalls alle $1$ (gerade) sein&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;p>Wenn wir eine Menge $S$ finden, die durch die Matrixberechnung sogar diese zusätzliche Bedingungen erfüllt, garantieren tiefe Sätze aus der algebraischen Zahlentheorie, dass &lt;strong>&amp;ldquo;sowohl das Hindernis der Idealklassengruppe als auch das Hindernis der Einheitengruppe mit überwältigender Wahrscheinlichkeit natürlich verschwinden werden&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;p>Damit erhalten wir endlich die wahre Gleichung.
&lt;/p>
$$\prod_{S} (a - b\alpha) = \gamma^2$$
&lt;hr>
&lt;h2 id="letzte-phase-die-verschmelzung-der-welten-und-der-zusammenbruch-der-kryptographie">Letzte Phase: Die Verschmelzung der Welten und der Zusammenbruch der Kryptographie
&lt;/h2>&lt;p>Endlich sind alle Puzzleteile an ihrem Platz.&lt;/p>
&lt;p>&lt;strong>[Elemente in der Welt der algebraischen Körper (Welt A)]&lt;/strong>
$\gamma^2 = \prod (a - b\alpha)$
(Wir verwenden einen Quadratwurzel-Algorithmus, um $\gamma$ zu finden)&lt;/p>
&lt;p>&lt;strong>[Elemente in der realen Welt (Welt der rationalen Zahlen)]&lt;/strong>
$V^2 = \prod (a - bm)$
(Da dies eine einfache Ganzzahlmultiplikation ist, $V$ normal gefunden werden kann)&lt;/p>
&lt;p>Nun ist es Zeit für die magische Brücke, die wir zu Beginn gebaut haben, den &lt;strong>Homomorphismus $\phi$&lt;/strong> .
Wir teleportieren das Element $\gamma$ aus Welt A nach Welt B (die Welt der Reste von $N$) mithilfe von $\phi$ (die Abbildung, bei der wir $\alpha$ durch $m$ ersetzen).
&lt;/p>
$$Y = \phi(\gamma) \pmod N$$
&lt;p>Andererseits bringen wir das in der realen Welt gebaute $V$ direkt in die Restewelt und nennen es $X$.
&lt;/p>
$$X = V \pmod N$$
&lt;p>Aufgrund der &amp;ldquo;strukturerhaltenden&amp;rdquo; Eigenschaft des Homomorphismus bleibt die quadratische Beziehung, die in Welt A galt, in Welt B (der Welt modulo $N$) perfekt erhalten.
Da die ursprünglichen Paare $(a, b)$ außerdem in Entsprechung in den Formen $a - b\alpha$ und $a - bm$ erzeugt wurden, kollidieren diese $X$ und $Y$ in der Welt modulo $N$ und erzeugen die folgende absolute Gleichung:&lt;/p>
&lt;p>&lt;strong>$$X^2 \equiv Y^2 \pmod N$$&lt;/strong>&lt;/p>
&lt;p>Alles, was bleibt, ist zu beten, dass diese $X$ und $Y$ keine trivialen Lösungen ($X \equiv \pm Y$) sind, und
&lt;strong>$\gcd(X - Y, N)$&lt;/strong> zu berechnen.&lt;/p>
&lt;p>Wenn es sich um eine nicht-triviale Lösung handelt, durchläuft der Euklidische Algorithmus sie in 0,001 Sekunden, und die geheimen Primzahlen $p$ und $q$, die das Herzstück der RSA-Kryptographie bilden, werden auf dem Ausgabebildschirm gedruckt.&lt;/p>
&lt;hr>
&lt;p>Dies ist das vollständige Bild des &lt;strong>&amp;ldquo;Allgemeinen Zahlkörpersiebs (GNFS)&amp;rdquo;&lt;/strong> , der Essenz der modernen Mathematik.&lt;/p></description></item><item><title>Was ist das "General Number Field Sieve (GNFS)", die stärkste Mathematik der Menschheit, die die Internetverschlüsselung knackt?</title><link>http://kenji.blog/de/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</link><pubDate>Sat, 05 Sep 2026 02:09:08 +0900</pubDate><guid>http://kenji.blog/de/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/gnfs_two_worlds_1788542142485.jpg" alt="Featured image of post Was ist das "General Number Field Sieve (GNFS)", die stärkste Mathematik der Menschheit, die die Internetverschlüsselung knackt?" />&lt;h1 id="was-ist-das-general-number-field-sieve-gnfs-die-stärkste-mathematik-der-menschheit-die-die-internetverschlüsselung-knackt">Was ist das &amp;ldquo;General Number Field Sieve (GNFS)&amp;rdquo;, die stärkste Mathematik der Menschheit, die die Internetverschlüsselung knackt?
&lt;/h1>&lt;p>Das Internet, das wir jeden Tag nutzen. LINE-Nachrichten, YouTube, Einkaufen auf Amazon – die gesamte Kommunikation wird durch &amp;ldquo;Verschlüsselung&amp;rdquo; geschützt.
Derzeit ist der weltweit am häufigsten verwendete Vertreter die &amp;ldquo;RSA-Verschlüsselung&amp;rdquo;.&lt;/p>
&lt;p>Der Schlüssel zur Verteidigung der RSA-Verschlüsselung ist sehr einfach. Er nutzt die mathematische Eigenschaft, dass ** &amp;ldquo;die Primfaktorzerlegung gigantischer Zahlen selbst von Computern nicht gelöst werden kann&amp;rdquo; ** .
Bei &amp;ldquo;15&amp;rdquo; wissen wir zum Beispiel sofort, dass es &amp;ldquo;3 × 5&amp;rdquo; ist, aber sobald es eine &amp;ldquo;270-stellige Zahl&amp;rdquo; wird, würde es Hunderte von Millionen Jahren dauern, selbst wenn man alle Supercomputer der Welt zusammennimmt, um sie zu lösen.&lt;/p>
&lt;p>Doch die Mathematiker sind nicht stumm geblieben. Um diese undurchdringliche Verschlüsselung zu knacken, hat die Menschheit einen fast magischen Algorithmus (Berechnungsverfahren) namens ** &amp;ldquo;General Number Field Sieve (GNFS)&amp;rdquo; ** erschaffen.&lt;/p>
&lt;p>In diesem Artikel werden wir ohne Fachjargon und nur mit dem Wissen der ** Mittelstufenmathematik (Primfaktorzerlegung, algebraische Ausdrücke, größter gemeinsamer Teiler) ** Schritt für Schritt erklären, wie dieser &amp;ldquo;stärkste Algorithmus der Menschheit&amp;rdquo; die Verschlüsselung knackt!&lt;/p>
&lt;hr>
&lt;h2 id="kapitel-1-das-ziel-der-entschlüsselung-ist-eine-formel-der-9-klasse">Kapitel 1: Das Ziel der Entschlüsselung ist eine &amp;ldquo;Formel der 9. Klasse&amp;rdquo;
&lt;/h2>&lt;p>Der größte Spezialtrick, um der gigantischen Primfaktorzerlegung zu begegnen. Es ist diese Formel, die man in der 9. Klasse lernt:&lt;/p>
&lt;blockquote>
&lt;p>** $X^2 - Y^2 = (X + Y)(X - Y)$ **&lt;/p>
&lt;/blockquote>
&lt;p>Sie denken vielleicht: &amp;ldquo;Ernsthaft, eine so grundlegende Formel kann Verschlüsselung knacken?&amp;rdquo;. Dies ist jedoch der Hauptschlüssel, der alles offenbart.&lt;/p>
&lt;p>Das größte Ziel beim Knacken der Verschlüsselung ist es, für eine riesige Zahl $N$, ** &amp;ldquo;Zahlen ($X$ und $Y$) zu finden, bei denen der Rest bei der Division von $X^2$ und $Y^2$ durch $N$ derselbe ist&amp;rdquo; ** .&lt;/p>
&lt;h3 id="warum-knackt-derselbe-rest-die-verschlüsselung">Warum knackt &amp;ldquo;derselbe Rest&amp;rdquo; die Verschlüsselung?
&lt;/h3>&lt;p>Angenommen, zwei Zahlen, $X^2$ und $Y^2$, haben &amp;ldquo;denselben Rest, wenn sie durch $N$ geteilt werden&amp;rdquo;.
Denselben Rest zu haben bedeutet, dass es eine Regel nach der ** die Subtraktion &amp;ldquo;$X^2 - Y^2$&amp;rdquo; immer genau durch $N$ teilbar ist (ein Vielfaches von $N$ sein wird) ** .&lt;/p>
&lt;p>Nehmen wir hier an, dass die gigantische Zahl $N$, die für die Verschlüsselung verwendet wird, aus der Multiplikation zweier geheimer Primzahlen ($p$ und $q$) besteht ($N = p \times q$).&lt;/p>
&lt;p>Wenn wir $X^2 - Y^2$ faktorisieren, erhalten wir ** $(X - Y)(X + Y)$ ** .
Die Tatsache, dass dies ein Vielfaches von $N$ ist, bedeutet, dass irgendwo in dieser Multiplikation die geheimen Primzahlen $p$ und $q$ verborgen sind.&lt;/p>
&lt;p>Hier geschieht ein Wunder.
Es besteht eine mathematische Wahrscheinlichkeit von ** 50% (der Hälfte) ** , dass die beiden Primzahlen $p$ und $q$ sich in verschiedene Räume trennen: ** &amp;ldquo;$p$ geht in den Raum von $(X - Y)$&amp;rdquo; und &amp;ldquo;$q$ geht in den Raum von $(X + Y)$&amp;rdquo; ** .&lt;/p>
&lt;p>Wenn nur die Primzahl $p$ den Raum von $(X - Y)$ betreten hat, berechnen wir den ** &amp;ldquo;größten gemeinsamen Teiler (das größte gemeinsame Teil)&amp;rdquo; ** von $(X - Y)$ und $N$.&lt;/p>
&lt;ul>
&lt;li>Inhalt von $(X - Y)$ = $p \times$ irgendeine Zahl&lt;/li>
&lt;li>Inhalt von $N$ = $p \times q$
Das einzige gemeinsame Teil ist ** &amp;ldquo;$p$&amp;rdquo; ** !&lt;/li>
&lt;/ul>
&lt;p>Mit anderen Worten, in dem Moment, in dem der größte gemeinsame Teiler berechnet wird, wird die verborgene Primzahl $p$ enthüllt und die Verschlüsselung ist vollständig entschlüsselt. (*Der größte gemeinsame Teiler kann sogar auf einem Smartphone sofort mit dem &amp;ldquo;Euklidischen Algorithmus&amp;rdquo; berechnet werden).&lt;/p>
&lt;p>** 【Kleine Kolumne: Warum das Quadrat? Funktionieren Kubik oder das Doppelte nicht?】 **&lt;/p>
&lt;blockquote>
&lt;p>Bei &amp;ldquo;$2X - 2Y$&amp;rdquo; wird es zu $2(X - Y)$ und es gibt nur einen Raum, sodass Sie die Primzahlen nicht trennen können. Bei &amp;ldquo;$X^3 - Y^3$&amp;rdquo; wird die Größe der Räume unausgewogen und die Berechnung wird unnötig schwer. Um die Primzahlen in zwei zu trennen, ist das &amp;ldquo;Quadrat&amp;rdquo;, das sich wunderbar in zwei Räume aufteilt, am kostengünstigsten.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="kapitel-2-wie-findet-man-x-und-y-das-primzahlkarten-sammelpuzzle">Kapitel 2: Wie findet man X und Y? &amp;ldquo;Das Primzahlkarten-Sammelpuzzle&amp;rdquo;
&lt;/h2>&lt;p>Das Ziel ist klar. Doch selbst wenn wir blind nach &amp;ldquo;$X^2$ und $Y^2$ mit demselben Rest&amp;rdquo; suchen würden, würde das Ende des Universums eintreten, bevor wir sie finden.
Also ließen sich Mathematiker eine geniale Methode namens ** &amp;ldquo;Primzahlkarten-Sammelpuzzle&amp;rdquo; ** einfallen.&lt;/p>
&lt;h3 id="schritt-1-nur-goldstaub-glatte-zahlen-mit-einem-sieb-sammeln">Schritt 1: Nur Goldstaub (glatte Zahlen) mit einem Sieb sammeln
&lt;/h3>&lt;p>Bereiten Sie zunächst eine geeignete Zahl $Z$ vor, quadrieren Sie sie und berechnen Sie den Rest $W$, wenn sie durch $N$ geteilt wird.
(Die Restwelt von $Z^2 = W$)&lt;/p>
&lt;p>Faktorisieren Sie den erhaltenen Rest $W$ in Primzahlen. Hier gilt: Nur wenn ** &amp;ldquo;ein $W$, das nur aus kleinen Primzahlen wie 2, 3, 5, 7 usw. besteht&amp;rdquo; ** , erscheint, behalten Sie diese Gleichung als &amp;ldquo;Gewinnerkarte&amp;rdquo; und werfen Sie sie weg, wenn große Primzahlen beigemischt sind.
Es ist wie das Wegwerfen großer Steine mit einem Sieb in einem Fluss, um nur Goldstaub zu sammeln.&lt;/p>
&lt;h3 id="schritt-2-das-puzzle-um-alles-gerade-zu-machen">Schritt 2: Das Puzzle, um alles &amp;ldquo;gerade&amp;rdquo; zu machen
&lt;/h3>&lt;p>Nehmen wir zum Beispiel an, die folgenden 3 Goldstaubkarten wurden gesammelt.&lt;/p>
&lt;ul>
&lt;li>Karte A: $Z_1^2 = 2^3 \times 3^1$&lt;/li>
&lt;li>Karte B: $Z_2^2 = 2^1 \times 5^1$&lt;/li>
&lt;li>Karte C: $Z_3^2 = 3^1 \times 5^1$&lt;/li>
&lt;/ul>
&lt;p>Lassen Sie uns alle multiplizieren.
Die rechte Seite wird zu $(2^3 \times 3^1) \times (2^1 \times 5^1) \times (3^1 \times 5^1)$,
Und wenn man alles ordnet, wird es zu ** &amp;ldquo;$2^4 \times 3^2 \times 5^2$&amp;rdquo; ** .&lt;/p>
&lt;p>Überraschenderweise wurde die Anzahl der Primzahlen zu &amp;ldquo;4, 2, 2&amp;rdquo;, ** allesamt eine gerade Zahl ** !
Dass alle gerade sind, bedeutet, dass wenn man die Gesamtmenge halbiert, es &amp;ldquo;das Quadrat von etwas&amp;rdquo; sein wird.
Mit anderen Worten, $(2^2 \times 3^1 \times 5^1)^2 = (60)^2$.&lt;/p>
&lt;p>Die linke Seite ist $(Z_1 \times Z_2 \times Z_3)^2$, also sind wir endlich am Ziel:
** $X = (Z_1 \times Z_2 \times Z_3)$ **
** $Y = 60$ **
Das lang ersehnte Paar von &amp;ldquo;$X^2 = Y^2$&amp;rdquo; ist komplett!&lt;/p>
&lt;p>Für Computer ist das Puzzle, zu berechnen, ob die Anzahl der Primzahlen &amp;ldquo;gerade oder ungerade (0 oder 1)&amp;rdquo; ist, etwas, worin sie sehr gut sind, sodass mit dieser Methode $X$ und $Y$ mit hoher Geschwindigkeit gefunden werden können.&lt;/p>
&lt;hr>
&lt;h2 id="kapitel-3-die-mauer-der-verzweiflung">Kapitel 3: Die Mauer der Verzweiflung
&lt;/h2>&lt;p>Jetzt kann jeder Code geknackt werden! &amp;hellip;oder das dachten wir zumindest, aber ein großes Problem tritt auf.
Wenn die Verschlüsselungszahl $N$ bis zu &amp;ldquo;100 Stellen&amp;rdquo; umfasst, kann diese Methode (Quadratisches Sieb genannt) sie lösen, aber wenn $N$ zu &amp;ldquo;200 oder 300 Stellen&amp;rdquo; wird, wird das in der Mitte der Berechnung auftretende $W$ viel zu groß.&lt;/p>
&lt;p>Wenn die Zahlen zu groß werden, tauchen &amp;ldquo;Zahlen, die nur aus kleinen Primzahlen (Goldstaub) bestehen&amp;rdquo;, einfach nicht mehr auf. Es wird schwieriger, als eine Kontaktlinse in der Wüste zu suchen, und die zum Lösen des Puzzles benötigten Karten sammeln sich gar nicht erst an.&lt;/p>
&lt;p>Hier tritt schließlich die ultimative Waffe der Menschheit, das ** &amp;ldquo;General Number Field Sieve (GNFS)&amp;rdquo; ** , auf den Plan.&lt;/p>
&lt;hr>
&lt;h2 id="kapitel-4-die-stärkste-idee-der-menschheit-zwei-welten-zu-erschaffen">Kapitel 4: Die stärkste Idee der Menschheit, &amp;ldquo;Zwei Welten&amp;rdquo; zu erschaffen
&lt;/h2>&lt;p>Die geniale Idee des GNFS ist: ** &amp;ldquo;Die Zahlen werden gigantisch, weil wir nur in der realen Welt rechnen. Lassen Sie uns also eine &amp;lsquo;Hinterwelt&amp;rsquo; mit Polynomen (Buchstabenformeln) erschaffen, um das Gewicht der Berechnung in zwei Hälften zu teilen.&amp;rdquo; **&lt;/p>
&lt;h3 id="die-magie-der-buchstabenformeln">Die Magie der Buchstabenformeln
&lt;/h3>&lt;p>GNFS wandelt die riesige Zahl $N$ unter Verwendung einer Basiszahl $m$ in einen Buchstabenausdruck um.
Wenn zum Beispiel $N=100$ ist, mit $m=4$, dann ist $100 = 4^3 + 2(4^2) + 4$.
Mit dem Buchstaben $x$ machen wir daraus eine Formel (die Hinterwelt): ** $f(x) = x^3 + 2x^2 + x$ ** .&lt;/p>
&lt;p>Das Interessante an dieser Formel ist, dass sie die Eigenschaft hat, ** &amp;ldquo;wenn Sie $x$ durch $m$ ersetzen (4 im obigen Beispiel), können Sie immer zur realen Zahl $N$ zurückkehren&amp;rdquo; ** .&lt;/p>
&lt;h3 id="gleichzeitig-in-2-welten-nach-goldstaub-suchen">Gleichzeitig in 2 Welten nach Goldstaub suchen
&lt;/h3>&lt;p>GNFS erzeugt viele Paare von zufälligen Ganzzahlen $(a, b)$ und führt gleichzeitig die folgenden zwei Berechnungen durch:&lt;/p>
&lt;ol>
&lt;li>** Reale Welt ** : $a - b \times m$&lt;/li>
&lt;li>** Buchstabenwelt ** : Der Wert von $a - b \times x$, berechnet nach den Regeln der Polynome&lt;/li>
&lt;/ol>
&lt;p>Durch die Aufteilung des Problems in zwei Welten verringert sich die Größe (das Gewicht) der verarbeiteten Zahlen drastisch. Es ist, als würde man einen riesigen Felsen in zwei handliche Steine spalten.&lt;/p>
&lt;p>Dann trennen und sammeln Sie mit einem Sieb nur die Wunderpaare $(a, b)$, bei denen ** &amp;ldquo;sowohl in der realen Welt als auch in der Buchstabenwelt beide &amp;rsquo;nur aus kleinen Primzahlen (Goldstaub) bestehen&amp;rsquo;&amp;rdquo; ** . Daher der Name &amp;ldquo;Zahlkörpersieb&amp;rdquo; (Number Field Sieve).&lt;/p>
&lt;h3 id="der-moment-in-dem-die-verschlüsselung-endlich-geknackt-wird">Der Moment, in dem die Verschlüsselung endlich geknackt wird
&lt;/h3>&lt;p>Sobald Dutzende Millionen von &amp;ldquo;Goldstaubkarten&amp;rdquo; aus beiden Welten gesammelt wurden, verwendet der Supercomputer gigantische Matrixberechnungen, um &amp;ldquo;eine Kombination zu finden, bei der die Anzahl der Primzahlen alle gerade ist&amp;rdquo;, genau wie wir es in Kapitel 2 getan haben.&lt;/p>
&lt;p>Sobald die Kombination gefunden ist:&lt;/p>
&lt;ul>
&lt;li>Sei die Quadratzahl in der realen Welt ** $X^2$ **&lt;/li>
&lt;li>Sei die in der Buchstabenwelt erstellte Quadratformel ** $Y(x)^2$ **&lt;/li>
&lt;/ul>
&lt;p>Ersetzen Sie schließlich das $x$ in der Buchstabenformel $Y(x)$ durch $m$, springen Sie in die reale Welt zurück und verbinden Sie sie.
Dann ist, wie durch mathematische Magie, die Bedingung erfüllt, dass ** &amp;ldquo;die Reste von $X^2$ und $Y^2$ gleich sind&amp;rdquo; ** !&lt;/p>
&lt;p>Der Rest besteht, wie in Kapitel 1, lediglich darin, den größten gemeinsamen Teiler von $X - Y$ und $N$ zu berechnen, und die uneinnehmbare RSA-Verschlüsselung wird zusammenbrechen und die geheimen Primzahlen offenbaren.&lt;/p>
&lt;hr>
&lt;h2 id="fazit-die-mathematik-endet-nie">Fazit: Die Mathematik endet nie
&lt;/h2>&lt;p>Sie denken vielleicht: &amp;ldquo;Großartig, mit GNFS kann jede Verschlüsselung geknackt werden!&amp;rdquo;.
Doch auch die RSA-Verschlüsselung hat nicht aufgegeben. Was im heutigen Internet verwendet wird, ist eine monströs gigantische Zahl namens &amp;ldquo;RSA-2048 (ca. 617 Stellen)&amp;rdquo;.&lt;/p>
&lt;p>Obwohl GNFS der stärkste Algorithmus der Menschheit ist, sagt man, dass selbst das Lösen von 270 Stellen (RSA-270) Tausende oder Zehntausende von Jahren dauern würde, selbst wenn man Computer auf der ganzen Welt miteinander verbindet. Vorerst sind unsere LINE- und Bankdaten sicher.&lt;/p>
&lt;p>Aber was wäre, wenn eine ** &amp;ldquo;Magie, um $X$ und $Y$ für jede riesige Zahl sofort zu finden&amp;rdquo; ** , auftauchen würde?
Tatsächlich kommt der ** &amp;ldquo;Quantencomputer (Shor-Algorithmus)&amp;rdquo; ** , der sich derzeit in der Entwicklung befindet, dem am nächsten. Unter Ausnutzung der Wellennatur der Quantenmechanik wurde mathematisch bewiesen, dass es möglich ist, das mühsame Kartensammelpuzzle zu umgehen und die Antwort auf einen Schlag zu finden.&lt;/p>
&lt;p>Ein endloser Kampf des Verstandes zwischen denen, die Verschlüsselung erschaffen (Verteidigung), und denen, die Algorithmen entwickeln, um sie zu knacken (Angriff).
Macht das Wissen, dass die in der Mittelstufe erlernte &amp;ldquo;Primfaktorzerlegung&amp;rdquo; und &amp;ldquo;algebraische Ausdrücke&amp;rdquo; tatsächlich die Waffen sind, die an vorderster Front der globalen Sicherheit kämpfen, den Mathematikunterricht nicht ein wenig interessanter?&lt;/p>
&lt;p>Derjenige, der den stärksten Algorithmus der Zukunft entdeckt, könnten Sie sein, der diesen Artikel liest!&lt;/p>
&lt;hr>
&lt;p>&lt;em>(※Dieser Artikel ist eine konzeptionelle Adaption der mathematischen Faszination des Codeknackens für Schüler. Das eigentliche GNFS wird streng mit Hilfe der fortgeschrittenen Universitätsmathematik, wie Idealklassengruppen algebraischer Zahlkörper und Homomorphismen, berechnet)&lt;/em>&lt;/p></description></item><item><title>Kerckhoffs' Prinzip</title><link>http://kenji.blog/de/p/kerckhoffs-prinzip/</link><pubDate>Wed, 16 Apr 2025 23:53:08 +0900</pubDate><guid>http://kenji.blog/de/p/kerckhoffs-prinzip/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_2.png" alt="Featured image of post Kerckhoffs' Prinzip" />&lt;h1 id="kerckhoffs-prinzip">&amp;ldquo;Kerckhoffs&amp;rsquo; Prinzip&amp;rdquo;
&lt;/h1>&lt;hr>
&lt;p>Hallo!&lt;/p>
&lt;p>Heute möchte ich über etwas sprechen, das ein wenig interessant und tatsächlich extrem wichtig ist, nämlich das &amp;ldquo;Kerckhoffs&amp;rsquo; Prinzip&amp;rdquo;.&lt;/p>
&lt;p>Oh, Moment, Moment.&lt;br>
Einige von euch denken vielleicht: &amp;ldquo;Ich habe noch nie vom &amp;lsquo;Kerckhoffs&amp;rsquo; Prinzip&amp;rsquo; gehört, und es klingt ein wenig technisch&amp;hellip;&amp;rdquo;. Bitte macht euch keine Sorgen. Dieser Artikel ist genau das, was ich Leuten wie euch zum Lesen geben möchte.&lt;/p>
&lt;hr>
&lt;h2 id="was-bedeutet-sichere-kryptographie">Was bedeutet &amp;ldquo;sichere Kryptographie&amp;rdquo;?
&lt;/h2>&lt;p>Angenommen, jemand sagt: &amp;ldquo;Dieser Tresor kann nur von jemandem geöffnet werden, der die geheime Methode zum Öffnen kennt.&amp;rdquo;&lt;/p>
&lt;p>Auf den ersten Blick sieht das sehr sicher aus, oder?&lt;br>
Aber wenn man darüber nachdenkt, ist es nicht ein wenig beunruhigend?&lt;/p>
&lt;p>Etwa: &amp;ldquo;Wenn dieses Geheimnis herauskommt, ist es vorbei?&amp;rdquo;.&lt;/p>
&lt;p>Tatsächlich war dies der Auslöser für das Kerckhoffs&amp;rsquo; Prinzip.&lt;/p>
&lt;hr>
&lt;h2 id="was-genau-ist-das-kerckhoffs-prinzip">Was genau ist das &amp;ldquo;Kerckhoffs&amp;rsquo; Prinzip&amp;rdquo;?
&lt;/h2>&lt;p>Ganz einfach ausgedrückt ist es die Idee, dass&lt;/p>
&lt;p>&lt;strong>&amp;ldquo;Kryptographie sicher sein sollte, selbst wenn ihre Funktionsweise entdeckt wird.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>Genauer gesagt: &amp;ldquo;Die Sicherheit sollte sich nur auf den &amp;lsquo;geheimen Schlüssel&amp;rsquo; stützen, und die Verschlüsselungsmethode selbst darf öffentlich sein!&amp;rdquo;.&lt;/p>
&lt;p>Umgekehrt gilt: &amp;ldquo;Ein Zustand, in dem der Verschlüsselungsalgorithmus (Mechanismus) geheim gehalten wird, gilt als wenig zuverlässig&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="wenn-der-mechanismus-geheim-ist-ist-er-sicher-kann-ein-wenig-gefährlich-sein">&amp;ldquo;Wenn der Mechanismus geheim ist, ist er sicher&amp;rdquo; kann ein wenig gefährlich sein
&lt;/h2>&lt;p>Das ist eine weit verbreitete Denkweise:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Ich habe niemandem das Innere dieser App gezeigt, also ist die Sicherheit in Ordnung&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Ich verstehe das Gefühl.&lt;br>
Aber das ist so, als würde man sagen: &amp;ldquo;Niemand sieht hin, also werden keine Schwachstellen gefunden, oder?&amp;rdquo;.&lt;/p>
&lt;p>In Wirklichkeit kann die Tatsache, dass &amp;ldquo;niemand hinsieht&amp;rdquo;, an sich schon zu einem Risiko werden.&lt;/p>
&lt;hr>
&lt;h2 id="aber-warum-ist-dieses-prinzip-so-wichtig">Aber warum ist dieses Prinzip so wichtig?
&lt;/h2>&lt;p>Denn wenn jemand den Mechanismus in die Hände bekommt und ihn leicht entschlüsseln kann, ist diese Kryptographie am Ende.&lt;/p>
&lt;p>Um einen Vergleich heranzuziehen: Es ist so, als hätte ein Türschloss einen sehr komplexen Mechanismus, könnte aber in Wirklichkeit mit einem Ersatzschlüssel aus dem Ein-Dollar-Laden geöffnet werden.&lt;/p>
&lt;p>Es geht nicht darum, dass &amp;ldquo;der Schlüssel geheim ist, also ist es in Ordnung&amp;rdquo;, sondern dass &amp;ldquo;selbst wenn man den ganzen Mechanismus zeigt, kann er ohne den richtigen Schlüssel nicht geöffnet werden&amp;rdquo;, was wichtig ist.&lt;/p>
&lt;hr>
&lt;h2 id="das-gefühl-aber-ist-das-nicht-ein-bisschen-unheimlich">Das Gefühl &amp;ldquo;Aber ist das nicht ein bisschen unheimlich?&amp;rdquo;
&lt;/h2>&lt;p>Was viele Menschen hier fühlen, ist die Angst,&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Ist es nicht ein bisschen unheimlich, den gesamten Mechanismus offenzulegen?&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Ich verstehe.&lt;br>
Weil man denkt: &amp;ldquo;Wenn ich das ganze Innere zeige, wird es dann nicht nachgeahmt oder für böse Zwecke genutzt?&amp;rdquo;.&lt;/p>
&lt;p>Aber das ist genau der Kern des Kerckhoffs&amp;rsquo; Prinzips.&lt;br>
Die &amp;ldquo;Stärke, die nicht zusammenbricht, selbst wenn das Innere gezeigt wird&amp;rdquo; ist die wahre Sicherheit.&lt;/p>
&lt;hr>
&lt;h2 id="das-gesagt-erfordert-es-am-anfang-ein-wenig-mut">Das gesagt, erfordert es am Anfang ein wenig Mut
&lt;/h2>&lt;p>Aus der Sicht des Entwicklers scheint es, als ob &amp;ldquo;den Mechanismus veröffentlichen = seine Schwächen offenlegen&amp;rdquo; ist, also ist es natürlich nervenaufreibend.&lt;/p>
&lt;p>Aber denken Sie darüber nach.&lt;/p>
&lt;p>Etwas, das man richtig zeigen kann und bei dem man sagen kann: &amp;ldquo;Jeder kann das überprüfen&amp;rdquo;, wird letztendlich vertrauenswürdiger sein.&lt;/p>
&lt;p>Das ist ähnlich wie bei menschlichen Beziehungen.&lt;/p>
&lt;p>&amp;ldquo;Eine Person, die gut mit dir auskommt, nachdem du dein wahres Ich gezeigt hast&amp;rdquo;, ist letztendlich am beruhigendsten.&lt;/p>
&lt;hr>
&lt;h2 id="fazit">Fazit
&lt;/h2>&lt;p>Das Kerckhoffs&amp;rsquo; Prinzip mag etwas theoretisch klingen, aber seine Essenz ist sehr einfach.&lt;/p>
&lt;p>Es geht nur darum, &lt;strong>&amp;ldquo;Lass uns einen Mechanismus erschaffen, der nicht kaputt geht, egal wem du ihn zeigst.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>Richtiges Design anstelle von oberflächlichen Geheimnissen.&lt;br>
Code, für den man sich nicht schämt, ihn zu zeigen, anstelle von Code, den man niemandem zeigen möchte.&lt;/p>
&lt;p>Vielleicht wird diese Art von &amp;ldquo;Stärke&amp;rdquo; in der kommenden Ära noch mehr gebraucht.&lt;/p>
&lt;hr>
&lt;p>Vielen Dank fürs Lesen!&lt;/p>
&lt;p>Sicherheit ist ein etwas schwieriges Thema, aber einige Teile hängen auch mit &amp;ldquo;Beziehungen zu Menschen&amp;rdquo; und &amp;ldquo;alltäglicher Ruhe&amp;rdquo; zusammen.&lt;br>
Wenn man Stück für Stück lernt, ohne sich überfordert zu fühlen, werden sicher gute Dinge passieren.&lt;/p>
&lt;hr>
&lt;p>&lt;img src="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img.png"
width="189"
height="282"
srcset="http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_hu715032b7fe5224f655ebb7d29b676305_77325_480x0_resize_box_3.png 480w, http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_hu715032b7fe5224f655ebb7d29b676305_77325_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="Auguste Kerckhoffs"
class="gallery-image"
data-flex-grow="67"
data-flex-basis="160px"
>&lt;/p></description></item></channel></rss>