Avatar billede ouch Nybegynder
26. maj 2004 - 14:42 Der er 14 kommentarer og
1 løsning

Nem kryptering i Small?

Jeg skal bruge en nem (den behøver ikke være dødsikker, men heller ikke for let) krypteringsmetode til brug i sproget Small (http://www.compuphase.com/small.htm) der er en "small" udgave af c++.

Jeg kan sagtens skrive funktionerne selv hvis jeg kan få en nogen lunde idiotsikker forklaring af krypteringsmetoden (jeg tænkte på blowfish, RC4 eller RSA Public Certificate). Bare tal, bogstaver og de mest almindelige specialtegn (- _ . , : ; " o.s.v.) skal være understøttet.
Avatar billede hurra Novice
26. maj 2004 - 15:04 #1
jeg er ikke lige sikker på hvad de forskellige metoder du beskriver der betyder, men jeg har en gagn lavet noget der var ret simpelt:
AnsiString Key="En eller anden cryptering nøgle";
AnsiString Text="Den text her skal krypteres";
AnsiString Output;
for(int i=0; i<Text.Length(); i++=
{
Output[i]=Text[i]^Key[i%Key.Length()];
}
Hvis det skal være lidt mere sikkert kan du lave det som:
Output[0] = random(Key.Length());
for(int i=1; i<Text.Length(); i++)
{
Output[i]=Text[i-1]^Key[(Output[0]+i)%Key.Length()];
}

Jeg vil ikke lige garentere for at oven nævte vil virke direkte, men grund princippet er da forklaret.
Avatar billede ouch Nybegynder
26. maj 2004 - 15:10 #2
Og dekryptering? ;)
Avatar billede hurra Novice
26. maj 2004 - 15:16 #3
Kryptering der virker:
char Key[100]="1234";
char Text[100]="Den text her skal krypteres";
char Output[100];
for(int i=0; i<sizeof(Text); i++)
{
  int placeinkey = i%sizeof(Key);
  Output[i]= Text[i] ^ Key[placeinkey];
}
og en dekryptering:
char Key[100]="1234";
char Text[100];
sprintf(Text, "%s", Form1->Caption.c_str());
char Output[100];
for(int i=0; i<sizeof(Text); i++)
{
  int placeinkey = i%sizeof(Key);
  Output[i]= Text[i] ^ Key[placeinkey];
}
Avatar billede ouch Nybegynder
26. maj 2004 - 15:27 #4
Hvad gør:
Form1->Caption.c_str()
og:
i%sizeof(Key)
?
Avatar billede hurra Novice
26. maj 2004 - 15:32 #5
Form1->Caption er bare der hvor jeg lige gemte mit output i. Du kan bare lave en global variabel og gemme det i for at få det samme.
sizeof(Key) angiver længden på stringen Key. Når i tæller op, bliver den på et tidspunkt større end længden af Key, så sklk den begynde forfra igen. Det gøres med % (modulus) som er resten efter heltalt divisionen (fx. 4%3=1, 3%5=3)
Avatar billede ouch Nybegynder
26. maj 2004 - 16:21 #6
Det virker fint (Indtil videre.. har faktisk ikke dekrypteret det endnu =))! Takker!

Hvis nogle skulle være interreseret i Small versionen (af krypteringsfunktionen, har ikke oversat den anden endnu):

Encrypt()
    {
    new Key[100] = "1234";            // Encryption key
    new Text[100] = "Dette er en TEST!";    // Test text
    new Output[100];            // output string
    new i;                    // for() counter

    for(i=0;i<strlen(Text);i++)
        {
        new placeinkey = i%strlen(Key);
        Output[i] = Text[i] ^ Key[placeinkey];
        }

    return PLUGIN_CONTINUE;
    }
Avatar billede ouch Nybegynder
27. maj 2004 - 11:10 #7
Hmm har lidt problem med denne her måde. Hvis Key er f.ek.s 1234 og Text er 1234 sker der ikke en pind.
Avatar billede ouch Nybegynder
27. maj 2004 - 11:23 #8
Så en anden ting. Se hvad der sker når jeg krypterer og så dekrypterer.

Original:
logontest1234
something
133testverylongperhaps space comma .
1.0
test...

log on

Efter kryptering og dekryptering:
logontest1234
something
1
1.0
test
wcv}
tgqs
Avatar billede ouch Nybegynder
14. juni 2004 - 16:08 #9
Bare glem det så...
Avatar billede hurra Novice
14. juni 2004 - 18:47 #10
Undskyld, jeg har ikke set de andre beskeder om det her. Det skal nok passe at hvis din key og din string er den samme går sker der ikke noget, men hvis din key er "agnh9i4nty7ornd" kan det vel også være lige meget :)

Det andet problem har jeg ikke lige noget bud på, med mindre din string er mere end 100 lang (størrelsen input og output er defineret til).

