{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "title"
   },
   "source": "# 🔐 Post-Quantum Cryptography (PQC)\n## Qiskit ile Uygulamalı Uçtan Uca Öğrenci Notebook’u\n\n**Hedef:** Kuantum bilgisayarların mevcut kriptografiyi nasıl tehdit ettiğini görmek ve post-quantum çözümlere geçiş mantığını anlamak.\n\n| Bölüm | İçerik |\n|-------|--------|\n| 1 | Kurulum |\n| 2 | Tehdit modeli: Shor & Grover |\n| 3 | Klasik RSA (küçük örnek) |\n| 4 | Shor algoritması ile çarpanlara ayırma (Qiskit) |\n| 5 | Grover ve simetrik anahtarlar |\n| 6 | NIST PQC standartları (Kyber, Dilithium, SPHINCS+) |\n| 7 | Uygulamalı PQC: hash / lattice oyuncak örnekleri |\n| 8 | Geçiş stratejisi (hybrid crypto) |\n| 9 | Özet ve ödevler |\n\n> Bu notebook **eğitim amaçlıdır**. Gerçek güvenlik için NIST onaylı kütüphaneler (liboqs, PQClean, OpenSSL 3.x PQC) kullanın.\n",
   "id": "title"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "section1"
   },
   "source": "## 1. Ortam Kurulumu\n",
   "id": "section1"
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "id": "setup",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331015221,
     "user_tz": -180,
     "elapsed": 45318,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "421ab998-d18f-4332-fbda-eb236688cb14"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Python: 3.12.13\n",
      "Mounted at /content/drive\n",
      "\n",
      "📦 Paketler kuruluyor...\n",
      "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m20.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
      "\u001b[?25h✅ Kurulum tamamlandı.\n"
     ]
    }
   ],
   "source": "import sys\nprint(f\"Python: {sys.version.split()[0]}\")\n\ntry:\n    from google.colab import drive\n    drive.mount(\"/content/drive\")\nexcept Exception as e:\n    print(f\"Drive atlandı: {e}\")\n\nprint(\"\\n📦 Paketler kuruluyor...\")\n!pip install -q --upgrade pip\n!pip install -q qiskit qiskit-aer qiskit-algorithms\n!pip install -q numpy matplotlib pycryptodome\n\nprint(\"✅ Kurulum tamamlandı.\")\n",
   "id": "setup"
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "imports",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331015917,
     "user_tz": -180,
     "elapsed": 499,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "a017bdc3-45bf-4311-e647-68d95ef38a15"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "✅ Kütüphaneler yüklendi.\n"
     ]
    }
   ],
   "source": "import numpy as np\nimport matplotlib.pyplot as plt\nfrom math import gcd, log2\nfrom fractions import Fraction\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\nfrom qiskit import QuantumCircuit, transpile\nfrom qiskit_aer import AerSimulator\nfrom qiskit.visualization import plot_histogram\n\nprint(\"✅ Kütüphaneler yüklendi.\")\n",
   "id": "imports"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "section2"
   },
   "source": "## 2. Tehdit Modeli: Neden Post-Quantum?\n\n### Kuantum bilgisayarların kriptografiye etkisi\n\n| Algoritma | Klasik güvenlik | Kuantum tehdidi | Etki |\n|-----------|-----------------|-----------------|------|\n| **RSA, DH, ECC** | Büyük sayı çarpanlara ayırma / diskret log zor | **Shor algoritması** polinom zamanda çözer | **Kırılır** |\n| **AES-128** | $2^{128}$ kaba kuvvet | **Grover** → ~$2^{64}$ | Anahtar boyutu artmalı (AES-256) |\n| **SHA-256** | Çarpışma ~$2^{128}$ | Grover benzeri hızlanma | Daha uzun özet / farklı tasarım |\n\n**PQC (Post-Quantum Cryptography):**  \nKlasik bilgisayarlarda çalışan, ama **kuantum saldırılarına da dayanıklı** olduğu düşünülen kriptografik algoritmalar.\n\nNIST (2024+) standardize etti:\n- **ML-KEM (Kyber)** → anahtar kapsülleme (KEM)\n- **ML-DSA (Dilithium)** → dijital imza\n- **SLH-DSA (SPHINCS+)** → hash tabanlı imza\n- **FN-DSA (Falcon)** → ek imza standardı\n",
   "id": "section2"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "section3"
   },
   "source": "## 3. Klasik RSA – Küçük Örnek\n\nRSA güvenliği $N = p \\cdot q$ çarpanlara ayırmanın zorluğuna dayanır.  \nKüçük $N$ ile adımları görelim; sonra Shor ile aynı $N$’yi “kıracağız”.\n",
   "id": "section3"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "rsa_demo",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331016465,
     "user_tz": -180,
     "elapsed": 399,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "52e105f4-f3c7-48fc-bde1-e0195b869ca2"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "p=3, q=11\n",
      "N = p*q = 33\n",
      "φ(N) = 20\n",
      "Public key  (e, N) = (3, 33)\n",
      "Private key (d, N) = (7, 33)\n",
      "\n",
      "Mesaj=7 → Şifreli=13 → Çözülen=7\n",
      "Çarpanlar gizli kalırsa RSA güvende; bulunurssa d hesaplanır ve sistem kırılır.\n"
     ]
    }
   ],
   "source": "# --- Mini RSA ---\np, q = 3, 11          # gerçekte yüzlerce bit\nN = p * q             # 33\nphi = (p - 1) * (q - 1)\ne = 3                 # public exponent (gcd(e, phi)=1)\n# private d: e*d ≡ 1 (mod phi)\nd = pow(e, -1, phi)\n\nprint(f\"p={p}, q={q}\")\nprint(f\"N = p*q = {N}\")\nprint(f\"φ(N) = {phi}\")\nprint(f\"Public key  (e, N) = ({e}, {N})\")\nprint(f\"Private key (d, N) = ({d}, {N})\")\n\n# Şifrele / çöz\nmessage = 7\ncipher = pow(message, e, N)\nplain  = pow(cipher, d, N)\nprint(f\"\\nMesaj={message} → Şifreli={cipher} → Çözülen={plain}\")\nprint(\"Çarpanlar gizli kalırsa RSA güvende; bulunurssa d hesaplanır ve sistem kırılır.\")\n",
   "id": "rsa_demo"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "section4"
   },
   "source": "## 4. Shor Algoritması ile Çarpanlara Ayırma (Qiskit)\n\n**Fikir (özet):**\n1. Rastgele $a$ seç ($1 < a < N$, $\\gcd(a,N)=1$)\n2. Periyot bul: $a^r \\equiv 1 \\pmod{N}$ olacak en küçük $r$ (order)\n3. $r$ çiftse ve uygun koşullar sağlanıyorsa:\n   - $p = \\gcd(a^{r/2}-1, N)$\n   - $q = \\gcd(a^{r/2}+1, N)$\n\nKuantum kısım **period finding** (faz tahmini + QFT).  \nAşağıda eğitim için **N=15** (bilinen en küçük anlamlı örnek) kullanıyoruz.\n",
   "id": "section4"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "shor_circuit",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 861
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331017120,
     "user_tz": -180,
     "elapsed": 649,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "d7d63395-d26e-419c-8357-6303929bd274"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Shor period-finding devresi: a=7, N=15\n",
      "Qubit: 12, Depth (approx): 11\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "      ┌───┐                                                                                                            »\n",
       " q_0: ┤ H ├───────■────────────────────────────────────────────────────────────────────────────────────────────────────»\n",
       "      ├───┤       │                                                                                                    »\n",
       " q_1: ┤ H ├───────┼──────────────■─────────────────────────────────────────────────────────────────────────────────────»\n",
       "      ├───┤       │              │                                                                                     »\n",
       " q_2: ┤ H ├───────┼──────────────┼──────────────■──────────────────────────────────────────────────────────────────────»\n",
       "      ├───┤       │              │              │                                                                      »\n",
       " q_3: ┤ H ├───────┼──────────────┼──────────────┼──────────────■───────────────────────────────────────────────────────»\n",
       "      ├───┤       │              │              │              │                                                       »\n",
       " q_4: ┤ H ├───────┼──────────────┼──────────────┼──────────────┼──────────────■────────────────────────────────────────»\n",
       "      ├───┤       │              │              │              │              │                                        »\n",
       " q_5: ┤ H ├───────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────────■────────────────────────»\n",
       "      ├───┤       │              │              │              │              │               │                        »\n",
       " q_6: ┤ H ├───────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────────┼───────────────■────────»\n",
       "      ├───┤       │              │              │              │              │               │               │        »\n",
       " q_7: ┤ H ├───────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────────┼───────────────┼────────»\n",
       "      ├───┤┌──────┴──────┐┌──────┴──────┐┌──────┴──────┐┌──────┴──────┐┌──────┴───────┐┌──────┴───────┐┌──────┴───────┐»\n",
       " q_8: ┤ X ├┤0            ├┤0            ├┤0            ├┤0            ├┤0             ├┤0             ├┤0             ├»\n",
       "      └───┘│             ││             ││             ││             ││              ││              ││              │»\n",
       " q_9: ─────┤1            ├┤1            ├┤1            ├┤1            ├┤1             ├┤1             ├┤1             ├»\n",
       "           │  7^1 mod 15 ││  7^2 mod 15 ││  7^4 mod 15 ││  7^8 mod 15 ││  7^16 mod 15 ││  7^32 mod 15 ││  7^64 mod 15 │»\n",
       "q_10: ─────┤2            ├┤2            ├┤2            ├┤2            ├┤2             ├┤2             ├┤2             ├»\n",
       "           │             ││             ││             ││             ││              ││              ││              │»\n",
       "q_11: ─────┤3            ├┤3            ├┤3            ├┤3            ├┤3             ├┤3             ├┤3             ├»\n",
       "           └─────────────┘└─────────────┘└─────────────┘└─────────────┘└──────────────┘└──────────────┘└──────────────┘»\n",
       " c: 8/═════════════════════════════════════════════════════════════════════════════════════════════════════════════════»\n",
       "                                                                                                                       »\n",
       "«                       ┌───────┐┌─┐                     \n",
       "« q_0: ─────────────────┤0      ├┤M├─────────────────────\n",
       "«                       │       │└╥┘┌─┐                  \n",
       "« q_1: ─────────────────┤1      ├─╫─┤M├──────────────────\n",
       "«                       │       │ ║ └╥┘┌─┐               \n",
       "« q_2: ─────────────────┤2      ├─╫──╫─┤M├───────────────\n",
       "«                       │       │ ║  ║ └╥┘┌─┐            \n",
       "« q_3: ─────────────────┤3      ├─╫──╫──╫─┤M├────────────\n",
       "«                       │  QFT† │ ║  ║  ║ └╥┘┌─┐         \n",
       "« q_4: ─────────────────┤4      ├─╫──╫──╫──╫─┤M├─────────\n",
       "«                       │       │ ║  ║  ║  ║ └╥┘┌─┐      \n",
       "« q_5: ─────────────────┤5      ├─╫──╫──╫──╫──╫─┤M├──────\n",
       "«                       │       │ ║  ║  ║  ║  ║ └╥┘┌─┐   \n",
       "« q_6: ─────────────────┤6      ├─╫──╫──╫──╫──╫──╫─┤M├───\n",
       "«                       │       │ ║  ║  ║  ║  ║  ║ └╥┘┌─┐\n",
       "« q_7: ────────■────────┤7      ├─╫──╫──╫──╫──╫──╫──╫─┤M├\n",
       "«      ┌───────┴───────┐└───────┘ ║  ║  ║  ║  ║  ║  ║ └╥┘\n",
       "« q_8: ┤0              ├──────────╫──╫──╫──╫──╫──╫──╫──╫─\n",
       "«      │               │          ║  ║  ║  ║  ║  ║  ║  ║ \n",
       "« q_9: ┤1              ├──────────╫──╫──╫──╫──╫──╫──╫──╫─\n",
       "«      │  7^128 mod 15 │          ║  ║  ║  ║  ║  ║  ║  ║ \n",
       "«q_10: ┤2              ├──────────╫──╫──╫──╫──╫──╫──╫──╫─\n",
       "«      │               │          ║  ║  ║  ║  ║  ║  ║  ║ \n",
       "«q_11: ┤3              ├──────────╫──╫──╫──╫──╫──╫──╫──╫─\n",
       "«      └───────────────┘          ║  ║  ║  ║  ║  ║  ║  ║ \n",
       "« c: 8/═══════════════════════════╩══╩══╩══╩══╩══╩══╩══╩═\n",
       "«                                 0  1  2  3  4  5  6  7 "
      ],
      "text/html": [
       "<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\">      ┌───┐                                                                                                            »\n",
       " q_0: ┤ H ├───────■────────────────────────────────────────────────────────────────────────────────────────────────────»\n",
       "      ├───┤       │                                                                                                    »\n",
       " q_1: ┤ H ├───────┼──────────────■─────────────────────────────────────────────────────────────────────────────────────»\n",
       "      ├───┤       │              │                                                                                     »\n",
       " q_2: ┤ H ├───────┼──────────────┼──────────────■──────────────────────────────────────────────────────────────────────»\n",
       "      ├───┤       │              │              │                                                                      »\n",
       " q_3: ┤ H ├───────┼──────────────┼──────────────┼──────────────■───────────────────────────────────────────────────────»\n",
       "      ├───┤       │              │              │              │                                                       »\n",
       " q_4: ┤ H ├───────┼──────────────┼──────────────┼──────────────┼──────────────■────────────────────────────────────────»\n",
       "      ├───┤       │              │              │              │              │                                        »\n",
       " q_5: ┤ H ├───────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────────■────────────────────────»\n",
       "      ├───┤       │              │              │              │              │               │                        »\n",
       " q_6: ┤ H ├───────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────────┼───────────────■────────»\n",
       "      ├───┤       │              │              │              │              │               │               │        »\n",
       " q_7: ┤ H ├───────┼──────────────┼──────────────┼──────────────┼──────────────┼───────────────┼───────────────┼────────»\n",
       "      ├───┤┌──────┴──────┐┌──────┴──────┐┌──────┴──────┐┌──────┴──────┐┌──────┴───────┐┌──────┴───────┐┌──────┴───────┐»\n",
       " q_8: ┤ X ├┤0            ├┤0            ├┤0            ├┤0            ├┤0             ├┤0             ├┤0             ├»\n",
       "      └───┘│             ││             ││             ││             ││              ││              ││              │»\n",
       " q_9: ─────┤1            ├┤1            ├┤1            ├┤1            ├┤1             ├┤1             ├┤1             ├»\n",
       "           │  7^1 mod 15 ││  7^2 mod 15 ││  7^4 mod 15 ││  7^8 mod 15 ││  7^16 mod 15 ││  7^32 mod 15 ││  7^64 mod 15 │»\n",
       "q_10: ─────┤2            ├┤2            ├┤2            ├┤2            ├┤2             ├┤2             ├┤2             ├»\n",
       "           │             ││             ││             ││             ││              ││              ││              │»\n",
       "q_11: ─────┤3            ├┤3            ├┤3            ├┤3            ├┤3             ├┤3             ├┤3             ├»\n",
       "           └─────────────┘└─────────────┘└─────────────┘└─────────────┘└──────────────┘└──────────────┘└──────────────┘»\n",
       " c: 8/═════════════════════════════════════════════════════════════════════════════════════════════════════════════════»\n",
       "                                                                                                                       »\n",
       "«                       ┌───────┐┌─┐                     \n",
       "« q_0: ─────────────────┤0      ├┤M├─────────────────────\n",
       "«                       │       │└╥┘┌─┐                  \n",
       "« q_1: ─────────────────┤1      ├─╫─┤M├──────────────────\n",
       "«                       │       │ ║ └╥┘┌─┐               \n",
       "« q_2: ─────────────────┤2      ├─╫──╫─┤M├───────────────\n",
       "«                       │       │ ║  ║ └╥┘┌─┐            \n",
       "« q_3: ─────────────────┤3      ├─╫──╫──╫─┤M├────────────\n",
       "«                       │  QFT† │ ║  ║  ║ └╥┘┌─┐         \n",
       "« q_4: ─────────────────┤4      ├─╫──╫──╫──╫─┤M├─────────\n",
       "«                       │       │ ║  ║  ║  ║ └╥┘┌─┐      \n",
       "« q_5: ─────────────────┤5      ├─╫──╫──╫──╫──╫─┤M├──────\n",
       "«                       │       │ ║  ║  ║  ║  ║ └╥┘┌─┐   \n",
       "« q_6: ─────────────────┤6      ├─╫──╫──╫──╫──╫──╫─┤M├───\n",
       "«                       │       │ ║  ║  ║  ║  ║  ║ └╥┘┌─┐\n",
       "« q_7: ────────■────────┤7      ├─╫──╫──╫──╫──╫──╫──╫─┤M├\n",
       "«      ┌───────┴───────┐└───────┘ ║  ║  ║  ║  ║  ║  ║ └╥┘\n",
       "« q_8: ┤0              ├──────────╫──╫──╫──╫──╫──╫──╫──╫─\n",
       "«      │               │          ║  ║  ║  ║  ║  ║  ║  ║ \n",
       "« q_9: ┤1              ├──────────╫──╫──╫──╫──╫──╫──╫──╫─\n",
       "«      │  7^128 mod 15 │          ║  ║  ║  ║  ║  ║  ║  ║ \n",
       "«q_10: ┤2              ├──────────╫──╫──╫──╫──╫──╫──╫──╫─\n",
       "«      │               │          ║  ║  ║  ║  ║  ║  ║  ║ \n",
       "«q_11: ┤3              ├──────────╫──╫──╫──╫──╫──╫──╫──╫─\n",
       "«      └───────────────┘          ║  ║  ║  ║  ║  ║  ║  ║ \n",
       "« c: 8/═══════════════════════════╩══╩══╩══╩══╩══╩══╩══╩═\n",
       "«                                 0  1  2  3  4  5  6  7 </pre>"
      ]
     },
     "metadata": {},
     "execution_count": 4
    }
   ],
   "source": "def c_amod15(a, power):\n    \"\"\"a^power mod 15 için kontrollü çarpma (derste kullanılan standart devre).\"\"\"\n    if a not in [2, 4, 7, 8, 11, 13]:\n        raise ValueError(\"'a' must be 2,4,7,8,11,13\")\n    U = QuantumCircuit(4)\n    for _ in range(power):\n        if a in [2, 13]:\n            U.swap(2, 3); U.swap(1, 2); U.swap(0, 1)\n        if a in [7, 8]:\n            U.swap(0, 1); U.swap(1, 2); U.swap(2, 3)\n        if a in [4, 11]:\n            U.swap(1, 3); U.swap(0, 2)\n        if a in [7, 11, 13]:\n            for q in range(4):\n                U.x(q)\n    U = U.to_gate()\n    U.name = f\"{a}^{power} mod 15\"\n    cU = U.control()\n    return cU\n\n\ndef qft_dagger(n):\n    \"\"\"Ters Quantum Fourier Transform.\"\"\"\n    qc = QuantumCircuit(n)\n    for q in range(n // 2):\n        qc.swap(q, n - q - 1)\n    for j in range(n):\n        for m in range(j):\n            qc.cp(-np.pi / float(2 ** (j - m)), m, j)\n        qc.h(j)\n    qc.name = \"QFT†\"\n    return qc\n\n\ndef shor_period_circuit(a, n_count=8):\n    \"\"\"Period finding devresi: counting + target register.\"\"\"\n    qc = QuantumCircuit(n_count + 4, n_count)\n    for q in range(n_count):\n        qc.h(q)\n    qc.x(n_count)  # target |1>\n    for q in range(n_count):\n        qc.append(c_amod15(a, 2 ** q), [q] + [i + n_count for i in range(4)])\n    qc.append(qft_dagger(n_count), range(n_count))\n    qc.measure(range(n_count), range(n_count))\n    return qc\n\n\n# Demo: a=7, N=15\na = 7\nN = 15\nn_count = 8\nqc = shor_period_circuit(a, n_count)\nprint(f\"Shor period-finding devresi: a={a}, N={N}\")\nprint(f\"Qubit: {qc.num_qubits}, Depth (approx): {qc.depth()}\")\nqc.draw(output=\"text\", fold=120)\n",
   "id": "shor_circuit"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "shor_run",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331017870,
     "user_tz": -180,
     "elapsed": 608,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "50847616-0ab6-46cf-b5d4-f72e375d9418"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Ölçüm sonuçları (en sık 10):\n",
      "  10000000 : 261\n",
      "  00000000 : 255\n",
      "  11000000 : 255\n",
      "  01000000 : 253\n"
     ]
    }
   ],
   "source": "# Simülasyon\nsim = AerSimulator()\ntqc = transpile(qc, sim)\njob = sim.run(tqc, shots=1024)\ncounts = job.result().get_counts()\n\nprint(\"Ölçüm sonuçları (en sık 10):\")\nfor k, v in sorted(counts.items(), key=lambda x: -x[1])[:10]:\n    print(f\"  {k} : {v}\")\n\nplot_histogram(counts, figsize=(10, 4), title=f\"Shor period finding – a={a}, N={N}\")\nplt.show()\n",
   "id": "shor_run"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "shor_factors",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331018567,
     "user_tz": -180,
     "elapsed": 550,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "6e4b41d7-7f96-4bcf-bffc-27041f9cc206"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "=== Faz → periyot → çarpan ===\n",
      "\n",
      "bits=10000000 phase=0.5000 r≈2 → gcd → (3, 1)\n",
      "bits=00000000 phase=0.0000 r≈1\n",
      "bits=11000000 phase=0.7500 r≈4 → gcd → (3, 5)\n",
      "bits=01000000 phase=0.2500 r≈4 → gcd → (3, 5)\n",
      "\n",
      "Bulunan çarpan adayları: {3, 5}\n",
      "N = 3 × 5 = 15\n",
      "\n",
      "→ Aynı yöntem büyük RSA modülünde polinom zamanda çalışabilirse RSA kırılır.\n"
     ]
    }
   ],
   "source": "# Periyot tahmini ve çarpanlar\ndef phase_from_bitstring(bitstr):\n    return int(bitstr, 2) / (2 ** len(bitstr))\n\n\ndef continued_fraction_period(phase, N, max_den=None):\n    if max_den is None:\n        max_den = N\n    frac = Fraction(phase).limit_denominator(max_den)\n    return frac.denominator\n\n\nprint(\"=== Faz → periyot → çarpan ===\\n\")\nfactors_found = set()\nfor bitstr, cnt in sorted(counts.items(), key=lambda x: -x[1])[:15]:\n    if cnt < 10:\n        continue\n    phase = phase_from_bitstring(bitstr)\n    r = continued_fraction_period(phase, N)\n    msg = f\"bits={bitstr} phase={phase:.4f} r≈{r}\"\n    if r > 0 and r % 2 == 0:\n        guess1 = gcd(a ** (r // 2) - 1, N)\n        guess2 = gcd(a ** (r // 2) + 1, N)\n        msg += f\" → gcd → ({guess1}, {guess2})\"\n        if guess1 not in (1, N):\n            factors_found.add(guess1)\n        if guess2 not in (1, N):\n            factors_found.add(guess2)\n    print(msg)\n\nprint(f\"\\nBulunan çarpan adayları: {factors_found or '—'}\")\nif factors_found:\n    f = list(factors_found)\n    if len(f) >= 2:\n        print(f\"N = {f[0]} × {f[1]} = {f[0]*f[1]}\")\n    else:\n        print(f\"N / {f[0]} = {N // f[0]}\")\nprint(\"\\n→ Aynı yöntem büyük RSA modülünde polinom zamanda çalışabilirse RSA kırılır.\")\n",
   "id": "shor_factors"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "section5"
   },
   "source": "## 5. Grover Algoritması ve Simetrik Kriptografi\n\nGrover, yapılandırılmamış aramada ikinci dereceden hızlanma sağlar: $O(\\sqrt{M})$.\n\n- AES-128 kaba kuvvet: klasik $2^{128}$ → kuantum ~$2^{64}$ (pratikte daha maliyetli ama güvenlik marjı erir)\n- **Öneri:** Uzun vadede AES-256; protokoller PQC KEM ile anahtar değişimi\n\nAşağıda **2 qubit Grover** ile “işaretli” durumu arıyoruz (oyuncak).\n",
   "id": "section5"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "id": "grover",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331018967,
     "user_tz": -180,
     "elapsed": 554,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "a9e49ffb-029e-4168-a138-ac9004583020"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Aranan durum: |11>\n",
      "\n",
      "Sonuçlar: {'11': 1024}\n",
      "\n",
      "Yorum: 4 durum içinde 1 hedef → ~1 Grover iterasyonu yeterli.\n",
      "AES-128 için ~2^64 Grover iterasyonu gerekir; bu hâlâ devasa kaynak ister\n",
      "ama güvenlik seviyesi klasik 128-bit'ten ~64-bit'e düşer → AES-256 tercih edilir.\n",
      "\n"
     ]
    }
   ],
   "source": "def grover_2qubit(marked=\"11\"):\n    \"\"\"2 qubit Grover – marked bitstring'i bul.\"\"\"\n    qc = QuantumCircuit(2, 2)\n    # Superposition\n    qc.h([0, 1])\n    # Oracle: marked state'in fazını çevir\n    if marked == \"11\":\n        qc.cz(0, 1)\n    elif marked == \"01\":\n        qc.x(0); qc.cz(0, 1); qc.x(0)\n    elif marked == \"10\":\n        qc.x(1); qc.cz(0, 1); qc.x(1)\n    else:  # 00\n        qc.x([0, 1]); qc.cz(0, 1); qc.x([0, 1])\n    # Diffusion\n    qc.h([0, 1])\n    qc.x([0, 1])\n    qc.cz(0, 1)\n    qc.x([0, 1])\n    qc.h([0, 1])\n    qc.measure([0, 1], [0, 1])\n    return qc\n\nmarked = \"11\"\ngqc = grover_2qubit(marked)\nprint(f\"Aranan durum: |{marked}>\")\ngqc.draw(output=\"text\")\n\nsim = AerSimulator()\ncounts_g = sim.run(transpile(gqc, sim), shots=1024).result().get_counts()\nprint(\"\\nSonuçlar:\", dict(sorted(counts_g.items(), key=lambda x: -x[1])))\nplot_histogram(counts_g, title=f\"Grover – marked={marked}\")\nplt.show()\n\nprint(\"\"\"\nYorum: 4 durum içinde 1 hedef → ~1 Grover iterasyonu yeterli.\nAES-128 için ~2^64 Grover iterasyonu gerekir; bu hâlâ devasa kaynak ister\nama güvenlik seviyesi klasik 128-bit'ten ~64-bit'e düşer → AES-256 tercih edilir.\n\"\"\")\n",
   "id": "grover"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "section6"
   },
   "source": "## 6. NIST Post-Quantum Standartları\n\n| İsim | NIST adı | Tip | Dayandığı problem |\n|------|----------|-----|-------------------|\n| **Kyber** | ML-KEM | KEM (anahtar kapsülleme) | Module-LWE (kafes) |\n| **Dilithium** | ML-DSA | İmza | Module-LWE / SIS |\n| **SPHINCS+** | SLH-DSA | İmza | Hash (stateless) |\n| **Falcon** | FN-DSA | İmza | NTRU kafes |\n\n### Neden kafes (lattice)?\n- En kötü durum zorluk varsayımları\n- Toplama/çarpma ile verimli\n- Shor doğrudan kırmaz; bilinen en iyi saldırılar üstel / alt-üstell\n\n### Hash tabanlı (SPHINCS+)\n- Sadece hash güvenliğine dayanır (muhafazakâr)\n- İmza boyutu daha büyük, hız daha yavaş\n",
   "id": "section6"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "section7"
   },
   "source": "## 7. Uygulamalı Oyuncak Örnekler\n\nGerçek Kyber/Dilithium için **liboqs** / **pqcrypto** gerekir.  \nColab’da kurulum ağır olabildiği için burada **eğitici mini modeller** var:\n\n1. **Hash tabanlı tek-kullanımlık imza fikri** (Lamport benzeri)\n2. **Basit hatalı denklik (LWE) oyuncağı** – Kyber’in kalbi\n",
   "id": "section7"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "lamport",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331019415,
     "user_tz": -180,
     "elapsed": 446,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "18083264-a266-49e6-ab54-5f682027aff0"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "=== Hash tabanlı tek-kullanımlık imza (Lamport mini) ===\n",
      "Mesaj          : b'Ogrenci projesi - PQC demo'\n",
      "İmza doğrulama : True\n",
      "Sahte mesaj    : False (False olmalı)\n",
      "Not: Her anahtar çifti bir kez kullanılmalı; SPHINCS+ bunu çoklu mesaj için genişletir.\n"
     ]
    }
   ],
   "source": "import hashlib\nimport os\n\n# ---------- 1) Mini Lamport-benzeri tek kullanımlık imza ----------\ndef sha256(b: bytes) -> bytes:\n    return hashlib.sha256(b).digest()\n\ndef lamport_keygen(n_bits=16):\n    \"\"\"Her bit için 2 rastgele gizli değer; açık anahtar = hash'leri.\"\"\"\n    sk0 = [os.urandom(32) for _ in range(n_bits)]\n    sk1 = [os.urandom(32) for _ in range(n_bits)]\n    pk0 = [sha256(x) for x in sk0]\n    pk1 = [sha256(x) for x in sk1]\n    return (sk0, sk1), (pk0, pk1)\n\ndef lamport_sign(sk, msg: bytes, n_bits=16):\n    sk0, sk1 = sk\n    h = sha256(msg)\n    bits = [(h[i // 8] >> (7 - (i % 8))) & 1 for i in range(n_bits)]\n    return [sk1[i] if bits[i] else sk0[i] for i in range(n_bits)], bits\n\ndef lamport_verify(pk, msg: bytes, sig, n_bits=16):\n    pk0, pk1 = pk\n    h = sha256(msg)\n    bits = [(h[i // 8] >> (7 - (i % 8))) & 1 for i in range(n_bits)]\n    for i in range(n_bits):\n        expected = pk1[i] if bits[i] else pk0[i]\n        if sha256(sig[i]) != expected:\n            return False\n    return True\n\nsk, pk = lamport_keygen(16)\nmsg = b\"Ogrenci projesi - PQC demo\"\nsig, bits = lamport_sign(sk, msg, 16)\nok = lamport_verify(pk, msg, sig, 16)\nok_bad = lamport_verify(pk, b\"sahte mesaj\", sig, 16)\n\nprint(\"=== Hash tabanlı tek-kullanımlık imza (Lamport mini) ===\")\nprint(f\"Mesaj          : {msg}\")\nprint(f\"İmza doğrulama : {ok}\")\nprint(f\"Sahte mesaj    : {ok_bad} (False olmalı)\")\nprint(\"Not: Her anahtar çifti bir kez kullanılmalı; SPHINCS+ bunu çoklu mesaj için genişletir.\")\n",
   "id": "lamport"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "id": "lwe",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331019965,
     "user_tz": -180,
     "elapsed": 445,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "503966bf-403d-4719-b926-cfb0e075a812"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "=== Mini LWE ===\n",
      "q=97, n=8\n",
      "Gizli s = [ 0 -1  1  0 -1  0  1 -1]\n",
      "  bit=0 → decrypt=0  OK\n",
      "  bit=1 → decrypt=1  OK\n",
      "  bit=1 → decrypt=1  OK\n",
      "  bit=0 → decrypt=0  OK\n",
      "\n",
      "Yorum: Hata (noise) küçük olduğu sürece alıcı doğru biti kurtarır;\n",
      "s'yi bilmeyen için (A,b) çiftlerinden s'yi bulmak (LWE) zor kabul edilir.\n",
      "Kyber bunu modüler kafesler + sıkıştırma ile pratik KEM haline getirir.\n",
      "\n"
     ]
    }
   ],
   "source": "# ---------- 2) Mini LWE (Learning With Errors) ----------\n# Kyber'in dayandığı problem ailesinin oyuncak hali\n\ndef lwe_keygen(n=8, q=97, rng=np.random.default_rng(42)):\n    \"\"\"Gizli s, public (A, b=A s + e).\"\"\"\n    A = rng.integers(0, q, size=(n, n))\n    s = rng.integers(0, 3, size=n) - 1          # küçük gizli {-1,0,1}\n    e = rng.integers(0, 3, size=n) - 1          # küçük hata\n    b = (A @ s + e) % q\n    return s, (A, b), q\n\ndef lwe_encrypt(pk, bit, q, rng=np.random.default_rng(1)):\n    \"\"\"Tek bit şifreleme (oyuncak).\"\"\"\n    A, b = pk\n    n = A.shape[0]\n    r = rng.integers(0, 3, size=n) - 1\n    e1 = rng.integers(0, 3, size=n) - 1\n    e2 = int(rng.integers(0, 3)) - 1\n    u = (A.T @ r + e1) % q\n    v = (int(b @ r) + e2 + bit * (q // 2)) % q\n    return u, v\n\ndef lwe_decrypt(s, ct, q):\n    u, v = ct\n    m = int((v - int(s @ u)) % q)\n    # q/2 civarı → 1, 0 civarı → 0\n    return 1 if min(abs(m - q // 2), q - abs(m - q // 2)) < min(m, q - m) else 0\n\ns, pk, q = lwe_keygen()\nprint(\"=== Mini LWE ===\")\nprint(f\"q={q}, n={len(s)}\")\nprint(f\"Gizli s = {s}\")\n\nfor bit in [0, 1, 1, 0]:\n    ct = lwe_encrypt(pk, bit, q)\n    dec = lwe_decrypt(s, ct, q)\n    print(f\"  bit={bit} → decrypt={dec}  {'OK' if dec == bit else 'HATA'}\")\n\nprint(\"\"\"\nYorum: Hata (noise) küçük olduğu sürece alıcı doğru biti kurtarır;\ns'yi bilmeyen için (A,b) çiftlerinden s'yi bulmak (LWE) zor kabul edilir.\nKyber bunu modüler kafesler + sıkıştırma ile pratik KEM haline getirir.\n\"\"\")\n",
   "id": "lwe"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "section8"
   },
   "source": "## 8. Geçiş Stratejisi (Kurumlar / Ürünler)\n\n1. **Envanter:** TLS, VPN, imza, kod imzalama, sertifikalar, arşiv şifreleme  \n2. **Hybrid:** Klasik ECDH/RSA **+** ML-KEM birlikte (biri kırılsa diğeri ayakta)  \n3. **AES-256** ve uzun hash’lere geç  \n4. **Kütüphaneler:** OpenSSL 3.x PQC, liboqs, BoringSSL deneysel, bulut KMS PQC seçenekleri  \n5. **Harvest-now-decrypt-later:** Bugün kaydedilen şifreli trafik, yarın kuantumla açılabilir → öncelik uzun ömürlü gizlilik\n\n### Qiskit’in rolü\n- Tehdidi **deneyerek** göstermek (Shor, Grover)\n- PQC’nin kendisi klasik algoritmalardır; kuantum bilgisayarda çalışmaz / çalışması gerekmez\n",
   "id": "section8"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "id": "migration_table",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 190
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331020509,
     "user_tz": -180,
     "elapsed": 539,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "9e4a41da-606d-445f-ebc2-7c509dcffd29"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "=== Klasik → PQC geçiş özeti ===\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "        Sistem     Kuantum riski                              PQC karşılığı\n",
       "0     RSA-2048  Shor ile kırılır                            ML-KEM + ML-DSA\n",
       "1  ECDSA P-256      Shor (ECDLP)                           ML-DSA / SLH-DSA\n",
       "2      AES-128      Grover ~2^64                                    AES-256\n",
       "3      SHA-256  Sınırlı (Grover)  SHA-384/512 veya aynı + dikkatli kullanım"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-dd9a976a-c56b-4094-b465-05febb3a4981\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Sistem</th>\n",
       "      <th>Kuantum riski</th>\n",
       "      <th>PQC karşılığı</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>RSA-2048</td>\n",
       "      <td>Shor ile kırılır</td>\n",
       "      <td>ML-KEM + ML-DSA</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ECDSA P-256</td>\n",
       "      <td>Shor (ECDLP)</td>\n",
       "      <td>ML-DSA / SLH-DSA</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>AES-128</td>\n",
       "      <td>Grover ~2^64</td>\n",
       "      <td>AES-256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>SHA-256</td>\n",
       "      <td>Sınırlı (Grover)</td>\n",
       "      <td>SHA-384/512 veya aynı + dikkatli kullanım</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-dd9a976a-c56b-4094-b465-05febb3a4981')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-dd9a976a-c56b-4094-b465-05febb3a4981 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-dd9a976a-c56b-4094-b465-05febb3a4981');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "  <div id=\"id_2ff5e22a-b7e9-4911-adbd-05c2bc03d790\">\n",
       "    <style>\n",
       "      .colab-df-generate {\n",
       "        background-color: #E8F0FE;\n",
       "        border: none;\n",
       "        border-radius: 50%;\n",
       "        cursor: pointer;\n",
       "        display: none;\n",
       "        fill: #1967D2;\n",
       "        height: 32px;\n",
       "        padding: 0 0 0 0;\n",
       "        width: 32px;\n",
       "      }\n",
       "\n",
       "      .colab-df-generate:hover {\n",
       "        background-color: #E2EBFA;\n",
       "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "        fill: #174EA6;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate {\n",
       "        background-color: #3B4455;\n",
       "        fill: #D2E3FC;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate:hover {\n",
       "        background-color: #434B5C;\n",
       "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "        fill: #FFFFFF;\n",
       "      }\n",
       "    </style>\n",
       "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('df')\"\n",
       "            title=\"Generate code using this dataframe.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "    <script>\n",
       "      (() => {\n",
       "      const buttonEl =\n",
       "        document.querySelector('#id_2ff5e22a-b7e9-4911-adbd-05c2bc03d790 button.colab-df-generate');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      buttonEl.onclick = () => {\n",
       "        google.colab.notebook.generateWithVariable('df');\n",
       "      }\n",
       "      })();\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "df",
       "summary": "{\n  \"name\": \"df\",\n  \"rows\": 4,\n  \"fields\": [\n    {\n      \"column\": \"Sistem\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"ECDSA P-256\",\n          \"SHA-256\",\n          \"RSA-2048\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Kuantum riski\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"Shor (ECDLP)\",\n          \"S\\u0131n\\u0131rl\\u0131 (Grover)\",\n          \"Shor ile k\\u0131r\\u0131l\\u0131r\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"PQC kar\\u015f\\u0131l\\u0131\\u011f\\u0131\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 4,\n        \"samples\": [\n          \"ML-DSA / SLH-DSA\",\n          \"SHA-384/512 veya ayn\\u0131 + dikkatli kullan\\u0131m\",\n          \"ML-KEM + ML-DSA\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {}
    }
   ],
   "source": "# Küçük karşılaştırma tablosu (pedagojik)\nimport pandas as pd\n\ndf = pd.DataFrame([\n    {\"Sistem\": \"RSA-2048\", \"Kuantum riski\": \"Shor ile kırılır\", \"PQC karşılığı\": \"ML-KEM + ML-DSA\"},\n    {\"Sistem\": \"ECDSA P-256\", \"Kuantum riski\": \"Shor (ECDLP)\", \"PQC karşılığı\": \"ML-DSA / SLH-DSA\"},\n    {\"Sistem\": \"AES-128\", \"Kuantum riski\": \"Grover ~2^64\", \"PQC karşılığı\": \"AES-256\"},\n    {\"Sistem\": \"SHA-256\", \"Kuantum riski\": \"Sınırlı (Grover)\", \"PQC karşılığı\": \"SHA-384/512 veya aynı + dikkatli kullanım\"},\n])\nprint(\"=== Klasik → PQC geçiş özeti ===\")\ndisplay(df)\n",
   "id": "migration_table"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "closing"
   },
   "source": "## 9. Özet ve Öğrenci Ödevleri\n\n### Bu notebook’ta yaptıklarınız\n1. RSA’nın çarpanlara ayırmaya dayandığını gördünüz  \n2. **Shor** ile N=15’i Qiskit simülatöründe periyot bularak çarpanlara ayırdınız  \n3. **Grover** ile küçük arama uzayında hızlanmayı izlediniz  \n4. NIST PQC ailelerini öğrendiniz  \n5. **Lamport** (hash) ve **LWE** (kafes) oyuncak uygulamalarını kodladınız  \n\n### Ödev önerileri\n1. Shor’da `a ∈ {2,4,7,8,11,13}` değiştirip çarpan başarı oranını karşılaştırın  \n2. Grover’ı 3 qubit’e genişletin (8 durum, 1 hedef)  \n3. Lamport’ta `n_bits=32` yapıp imza boyutunu hesaplayın  \n4. Hybrid TLS mimarisini diyagramlayın (X25519 + ML-KEM)  \n5. liboqs-python kurup gerçek Kyber key encapsulation deneyin  \n\n---\n**Hazırlayan:** Joseph Volkan Ozcan – Öğrenci odaklı PQC + Qiskit materyali  \n**Ortam:** Google Colab · 2026  \n**Uyarı:** Üretim güvenliği için NIST standartı implementasyonlar kullanın.\n",
   "id": "closing"
  }
 ]
}