26. maj 2004 - 14:42Der 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.
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.
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)
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
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.....
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]; }
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]); }
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.
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"
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.