diff --git a/20230525/ad-20230525.txt b/20230525/ad-20230525.txt
new file mode 100644
index 0000000000000000000000000000000000000000..099c05acc504048d784c9e6f35746d04f4b04a31
--- /dev/null
+++ b/20230525/ad-20230525.txt
@@ -0,0 +1,57 @@
+RSA, 25.05.2023, 16:20:49
+~~~~~~~~~~~~~~~~~~~~~~~~~
+Schlüsselerzeugung:
+ - d durch Durchprobieren zu finden, hat O(n), ist also
+   genauso langsam wie das Knacken der Verschlüsselung.
+ - Der erweiterte euklidische Algorithmus hat O(log n).
+
+Verschlüsseln und Entschlüsseln:
+ - Modulo-Exponentiation: in Schleife fortwährend multiplizieren,
+   in jedem Durchlauf modulo N rechnen.
+   (Andernfalls gibt es einen Überlauf. m^e oder c^d sind
+   riesengroße Zahlen - erst recht, wenn m, e, c und d bereits
+   riesengroße Zahlen sind.)
+   (Beobachtung: Wenn m (oder c) durch 2 teilbar ist, kommt
+   bei der Potenz ab e = 64 (bzw. d = 64) zuverlässig 0 heraus.
+   Für Details siehe: rsa-04.txt)
+ - Diese Methode der Modulo-Exponentiation hat O(n), ist also
+   genauso langsam wie das Knacken der Verschlüsselung.
+ - Um RSA brauchbar zu machen, benötigen wir einen Algorithmus
+   für die Modulo-Exponentiation, der deutlich schneller ist
+   als O(n), am besten O(log n) oder schneller.
+
+Wie kann man Modulo-Exponentiation effizienter programmieren,
+als in einer Schleife fortwährend zu multiplizieren?
+
+Ansatz:
+Wie kann man Multiplikation effizienter programmieren,
+als in einer Schleife fortwährend zu addieren?
+--> schriftlich
+--> Schriftliche Multiplikation hat O(?).
+
+  42 · 137
+  --------
+      42                   \
+      126   3 · 42 = 126    } 1 Schleifendurchlauf pro Ziffer
+       294  7 · 42 = 294   /
+  --------
+       462
+
+--> Schriftliche Multiplikation hat O(log n).
+    (log n = Anzahl der Ziffern)
+
+Dasselbe binär:
+
+  11 · 101
+  --------
+      11    Multiplikation mit 0 oder 1 ist trivial.
+        0 
+        11
+  --------
+      1111
+
+Übertragung:
+Wie kann man Modulo-Exponentiation effizienter programmieren,
+als in einer Schleife fortwährend zu multiplizieren?
+--> Aus Plus wird Mal, aus Mal wird Hoch.
+--> "Binäre Exponentiation" --> Wikiepedia
diff --git a/20230525/overflow-01.c b/20230525/overflow-01.c
new file mode 100644
index 0000000000000000000000000000000000000000..d7bb7b3a4da84fdba43953f77eb143ed18b69ea7
--- /dev/null
+++ b/20230525/overflow-01.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <stdint.h>
+
+int main (void)
+{
+  uint8_t a = 1;
+  for (int i = 0; i < 42; i++)
+    {
+      a *= 2;
+      printf ("i = %d, a = %d\n", i, a);
+    }
+  return 0;
+}
diff --git a/20230525/overflow-02.c b/20230525/overflow-02.c
new file mode 100644
index 0000000000000000000000000000000000000000..171b812c75cafc5caa444738b64003947077d0b8
--- /dev/null
+++ b/20230525/overflow-02.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <stdint.h>
+
+int main (void)
+{
+  uint8_t a = 1;
+  while (a != 0)
+    {
+      printf ("a = %d\n", a);
+      a++;
+    }
+  return 0;
+}
diff --git a/20230525/rsa-01.c b/20230525/rsa-01.c
new file mode 100644
index 0000000000000000000000000000000000000000..9f5f14c2a9d1bcf3904b9f8d933c921a489f1e90
--- /dev/null
+++ b/20230525/rsa-01.c
@@ -0,0 +1,55 @@
+#include <stdio.h>
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int n, int e)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: N = %d, e = %d\n", N, e);
+  int d = gen_key (n, e);
+  printf ("Geheimer Schlüssel: n = %d, d = %d\n", n, d);
+  return 0;
+}
diff --git a/20230525/rsa-02.c b/20230525/rsa-02.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5867e8ff1729c39684a020b10cb81a98582040a
--- /dev/null
+++ b/20230525/rsa-02.c
@@ -0,0 +1,78 @@
+#include <stdio.h>
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (int b, int e, int N)
+{
+  int result = 1;
+  for (int i = 0; i < e; i++)
+    result = result * b;
+  return result % N;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-03.c b/20230525/rsa-03.c
new file mode 100644
index 0000000000000000000000000000000000000000..6fcfda757fc3351531aa5e3d7cca900758352f8c
--- /dev/null
+++ b/20230525/rsa-03.c
@@ -0,0 +1,81 @@
+#include <stdio.h>
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (int b, int e, int N)
+{
+  int result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = result * b;
+      printf ("i = %d, result = %d\n", i, result);
+    }
+  return result % N;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-04.c b/20230525/rsa-04.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5363f5e87e28d117a0405713bc9084523a1516e
--- /dev/null
+++ b/20230525/rsa-04.c
@@ -0,0 +1,81 @@
+#include <stdio.h>
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (long long unsigned b, int e, int N)
+{
+  long long unsigned result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = result * b;
+      printf ("i = %d, result = %llu\n", i, result);
+    }
+  return result % N;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-04.txt b/20230525/rsa-04.txt
new file mode 100644
index 0000000000000000000000000000000000000000..984602c1dbf5eee9aca1187c123e0dc407ffffaf
--- /dev/null
+++ b/20230525/rsa-04.txt
@@ -0,0 +1,42 @@
+Öffentlicher Schlüssel: e = 137, N = 124188007
+Geheimer Schlüssel: d = 7250553, n = 124165720
+
+# Verschlüsseln.
+# Wir berechnen zuerst m^e und danach erst modulo N.
+# m = 42, e = 137. Wir berechnen also 42^137 =
+# 24274639250933907631303599910823220000137051730141529646342610861607\
+# 09604676551412432682195323873003260687326164627838796340701450516955\
+# 28408968085474571834916235983787857059497571233437654292374102849808\
+# 4922642641612439552
+
+i = 0, result = 42                      # 42^1 = 2^1 * 3^1 * 7^1
+i = 1, result = 1764                    # 42^2 = 2^2 * 3^2 * 7^2
+i = 2, result = 74088                   # 42^3 = 2^3 * 3^3 * 7^3
+i = 3, result = 3111696                 # 42^4 = 2^4 * 3^4 * 7^4
+i = 4, result = 130691232
+i = 5, result = 5489031744
+i = 6, result = 230539333248
+i = 7, result = 9682651996416
+i = 8, result = 406671383849472
+i = 9, result = 17080198121677824
+i = 10, result = 717368321110468608
+
+# Ungefähr ab hier ist die 64-Bit-Zahl voll. Ab jetzt rechnert der Rechner
+# alles modulo 2^64. Die Ergebnisse sind nicht verwertbar.
+
+i = 11, result = 11682725412930129920   # 42^12 = 2^12 * 3^12 * 7^12
+i = 12, result = 11059121426617114624   # 42^13 = 2^13 * 3^13 * 7^13
+i = 13, result = 3314498075180023808    # 42^14 = 2^14 * 3^14 * 7^14
+
+...
+
+i = 60, result = 11529215046068469760   # 42^61 = 2^61 * 3^61 * 7^61
+i = 61, result = 4611686018427387904    # 42^62 = 2^62 * 3^62 * 7^62
+i = 62, result = 9223372036854775808    # 42^63 = 2^63 * 3^63 * 7^63
+i = 63, result = 0                      # 42^64 = 2^64 * 3^64 * 7^64
+                                                  ~~~~
+                                                   = 0 auf einem 64-Bit-Rechner
+
+--> Diese (fehlerhafte) Art von Modulo-Exponentiation liefert
+    für durch 2 teilbare Zahlen zuverlässig 0, sobald der Exponent
+    die 64 erreicht.
diff --git a/20230525/rsa-05.c b/20230525/rsa-05.c
new file mode 100644
index 0000000000000000000000000000000000000000..42323b5af92e6352a16b46f99532e745e59d35cd
--- /dev/null
+++ b/20230525/rsa-05.c
@@ -0,0 +1,81 @@
+#include <stdio.h>
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (int b, int e, int N)
+{
+  int result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      printf ("i = %d, result = %d\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-06.c b/20230525/rsa-06.c
new file mode 100644
index 0000000000000000000000000000000000000000..285ccfd7232361432063b2562e2378aa7438505f
--- /dev/null
+++ b/20230525/rsa-06.c
@@ -0,0 +1,84 @@
+#include <stdio.h>
+
+#define DEBUG 1
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (long long unsigned b, int e, int N)
+{
+  long long unsigned result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      if (DEBUG)
+        printf ("i = %d, result = %llu\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-07.c b/20230525/rsa-07.c
new file mode 100644
index 0000000000000000000000000000000000000000..fdc0a026159aae07d1f0d8080362c00bd39f1368
--- /dev/null
+++ b/20230525/rsa-07.c
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#define DEBUG 0
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (uint64_t b, int e, uint32_t N)
+{
+  uint64_t result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      if (DEBUG)
+        printf ("i = %d, result = %" PRIu64 "\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-08.c b/20230525/rsa-08.c
new file mode 100644
index 0000000000000000000000000000000000000000..0be9037572ea2bf39694cb65915201d109a5a63f
--- /dev/null
+++ b/20230525/rsa-08.c
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#define DEBUG 1
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (uint64_t b, int e, uint32_t N)
+{
+  uint64_t result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      if (DEBUG > 1)
+        printf ("i = %d, result = %" PRIu64 "\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d", d, n);
+  if (DEBUG > 0)
+    printf (", d · e mod n = %d", (d * e) % n);
+  printf ("\n");
+  if (DEBUG > 0)
+    printf ("2^24 = %d\n", mod_power (2, 24, 2000000000));
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-09.c b/20230525/rsa-09.c
new file mode 100644
index 0000000000000000000000000000000000000000..ffd0908a8177b2e9cefd18be80a907437c34a8e9
--- /dev/null
+++ b/20230525/rsa-09.c
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#define DEBUG 1
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (uint64_t b, int e, uint64_t N)
+{
+  uint64_t result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      if (DEBUG > 1)
+        printf ("i = %d, result = %" PRIu64 "\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d", d, n);
+  if (DEBUG > 0)
+    printf (", d · e mod n = %d", (d * e) % n);
+  printf ("\n");
+  if (DEBUG > 0)
+    printf ("2^24 = %d\n", mod_power (2, 24, 2000000000));
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-10.c b/20230525/rsa-10.c
new file mode 100644
index 0000000000000000000000000000000000000000..b0abd70ad09de2f841c17fc67ea76982b008634f
--- /dev/null
+++ b/20230525/rsa-10.c
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#define DEBUG 2
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (uint64_t b, int e, uint64_t N)
+{
+  uint64_t result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      if (DEBUG > 1)
+        printf ("i = %d, result = %" PRIu64 "\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11;
+  int q = 13;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 23;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d", d, n);
+  if (DEBUG > 0)
+    printf (", d · e mod n = %d", (d * e) % n);
+  printf ("\n");
+  if (DEBUG > 0)
+    printf ("2^24 = %d\n", mod_power (2, 24, 2000000000));
+  int m = 7;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-11.c b/20230525/rsa-11.c
new file mode 100644
index 0000000000000000000000000000000000000000..532ac64c98cce806183547198a44819e472d2629
--- /dev/null
+++ b/20230525/rsa-11.c
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#define DEBUG 0
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (uint64_t b, int e, uint64_t N)
+{
+  uint64_t result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      if (DEBUG > 1)
+        printf ("i = %d, result = %" PRIu64 "\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int N)
+{
+  return mod_power (c, d, N);
+}
+
+int main (void)
+{
+  int p = 11;
+  int q = 13;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 23;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d", d, n);
+  if (DEBUG > 0)
+    printf (", d · e mod n = %d", (d * e) % n);
+  printf ("\n");
+  if (DEBUG > 0)
+    printf ("2^24 = %d\n", mod_power (2, 24, 2000000000));
+  int m = 7;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, N);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-12.c b/20230525/rsa-12.c
new file mode 100644
index 0000000000000000000000000000000000000000..b7e48f39d5145dd839a05d62b6816a4b9867116b
--- /dev/null
+++ b/20230525/rsa-12.c
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#define DEBUG 0
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (uint64_t b, int e, uint64_t N)
+{
+  uint64_t result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      if (DEBUG > 1)
+        printf ("i = %d, result = %" PRIu64 "\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int N)
+{
+  return mod_power (c, d, N);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d", d, n);
+  if (DEBUG > 0)
+    printf (", d · e mod n = %d", (d * e) % n);
+  printf ("\n");
+  if (DEBUG > 0)
+    printf ("2^24 = %d\n", mod_power (2, 24, 2000000000));
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, N);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-13.c b/20230525/rsa-13.c
new file mode 100644
index 0000000000000000000000000000000000000000..285ccfd7232361432063b2562e2378aa7438505f
--- /dev/null
+++ b/20230525/rsa-13.c
@@ -0,0 +1,84 @@
+#include <stdio.h>
+
+#define DEBUG 1
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (long long unsigned b, int e, int N)
+{
+  long long unsigned result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      if (DEBUG)
+        printf ("i = %d, result = %llu\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-14.c b/20230525/rsa-14.c
new file mode 100644
index 0000000000000000000000000000000000000000..42323b5af92e6352a16b46f99532e745e59d35cd
--- /dev/null
+++ b/20230525/rsa-14.c
@@ -0,0 +1,81 @@
+#include <stdio.h>
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (int b, int e, int N)
+{
+  int result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = (result * b) % N;
+      printf ("i = %d, result = %d\n", i, result);
+    }
+  return result;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}
diff --git a/20230525/rsa-15.c b/20230525/rsa-15.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5363f5e87e28d117a0405713bc9084523a1516e
--- /dev/null
+++ b/20230525/rsa-15.c
@@ -0,0 +1,81 @@
+#include <stdio.h>
+
+void ext_eucl (int a, int b, int *ss, int *tt, int *ggt)
+{
+  int r0 = a;
+  int r1 = b;
+  int s0 = 1;
+  int s1 = 0;
+  int t0 = 0;
+  int t1 = 1;
+  int r2 = r0 % r1;
+  while (r2)
+    {
+      int q = r0 / r1;
+      int s2 = s0 - q * s1;
+      int t2 = t0 - q * t1;
+      r0 = r1;
+      s0 = s1;
+      t0 = t1;
+      r1 = r2;
+      s1 = s2;
+      t1 = t2;
+      r2 = r0 % r1;
+    }
+  *ggt = r1;
+  *ss = s1;
+  *tt = t1;
+}
+
+int gen_key (int e, int n)
+{
+  int d;
+  int t;
+  int ggt;
+  ext_eucl (e, n, &d, &t, &ggt);
+  while (d < 0)
+    d += n;
+  if (ggt != 1)
+    return -1;
+  else
+    return d;
+}
+
+int mod_power (long long unsigned b, int e, int N)
+{
+  long long unsigned result = 1;
+  for (int i = 0; i < e; i++)
+    {
+      result = result * b;
+      printf ("i = %d, result = %llu\n", i, result);
+    }
+  return result % N;
+}
+
+int encrypt (int m, int e, int N)
+{
+  return mod_power (m, e, N);
+}
+
+int decrypt (int c, int d, int n)
+{
+  return mod_power (c, d, n);
+}
+
+int main (void)
+{
+  int p = 11117;
+  int q = 11171;
+  int N = p * q;
+  int n = (p - 1) * (q - 1);
+  int e = 137;
+  printf ("Öffentlicher Schlüssel: e = %d, N = %d\n", e, N);
+  int d = gen_key (e, n);
+  printf ("Geheimer Schlüssel: d = %d, n = %d\n", d, n);
+  int m = 42;
+  int c = encrypt (m, e, N); 
+  printf ("Nachricht: %d\nVerschlüsselte Nachricht: %d\n", m, c);
+  int m2 = decrypt (c, d, n);
+  printf ("Entschlüsselte Nachricht: %d\n", m2);
+  return 0;
+}