15. maj 2003 - 20:40Der er
33 kommentarer og 1 løsning
One-time pads, hvordan?
Ok jeg er så smådt begyndt at interessere mig for kryptografi, jeg har læst lidt om det også vidre, i min søgning er jeg faldet over metoden one-time pads, konceptet er simpelt nok, så jeg tænkte 'sådan en kan jeg godt skrive'. Men ak nej det kunne jeg ikke, så nu tyr jeg til eksperten, jeg vil gerne se kilde kode, C++ og noget det kan kompiles på en Windows maskine. Kommentarer er en god ting.
Slå plat og krone - 1 bit pr gang - kan også bruges ;)
Og så må man kun bruge en onetime-pad én gang.... I en af de mange krige i sidste årtusinde kom en større stormagt til at genbruge deres onetime pads ... ja ja.
Jeg ved godt at one time pads er random, det var mere metoden jeg var interesseret i, altså hvordan laver man et program der udfører den operation som en pad gør. For at gøre det lette skal programmet kun kunne håndtere en streng af ren tekst. Hvis man antager at du har en key(I det her tilfælde noget brugen indtaster).
Og lidt off topic: Et radioaktivt materiale henfalder i følge nogle velkendte love, så det ville ikke være random.
Du tager din lange streng af tilfældige bits, deler den op i klumper af 8, og laver xor mellem sådan en klump og et tegn - på 8 bit også. XOR i C? Er det ikke ^ ?
Jo, lovene om radioatktivitet handler om den overordnede udvikling. Tiden der går mellem to "klik" i geigertælleren er "tilfældig" - det kan fx måles om der går et lige eller ulige antal millisekunder, så har man en tilfældig bit.
Well for at tage et eksempel fra den tekst jeg fandt:
Du har inputtet: ONETIME PAD Og key'en: TBFRGFARFM Og outputtet: IPKLPSFHGQ
Det output er nået ved at sige:
(O's placering i alfabetet + T's placering i alphabetet)%26 = I's placering i alphabetet. etc..
Jeg vil gerne kode eksempler (med kommentarer) på hvordan det kan gøres. Og ja jeg er ikke den mest erfarne koder der findes, men matematikken bag kryptering er interessant.
Takker :) Men som jeg sadge vil jeg gerne ha' kommentarer på koden, jeg er kun lige ved at lære, og hvordan kan jeg lære ved at bare få resultatet :) Lidt lige som meningen på alt er 42, uden forklaring er det ikke let at lære :>
int i; char plain[] = "ONETIMEPAD"; char key[] = "TBFRGFARFM"; char *cipher; int l = strlen(plain); cipher = (char *)malloc(l); // alloker memory for cipher strengen for(i=0;i<l;i++) cipher[i] = plain[i] + key[i]; // lig key til plain (% strlen er ikke nødvendig ved onetime pad da key altid er ligeså lang som plain !) cipher[l] = '\0'; // terminer cipher strengen printf("%s -> %s\n",plain,cipher);
int i; char plain[] = "ONETIMEPAD "; char key[] = "TBFRGFARFM"; char *cipher; int l = strlen(plain); cipher = (char *)malloc(l); // alloker cipher strengen for(i=0;i<l;i++) cipher[i] = 'A' + ((plain[i] - 'A') + (key[i] - 'A') + 1) % 26; // den her er sgu svær at forklare - det virker med er vist C kode når det er værst :-( cipher[l] = '\0'; // terminer cipher strengen printf("%s -> %s\n",plain,cipher);
Ok, lige et lille side spørgsmål, eller to faktisk.
Findes der en funktion til at konvertere en streng til store bogtstaver? Og har jeg forstået korrekt at 'Bogstav' - 'A' = 'Bogstav's placering i alfabetet?' Hvis man antager at A er på plads nul.
+1 skulle ændres til -1 og for at få et positvi tal skulle der ligges 26 til.
-1 + 26 = +25
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.