Avatar billede ferret Nybegynder
15. maj 2003 - 20:40 Der 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.
Avatar billede arne_v Ekspert
15. maj 2003 - 20:54 #1
En one time pad er ægte random sekvens (altså ikke en pseudo random
sekvens) som kun bruges en gang.

Sådanne er ikke helt nemme at generere.

Man kan ikke bruge de normale random generatorer.

Man skal have fat i noget fysisk.

Man kan f.eks. bruge en geiger tæller og noget radioaktivt materiale
og så måle aktiviteten. Den vil være "ægte" random.

Der er et firma som har konstrueret en lava lampe og så tager man et
digital billede af den lampe med lys i og udregner en digital hash
af billedet.

Men det er ikke bare noget man lige laver.
Avatar billede arne_v Ekspert
15. maj 2003 - 20:55 #2
I de fleste computer sammenhænge vælger man en kendt algorithem
3DES, IDEA, AES, Blowfish med en lang key og bruger den.

Det er mere operationelt på computer.
Avatar billede erikjacobsen Ekspert
15. maj 2003 - 20:57 #3
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.

Men hvad kan du selv skrive af koden?
Avatar billede ferret Nybegynder
15. maj 2003 - 20:59 #4
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.
Avatar billede ferret Nybegynder
15. maj 2003 - 21:02 #5
Det jeg leder efter er en måde at udføre:

(Bogstav + bogstav)%26

Hvis jeg bare gør det med C++

Bliver det (ASCII værdi + ASCII værdi)%26

Det skal være pladsen i alfabetet.
Avatar billede erikjacobsen Ekspert
15. maj 2003 - 21:02 #6
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.
Avatar billede arne_v Ekspert
15. maj 2003 - 21:05 #7
På computer vil du normalt altid operere på bytes altså 0..255 værdier.

Noget ligesom:

char plain[] = "Dette er en test";
char key[] = "hemmeligt";
char *cipher;
int l = strlen(plain);
cipher = (char *)malloc(l);
for(i=0;i<l;i++) cipher[i] = plain[i] + key[i % strlen(key)];
Avatar billede arne_v Ekspert
15. maj 2003 - 21:06 #8
XOR i C er ^.

Der er nogen som foretrækker plus fremfor XOR til kryptering.
Avatar billede ferret Nybegynder
15. maj 2003 - 21:08 #9
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.
Avatar billede ferret Nybegynder
15. maj 2003 - 21:09 #10
Det er ONETIMEPAD
ikke ONETIME PAD
Avatar billede arne_v Ekspert
15. maj 2003 - 21:12 #11
Vil du have et eksempel i papir mode (kun A..Z) eller i computer
mode (0..255) ?
Avatar billede ferret Nybegynder
15. maj 2003 - 21:12 #12
Well...gerne begge, men hvad der nu er lettest.
Avatar billede ferret Nybegynder
15. maj 2003 - 21:13 #13
Det skal siges at det ikke er sikkerheden i paden der interesserer mig, mere metoden.
Avatar billede arne_v Ekspert
15. maj 2003 - 21:18 #14
Et eksempel i papir mode:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
  int i;
  char plain[] = "ONETIMEPAD ";
  char key[] = "TBFRGFARFM";
  char *cipher;
  int l = strlen(plain);
  cipher = (char *)malloc(l);
  for(i=0;i<l;i++) cipher[i] = 'A' + ((plain[i] - 'A') + (key[i % strlen(key)] - 'A') + 1) % 26;
  cipher[l] = '\0';
  printf("%s -> %s\n",plain,cipher);
}

som giver:

C:\>cipher
ONETIMEPAD -> IPKLPSFHGQ
Avatar billede arne_v Ekspert
15. maj 2003 - 21:21 #15
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
  int i;
  char plain[] = "ONETIMEPAD";
  char key[] = "TBFRGFARFM";
  char *cipher;
  int l = strlen(plain);
  cipher = (char *)malloc(l);
  for(i=0;i<l;i++) cipher[i] = plain[i] + key[i % strlen(key)];
  cipher[l] = '\0';
  printf("%s -> %s\n",plain,cipher);
}

C:\>cipher2
ONETIMEPAD -> úÉïªÉôåóçæ

Bemærk at i den mode er resultatet ikke nødvendigvis printable, så
det er faktisk ikke korekte at printe strengen ud på den måde.
Avatar billede ferret Nybegynder
15. maj 2003 - 21:24 #16
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 :>
Avatar billede arne_v Ekspert
15. maj 2003 - 21:31 #17
Lad mig starte med den "computer orienterede".

  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);

Det er ret simpelt.
Avatar billede arne_v Ekspert
15. maj 2003 - 21:33 #18
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);
Avatar billede arne_v Ekspert
15. maj 2003 - 21:36 #19
Jeg kan måske illustrere med et eksempel:

