Fermatscher Primzahltest (einfach erklärt)

Поделиться
HTML-код
  • Опубликовано: 15 сен 2024

Комментарии • 45

  • @dennismuller1141
    @dennismuller1141 Год назад +6

    kleine Anmerkung:
    wenn bei `a = random.randrange(2, p)` die Zahl p-1 gewählt wird und p ungerade ist, gibt die Funktion garantiert True zurück (p-1 ist ja kongruent zu -1 modulo p).
    Außerdem ist es natürlich ineffizient, erst die Potenz `a ** (p - 1)` zu berechnen und dann erst modulo p zu reduzieren. 1024-bit große Zahlen lassen sich damit jedenfalls nicht testen.
    Eine leicht optimierte Variante der Funktion könnte so aussehen:
    def fermat(p, k):
    for runs in range(k):
    a = random.randrange(2, p-1)
    if pow(a, p-1, p) != 1:
    return False
    return True
    die builtin pow Funktion berechnet `base ** exp % mod` deutlich effizienter, da durch häufigere modulo-Reduktionen die Zwischenergebnisse klein gehalten werden. Eine Implementierung könnte folgendermaßen aussehen:
    def mod_pow(base, exp, mod):
    r = 1
    while exp:
    if exp % 2 == 1:
    r = r * base % p
    base = base * base % p
    exp //= 2
    return r
    Allerdings muss ich hier auch anmerken, dass diese Implementierung nicht für RSA-Berechnungen mit dem geheimen Schlüssel geeignet ist, da der if-Block im while-loop die Funktion anfällig für Seitenkanalangriffe macht.

  • @Radulf666
    @Radulf666 Год назад +5

    Vielen Dank für das tolle und gut verständliche Video!

  • @Edsalahr
    @Edsalahr Год назад +7

    Bitte mehr solcher Videos :) Kannst du auch Videos über Endliche Körper und Elliptische Kurven machen?

    • @Florian.Dalwigk
      @Florian.Dalwigk  Год назад +4

      Leider werden diese Videos im Vergleich zu anderen Videos nur sehr selten angeschaut :( Elliptische Kurven stehen aber noch auf dem Plan :)

  • @javaABCde
    @javaABCde Год назад +1

    Sehr nice Erklärung!

  • @Simon35098
    @Simon35098 Год назад +1

    1:41 Eine Primzahl ist eine natürliche Zahl, die genau zwei Teiler hat und nicht eine Zahl die nur durch 1 und sich sich selber teilbar ist. *Klugscheißermodus aus* :) Dann muss man auch die Zahl 2 nicht abfangen.

  • @peterzwegat2744
    @peterzwegat2744 Год назад +2

    Mich würde interessieren wie Florian seine Videos macht. In einem Q&A wurde ja mal angekündigt, dass dazu ein Video kommt. Jemand nen Link?

  • @DerMichael
    @DerMichael Год назад

    Hilft sehr für das Verständnis von Cryptography Challenges in CTFs von Hack the Box :)

    • @Florian.Dalwigk
      @Florian.Dalwigk  Год назад

      Das ist super :)
      Ja, gerade bei Crypto Challenges sollte man sich nicht vor Mathe fürchten

  • @MadpolygonDEV
    @MadpolygonDEV Год назад

    interessant, kannte den algorithmus nicht allerdings denke ich kann ich den gut für eigene projekte verwenden! danke

  • @Simon-hy2fh
    @Simon-hy2fh Год назад

    4:41 du sagst zwar kongruent, schreibst aber =
    Fehlt hier nicht das Kongurenzzeichen? Die Schreibweise mit = finde ich uneindeutig, man kann es auch falsch interpretieren.

  • @rzstnce5627
    @rzstnce5627 Год назад

    hallo ich würde mir wohl gerne ein video wünschen über cloudflare warp wie es genau funktioniert und was es macht ist bestimmt interessant

  • @Wolfgang.-
    @Wolfgang.- Год назад

    Wäre es nicht nützlich sicherzustellen, dass bei "a = random. randrange (2, p)" a sich nicht wiederholt?

    • @Florian.Dalwigk
      @Florian.Dalwigk  Год назад

      Kann man machen, kommt aber selten vor und kann deshalb vernachlässigt werden

  • @schwingedeshaehers
    @schwingedeshaehers Год назад +1

    Bei einer Million sollte es doch noch gehen, alle interessanten zu prüfen (Wurzel ist 1000, für 100 000 000, 10 000, und das sollte man durchgehen können, vorallem weil man nur ungerade zahlen prüfen muss, was es nochmal halbiert)

  • @danielf.7151
    @danielf.7151 Год назад

    Gibt es eine Möglichkeit, die Chance der Richtigkeit abzuschätzen?

  • @justizirtum
    @justizirtum 5 месяцев назад

    Wie schlimm ist es eigentlich, wenn man für den RSA algorithmus ausversehen zwei dreihundert stellige nicht Primzahlen erwischt, weil der Miller rabin Algorithmus ja probabilistisch ist?

    • @Florian.Dalwigk
      @Florian.Dalwigk  5 месяцев назад

      Dann funktioniert der RSA nicht.

    • @justizirtum
      @justizirtum 5 месяцев назад

      Aber wieso verwendet man dann probabilistische Algorithmen dafür? Ich meine, sind die bei 300 stelligen Primzahlen überhaupt sicher

    • @Florian.Dalwigk
      @Florian.Dalwigk  5 месяцев назад

      Wird im Video erklärt.
      Gerade bei 300-stelligen Primzahlen ist die Wahrscheinlichkeit, dass der Test fehlschlägt, extrem gering.

  • @hm.8211
    @hm.8211 Год назад +3

    wird ja ne ganze " RSA verstehen " videoreihe xD

    • @Florian.Dalwigk
      @Florian.Dalwigk  Год назад +8

      Kryptographie verstehen ;)

    • @hm.8211
      @hm.8211 Год назад +6

      @@Florian.Dalwigk kann nur sagen dass diese art von videos die sind, bei denen du von mir garantiert 100% watchtime bekommst... aber klar, die zielgruppe für sowas ist ziemlich klein

    • @katyes1228
      @katyes1228 Год назад +1

      @@Florian.Dalwigk ich schau mir solche Videos an :D Die meisten aus Interesse, aber zugegebenermaßen manche auch zur Prüfungsvorbereitung XD

    • @Florian.Dalwigk
      @Florian.Dalwigk  Год назад +1

      Das freut mich sehr, danke dir :)

    • @Florian.Dalwigk
      @Florian.Dalwigk  Год назад +1

      Genau dafür mache ich sie ja eigentlich ;)

  • @Edsalahr
    @Edsalahr Год назад

    Sollte für die Kongruenz nicht ≡ benutzt werden anstatt = (4:34)

  • @amiganer681130
    @amiganer681130 Год назад

    Wenn "p" aber groß wird, wird auch dieses Verfahren an seine Grenzen kommen, was mache ich dann? Wir suchen ja Primzahlen, die bis zu 2048 Bit (= 256 Byte) groß sind. In Rust gibt es einen Datentyp "u128"....

    • @Florian.Dalwigk
      @Florian.Dalwigk  Год назад +1

      Wieso? Modulo-Rechnung ist sehr günstig von der Laufzeit

    • @Radulf666
      @Radulf666 Год назад

      @@Florian.Dalwigk Ich vermute, er meint, um auch bei großen Zahlen eine hohe Genauigkeit zu bekommen, muss mann dann auch mehr Durchgänge machen.

    • @Florian.Dalwigk
      @Florian.Dalwigk  Год назад

      Gar nicht Mal unbedingt, wenn es nicht gleich eine Carmichael Zahl ist.

    • @MarsCorporations
      @MarsCorporations Год назад

      Der Algorithmus arbeitet nur mit integern, und für diese gibt es libs (je nach Programmiersprache heißen die unterschiedlich, z.B. BigInt, oder BigInteger, oder BigNum, etc.). Die Komplexität der Standardoperationen auf Integern ist relativ gut, sodass man damit auch hundert- oder tausendstellige Zahlen halbwegs flott abarbeiten kann. Potenzieren klingt hier jetzt erstmal wie ein Problem, ist es aber nicht. Angenommen du potenzierst 256 Byte mit 256 Byte, dann kann das Resultat maximal 256*256 = 65536 Stellen lang sein (bei heutigen Computern ist 65k RAM kein Problem, wie die Rechenzeit aussieht weiß ich nicht, wenn die Operation in der lib ist wird sie vermutlich optimiert sein und funktionieren). Natürlich wird es unangenehm, wenn du "Megabytegroße" Zahlen potenzieren willst, aber alles darunter sollte gehen. Für "Potenzieren mit Modulo" gibt es noch ein paar Tricks, aber da kenne ich mich nicht aus, das muss man selbst googeln.

    • @amiganer681130
      @amiganer681130 Год назад

      @@MarsCorporations Mir geht es darum, die Potenz möglichst genau errechnen zu können. Ja, es geht um Integer, aber 2^1024 sind schon 1,7977E308 (308 Nullen), was ist dann 2^2048? Vielleicht kann mal wer kurz sagen, wieviele Stellen denn eine solche Primzahl haben sollte (nicht in bit, 10er System bitte). Diese Zahlen kann ich mir gerade nicht mehr selber vorstellen.