Jeg prøver lige at starte den anden computer op og se om jeg kan finde ud af noget.....
Avatar billede hurra Novice
14. juni 2004 - 19:18 #11
Jeg har lige prøvet at lave det efter. Det ser ud til at problemet er sizeof() den tager størrelsen der er alokeret, og ikke det der er fyldt i stringen. Hvis stringene bliver oprettet til lige nødagtig den størrelse de skal ha, virker det bare. Har du ikke en string ting som AnsiString eller String i det der small ?

Der udover har jeg tænkt over det du sagde med at den ikke gjorde noget med 1234. Hvis nøglen og stringen er den samme, vil jeg nu mene du burde få en tom string returneret, da noget xor med sig selv jo altid vil gi 0. Så det er nok bedt at nøglen bliver af nogle char der aldrig vil findes i dit input fx "#¤%&/()".

Sikke en forklaring, her er lidt kode der forhåbentligt er noget lettere at forstå:

  char Key[4]="1234";
  char Input[27]="Den text her skal krypteres";
  char Output[27];
  for(int i=0; i<sizeof(Input); i++)
  {
      int placeinkey = i % sizeof(Key);
      Output[i] = Input[i] ^ Key[placeinkey];
  }

  Memo1->Text = Output;

  sprintf(Input, "%s", Output);
  for(int i=0; i<sizeof(Input); i++)
  {
    int placeinkey = i%sizeof(Key);
    Output[i] = Input[i] ^ Key[placeinkey];
  }

  Memo2->Text = Output;
Avatar billede hurra Novice
14. juni 2004 - 19:41 #12
Jeg har lige prøvet at skrive det om med AnsiStringe, se er det ikke helt så pylret med og der er noget af nøglen i inputtet. Der ud over har jeg prøvet at lave et "offset" på nøglen. Offsettet bliver gemt på den første plads i outputtet, og kan se igen læses ud der fra. Du kan også evt lave så du ikke gemmer offsettet i outputtet, men blot laver en slags pin kode man skal kende for at kunne dekryptere stringen igen.

  AnsiString Key="text";
  AnsiString Input="Den text her skal krypteres";
  unsigned char offset = random(256);
  AnsiString Output = char(offset);
  for(int i=1; i<=Input.Length(); i++)
  {
      int placeinkey = ((i+offset) % Key.Length()) + 1;
      Output += char(Input[i]^Key[placeinkey]);
  }

  Memo1->Text = Output;

  offset = Output[1];
  Input = Output.Delete(1,1);
  Output = "";
  for(int i=1; i<=Input.Length(); i++)
  {
      int placeinkey = ((i+offset) % Key.Length()) + 1;
      Output += char(Input[i]^Key[placeinkey]);
  }

  Memo2->Text = Output;
Avatar billede hurra Novice
14. juni 2004 - 19:59 #13
Nu lover jeg det blive sidste gang i denne omgang jeg skriver, men jeg kom til at tænke på noget jeg for noget tid siden havde læst omkring hvordan bluetooth protokollen virker. Der er også nogel char man ikke vil ha ud i luften, se disse bliver pakket ind inden, og så satser man på at der ikke vil være andet der kan forvækslet med denne "indpakning".

Hvis der nogle steder i den krypterede string er en char med værdien null (hvilket jo normalt betyder at stringen er slut), vil denne nu bliver skiftet ud med texten "null" (find evt på noget bedre så man ikke lige gætte på at man kan forstå det der står).

Når der skal afkrypteres, vil stringen "null" blive decrypteret som værdien null.

  AnsiString Key="text";
  AnsiString Input="Den text her skal krypteres";
  unsigned char offset = random(256);
  AnsiString Output = char(offset);
  for(int i=1; i<=Input.Length(); i++)
  {
      int placeinkey = ((i+offset) % Key.Length()) + 1;
      char tp = char(Input[i]^Key[placeinkey]);
      if(tp != 0)
        Output += tp;
      else
        Output += "null";
  }

  Memo1->Text = Output;

  offset = Output[1];
  Input = Output.Delete(1,1);
  Output = "";
  for(int i=1, j=1; i<=Input.Length(); i++, j++)
  {
      int placeinkey = ((j+offset) % Key.Length()) + 1;
      if(Input.SubString(i, 4) != "null")
        Output += char(Input[i]^Key[placeinkey]);
      else
      {
        Output += char(0^Key[placeinkey]);
        i+=3;
      }
  }

  Memo2->Text = Output;
Avatar billede hurra Novice
14. juni 2004 - 20:02 #14
Jeg burde forresten ha lavet nogle kommentare:
i linien med
      if(Input.SubString(i, 4) != "null")
er 4 tallet pga længden af stringen "null"
I den 3 sidste linie med:
      i+=3;
er 3 tallet fordi der skal skringes frem til enden af stringen "null", der vil blive lagt 1 til i i for løkken, altså mangler der stadig 3 for at kommer forbi "null"
Avatar billede ouch Nybegynder
14. juni 2004 - 21:54 #15
Oooookayy.. Noget at gå igang med :)

Prøver igen.
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