E + A -> F

'E' - 'A' = 4
'A' - 'A' = 0
4 + 0 + 1 = 5
'A' + 5 = 'F'

det stemmer.
Avatar billede ferret Nybegynder
15. maj 2003 - 21:39 #20
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.
Avatar billede arne_v Ekspert
15. maj 2003 - 21:43 #21
bogstav - 'A' giver offet i alfabet (A=0,B=1,C=2 ...).

'A' er faktisk 65 i ASCII & IsoLatin1 (og 'a' er 97).

Ja - C har en toupper funktion som kan konvertere enkelte tegn til
uppercase.
Avatar billede arne_v Ekspert
15. maj 2003 - 21:44 #22
Og ja det var helt normalt i gamle dage (papir) at konvertere
alt til uppercase.

Men idag med computere konverterer man normalt alt som 8 bit bytes.
Avatar billede arne_v Ekspert
15. maj 2003 - 21:46 #23
Til sidst et par gode tips til litteratur:

kryptering 3000 f.kr. - 1945 (papir) : Kahns bog på 1000+ sider (det er
næsten 20 år siden jeg læste den så tilgiv mig hvis navnet er forkert stavet)

kryptering 1945- (computer) : Bruce Schneiers Applied Cryptography
Avatar billede ferret Nybegynder
15. maj 2003 - 21:47 #24
toupper, hvilket header ligger den i, og findes den i C++?
Avatar billede arne_v Ekspert
15. maj 2003 - 21:50 #25
ctype.h

ja
Avatar billede ferret Nybegynder
15. maj 2003 - 21:52 #26
Takker, jeg vil se efter de bøger og så gi'r jeg dig point.
Avatar billede arne_v Ekspert
15. maj 2003 - 21:59 #27
Jeg slog lige op på Amazon:

The CODEBREAKERS
David Kahn
Scribner; Revised edition (December 1996)
ISBN: 0684831309

Applied Cryptography
Bruce Schneier
John Wiley & Sons; 2 edition (October 18, 1995)
ISBN: 0471117099
Avatar billede ferret Nybegynder
15. maj 2003 - 22:25 #28
Ved ikke om det er for sent nu, men jeg har et spørgsmål mere: Hvordan skal man dekrypt'e paden? Når nu man har keyen.
Avatar billede arne_v Ekspert
15. maj 2003 - 22:28 #29
Bare omvendt.

Brug minus i.s.f. plus.

(hvis du bruger XOR er kryptering og dekryptering det samme)
Avatar billede ferret Nybegynder
15. maj 2003 - 22:33 #30
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    int i;
    char plain[] = "ONETIMEPAD ";
    char key[] = "TBFRGFARFM";
    char *cipher;
    int l = strlen(plain);
    cipher = (char *)malloc(l);
    for(i=0;i<l;i++) cipher[i] = 'A' + ((plain[i] - 'A') + (key[i % strlen(key)] - 'A') + 1) % 26;
    cipher[l] = '\0';
    printf("%s -> %s\n",plain,cipher);
    for(i=0;i<l;i++) plain[i] = 'A' + ((cipher[i] - 'A') - (key[i % strlen(key)] - 'A') + 1) % 26;
    cipher[l] = '\0';
    printf("%s -> %s\n",cipher,plain);
}
Gi'r mig:

ONETIMEPAD  -> IPKLPSFHGQ4
IPKLPSFHGQ4 -> 7PG<KOG8CF<
Avatar billede ferret Nybegynder
15. maj 2003 - 22:36 #31
Det ekstra firetal kommer fra det ekstra space i 'ONETIMEPAD '
Avatar billede arne_v Ekspert
15. maj 2003 - 22:40 #32
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    int i;
    char plain[] = "ONETIMEPAD";
    char key[] = "TBFRGFARFM";
    char *cipher;
    int l = strlen(plain);
    cipher = (char *)malloc(l);
    for(i=0;i<l;i++) cipher[i] = 'A' + ((plain[i] - 'A') + (key[i % strlen(key)] - 'A') + 1) % 26;
    cipher[l] = '\0';
    printf("%s -> %s\n",plain,cipher);
    for(i=0;i<l;i++) plain[i] = 'A' + ((cipher[i] - 'A') - (key[i % strlen(key)] - 'A') + 25) % 26;
    plain[l] = '\0';
    printf("%s -> %s\n",cipher,plain);
}
Avatar billede ferret Nybegynder
15. maj 2003 - 22:41 #33
TAkker. :>
Avatar billede arne_v Ekspert
15. maj 2003 - 22:41 #34
+1 skulle ændres til -1 og for at få et positvi tal skulle der
ligges 26 til.

-1 + 26 = +25
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester