Java >> Java tutorial >  >> Tag >> public

Hvordan laver man en simpel offentlig nøgle kryptografisk algoritme?

OK, bare en simpel demo-idé, baseret på tilføjelse/modulo-operation.

  1. Lad os sige, at vi har en modulo-værdi, for vores eksempel 256. Dette er en offentligt kendt, almindelig værdi.

  2. Lad os sige, at du genererer en tilfældig hemmelig privat nøgle i intervallet [1-255], for eksempel pri=133. Hold hemmelig nøgle i lommen.

  3. Generer en offentlig nøgle, pub =256 - pri =123. Denne offentlige nøgle (123) kan du dele med verden. Forestil dig, 3. part ved ikke, hvordan man beregner den private nøgle fra en offentlig. Så de kender kun den offentlige nøgle (123).

  4. Nogen fra offentligheden ønsker at sende dig en krypteret ASCII-byte. Han får sin byte og tilføjer den offentlige nøgle til den ved modulo 256 operation:

    encrypted = (input_value + pub) % modulto;
    

For eksempel vil jeg sende dig bogstavet "X", ASCII-kode =88 i krypteret form. Så jeg beregner:

(88 + 123) % 256 = 211;
  1. Jeg sender dig værdien 211 - krypteret byte.

  2. Du dekrypterer det ved samme skema med din private nøgle:

    decrypted = (input_value + pri) % 256 = (211 + 133) % 256 = 88;
    

Naturligvis er det svagt at bruge det simple generationspar i dette eksempel på grund af den velkendte algoritme til at generere den private nøgle fra det offentlige, og enhver kan nemt gendanne den private ved hjælp af modulo og public. Men i ægte kryptografi er denne algoritme er ikke kendt. Men teoretisk set kan det opdages i fremtiden.


Dette er et område af ren matematik, der er en bog kaldet "the mathematics of cyphers", den er ret kort, men en god introduktion. Jeg foreslår dog, at du holder dig væk fra at implementere din egen, især i Java (du vil have en compiler, der målretter mod en rigtig maskine til den slags matematik, der er involveret, og optimerer i overensstemmelse hermed). Du bør spørge om dette på stackbørserne for matematik eller datalogi.

Jeg fik en nedstemme, så jeg vil gerne præcisere. Jeg er ikke hjerteløs, men cyphers er fast inden for matematikkens domæne, ikke programmering (selvom det er diskret matematik eller den matematiske side af comp-sci) det kræver en god forståelse af algebraiske strukturer, nogle statistikker, det er bestemt en fascinerende område, og jeg opfordrer dig til at læse. Jeg mener dog ovenstående, brug ikke noget, du laver, de mennesker, der "opfinder" disse cyphers, har glemt mere end du eller jeg ved, implementerer højst nøjagtigt, hvad de siger. I Java bør du forvente en virkelig dårlig gennemstrømning btw. Optimeringer, der involverer registertryk og allokering, giver store udbytter i cypher-gennemstrømning. Java er stack-baseret til at begynde med.

Tillæg (ca. 6 år senere)

Java er blevet forbedret på nogle områder nu (jeg har en compiler-fetich, det er ret mærkeligt), men når jeg ser tilbage, havde jeg ret, men af ​​de slags forkerte årsager er Java meget lettere at angribe gennem timing, jeg har set stor brug af stole på sporing af kompileringsteknikker for at finde ud af, hvilken version af software der f.eks. bruges. Det er også virkelig svært at håndtere Spectre, som ikke forsvinder lige foreløbigt (jeg kan godt lide cacher... Jeg føler mig beskidt at sige det nu)

DOG:Frem for alt skal du ikke gøre dette selv! Lege med det HØJST - det er meget i matematikkens domæne, og jeg må sige, at det nok er bedre gjort på papiret, medmindre du kan lide at beundre en terminal med cifre udsprøjtet over det hele.


http://en.wikipedia.org/wiki/RSA_(algoritme)

Er den standard, som (hele) internettet er baseret på


Java tag