Avatar billede superdude Nybegynder
09. juli 2003 - 22:03 Der er 11 kommentarer og
1 løsning

Skriv/læs krypteret fil

Hej Eksperter

Jeg er ved at lære C++, og i den forbindelse har jeg lavet et simpelt spil (konsol - gæt et tal) ...Man skal jo starte et sted ;-)

Nu vil jeg gerne implementere en highscore-funktion. Mit problem er bare at når jeg skriver scores i en tekst-fil kan man jo bare åbne denne fil i notepad og redigere i scoren, og dermed snyde på denne måde.

Selvom mit "spil" på ingen måde skal bruges til andet end at få mig igang med C++, er jeg alligevel nysgerrig efter at vide hvordan man skal tackle dette problem.

Skal man kryptere scoren inden man gemmer den?
Kan man skrive til en fil der kun kan åbnes af spillet?
Hvad kan man gøre?

Superdude
Avatar billede arne_v Ekspert
09. juli 2003 - 22:07 #1
Hvis du offentliggør source, så kan du ikke forhindre snyd.

Hvis sourcen er hemmelig, så er det en oplagt mulighed
at kryptere filen.
Avatar billede arne_v Ekspert
09. juli 2003 - 22:09 #2
Hvis du gememer high score som binært tal og scrambler
det lidt f.eks. med ^0xAAAAAAAA, så kan det ihvertfald ikke
rettes med notepad.
Avatar billede zyxtem Nybegynder
09. juli 2003 - 22:12 #3
Ved godt det ikke er mit spørgsmål men arne gider du ik forklare din løsning list nærmere (forstår til og med det med det binære tal, men scrambler med ^0xAAAAAAA???) ... du får selvfølgelig points for det :)
Avatar billede arne_v Ekspert
09. juli 2003 - 22:15 #4
OK - stay tuned.
Avatar billede arne_v Ekspert
09. juli 2003 - 22:18 #5
Her er et lile stykke kode:

#include <stdio.h>

int main()
{
  int v1,v2,v3;
  v1 = 12345;
  v2 = v1 ^ 0xAAAAAAAA;
  v3 = v2 ^ 0xAAAAAAAA;
  printf("%d -> %d -> %d\n",v1,v2,v3);
  printf("%08X -> %08X -> %08X\n",v1,v2,v3);
}


output fra det er:

12345 -> -1431659885 -> 12345
00003039 -> AAAA9A93 -> 00003039
Avatar billede arne_v Ekspert
09. juli 2003 - 22:19 #6
^ er XOR operatoren som laver XOR på bit niveau.

0xAAAAAAAA er bare et heltal med hver anden bit sat.
Avatar billede arne_v Ekspert
09. juli 2003 - 22:21 #7
Man kunne msåke forbedre lidt med:

#include <stdio.h>

int main()
{
  int v1,v2,v3;
  v1 = 12345;
  v2 = (1000000000 + v1) ^ 0xAAAAAAAA;
  v3 = (v2 ^ 0xAAAAAAAA) - 1000000000;
  printf("%d -> %d -> %d\n",v1,v2,v3);
  printf("%08X -> %08X -> %08X\n",v1,v2,v3);
}

som giver:

12345 -> -1859104621 -> 12345
00003039 -> 91305093 -> 00003039
Avatar billede superdude Nybegynder
09. juli 2003 - 22:28 #8
OK - selvom jeg vist skal have fat i noget dokumentation for at forstå din kode helt ;-)

Men det er altså kryptering der er vejen frem, kan jeg forstå.

Tak for det ;-)
Avatar billede arne_v Ekspert
09. juli 2003 - 22:30 #9
Den her kryptering er så simpel at der mere er scrambling end
egentlig kryptering.

Men det er formentlig godt nok til formålet.
Avatar billede zyxtem Nybegynder
09. juli 2003 - 22:32 #10
takker arne, der ligger et spg til dig ommelidt :)
Avatar billede superdude Nybegynder
09. juli 2003 - 22:37 #11
Jeps - perfekt. Takker
Avatar billede soreno Praktikant
09. juli 2003 - 22:42 #12
Se f.eks. dette:

dec(9) er bin(1001)
dec(3) er bin(11)

En int er 32 bit, så computeren ser tallene sådan:
00000000 00000000 00000000 00001001
00000000 00000000 00000000 00000011

Så xor'er man hver bit med hinanden.

Denne tabel fortæller hvad resultatet er:
input1 input2 output
  0      0        0
  0      1        1
  1      0        1
  1      1        0

      1001
xor  0011
---------   
      1010

Altså er:
9 ^ 3 = 10
10 ^ 3 = 9

Så man kan sige at 3 er nøglen. Og 9 er plaintext, altså source og 10 er kodet, altså destination.

source xor key = destination
destination xor key = source
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