Avatar billede cr2000 Nybegynder
27. april 2003 - 22:09 Der er 42 kommentarer og
1 løsning

Simpel og hurtig "kryptering" af mp3 filer.

Da jeg er ved at lave et system(Lovligt) som spiller mp3 filer ude på diverse barer vil jeg jo ikke have at folk kan hente filerne ud af den maskine og bruge dem til ejet forbrug. Musikken er under licens hvis nogle skulle spørge.

problemet ligger i at musikken skal kunne åbnes hurtigt men kun af mit program selvfølgelig.

Jeg ved ikke om en egenlig kryptering er nødvendig. Og hvis det skal krypteres skal det være hurtigt at åbne igen.

Håber i kan komme men nogle geniale ideer.
Avatar billede dkn Nybegynder
27. april 2003 - 22:28 #1
Ved snart ikke, man kunne vel evt lave en database hvor filerne lå, det ville jo også gøre det nemmere at søge efter sange. Databasen kunne der så sættes pass på (ved ikke lige hvor sikkert det er), men filerne kunne jo også stadig krypteres der i.

Syntes du bare skulle prøve at se på noget Base64 file encryption
Avatar billede cr2000 Nybegynder
27. april 2003 - 22:32 #2
Nu ved jeg ikke hvor hurtigt sådan noget Base64 kryptering er.
Men det skal lige tages med at den skal kunne åbne filen hurtigt nok til at man kan lave en crossfade funktion :)

Det med databasen lyder spændene men jeg aner ikke hvordan man bruger databaser.
Noget du kender noget til og vil dele lidt ud af?
Avatar billede arne_v Ekspert
27. april 2003 - 22:38 #3
base64 encoding og decoding er lynhurtig (men ikke rigtig
kryptering/dekryptering).
Avatar billede cr2000 Nybegynder
27. april 2003 - 22:44 #4
Bare den normale tosse på baren/diskoteket ikke kan få åbnet filen.

Hvor finder jeg dette. Det skulle vel aldrig være noget indy?
Avatar billede arne_v Ekspert
27. april 2003 - 22:46 #5
base64 encoding er bare at dele 3 x 8 bit op i 4 x 6 bit og bruge 6 bits
værdierne som index i:
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'
Avatar billede arne_v Ekspert
27. april 2003 - 22:49 #6
Der er en teknisk beskrivelse i http://rfc.sunsite.dk/rfc/rfc2045.html
(et godt stykke nede).
Avatar billede cr2000 Nybegynder
27. april 2003 - 23:12 #7
Nu har jeg siddet og rodet lidt med indy sjoveren. Men kan ikke helt få lavet noget som kan gøre noget som helts ved en fil.

Du har ikke et eksempel ved hånden der udføre noget fil cryptering med base64
Avatar billede arne_v Ekspert
28. april 2003 - 05:06 #8
Kun i C ikke i Delphi.

Jeg kan lave et i aften, hvis ikke andre har noget.
Avatar billede ziron Nybegynder
28. april 2003 - 11:42 #9
en start du måske kunne bruge:

http://aspalliance.com/mamanze/articles/?path=base64

/ZIRON
Avatar billede ziron Nybegynder
28. april 2003 - 11:45 #10
http://www.chilkatsoft.com/ChilkatCryptDelphi.asp#symm

og ellers tag et kig på google. alt kan findes og hurtigt enda...

/ZIRON
Avatar billede cr2000 Nybegynder
29. april 2003 - 12:06 #11
Arne V>> Det ville jeg blive meget glad for :)
Avatar billede cr2000 Nybegynder
29. april 2003 - 12:15 #12
Ziron > Har prøvet at kigge på google. Men jeg kunne kun finde en masse om højsikkerheds kryptering. Og det er ikke lige det jeg har brug for.

Det her skal bare være så sikkert som muligt og frem for alt hurtigt.
Avatar billede jpvj Nybegynder
29. april 2003 - 12:18 #13
Base64 har intet med kryptering at gøre. Det en kodningsform og ikke en kryptering(US: Encoding VS encryption).

Generelt gælder: Hvis noget skal være sikkert, så lad være med at "opfinde" det selv. Sikker kryptering kræver gennemarbejdet matematik. Tro mig... det er de færreste, der "finder" på det selv.

Problemet med et sådan system som du vil lave, er ALTID, at nøglen/algoritmen til at dekryptere med naturligvis skal ligge i softwaren. Enhver pilfinder kan så skille det ad, og hente informationerne ud. Det er der INTET at gøre ved. Det var samme situation, der gjorde sig gældende med DVD krypteringen. En 16 årig norsk dreng, hentede nøglen ud af Xing playeren. Den var ikke særligt godt skjult/beskyttet, men ...

Hvis du bare vil scramble dine data, så kan du XOR'e dem med en fast nøgle. Nøglen kan evt. opdateres med outputtet af cryptofunktionen, men hvad hjælper det...

Ex:
Input data: b_0 b_1 b_2 b_3 ... b_n
Nøgle (symmetrisk): k_0 k_1 k_2 k_3 k_4
Output: c_0 c_1 c_2 c_3 ... c_n

Krypteringsfunktionen vil så se ud som følger:
E(b_i) = ci = bi XOR k_(i mod 5)

Dekrypteringsfunktionen er (naturligvis) identisk:
D(c_i) = c_i XOR k_(i mod 5) = bi XOR k_(i mod 5) XOR k_(i mod 5) = b_i.

JP
Avatar billede cr2000 Nybegynder
29. april 2003 - 12:32 #14
Og en anden ting som spiller ind er at filen ikke må bliver meget mere støre...
Avatar billede arne_v Ekspert
29. april 2003 - 12:38 #15
Så er base64 ikke løsningen.

Base64 gør filer 33% større.
Avatar billede jpvj Nybegynder
29. april 2003 - 12:40 #16
Så er XOR jo oplagt: Hurtig, enkel og expansion factor=1 :-)
Avatar billede arne_v Ekspert
29. april 2003 - 12:44 #17
Det er ikke svært at lave et eller andet.

Jeg lavede følgend ekode til et andet spørgsmål her på eksperten:

program crypt;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function encrypt(tekst,kode:string):string;
var
  I: integer;
begin
  for I := 1 to length(tekst) do
  begin
    tekst[I] := chr(ord(tekst[I])+ord(kode[(I mod length(kode))+1]));
  end;
  result := tekst;
end;

function decrypt(tekst,kode:string):string;
var
  I: integer;
begin
  for I := 1 to length(tekst) do
  begin
    tekst[I] := chr(ord(tekst[I])-ord(kode[(I mod length(kode))+1]));
  end;
  result := tekst;
end;
var
  t : string;
begin
    t := 'Dette er en prøve';
    writeln(decrypt(encrypt(t, 'hemmeligt'), 'hemmeligt'));
    t := '';
    writeln(decrypt(encrypt(t, 'hemmeligt'), 'hemmeligt'));
end.
Avatar billede cr2000 Nybegynder
29. april 2003 - 12:58 #18
jpvj  << Det lyder som noget jeg kan bruge :)

Da jeg ikke er vildt inde i "grund bits og bytes programering" ville det være alt for genialt hvis du kunne lave et lille eksempel til mig.

Mvh Christian Reinholdt..
Avatar billede cr2000 Nybegynder
20. maj 2003 - 00:46 #19
Er der ikke en der har et link eller eksempel til noget XOR til filer?
Avatar billede arne_v Ekspert
20. maj 2003 - 00:59 #20
Det er ret simpelt.

Du åbner en input-fil og en output-fil, så læser du alt data
fra input-filen i klumper og sender dem gennem encrypt
funktionen (se ovenfor i min 29/4 kommentar) og skriver ud
til output-filen.
Avatar billede cr2000 Nybegynder
20. maj 2003 - 01:02 #21
Jeg har aldrig lavet noget som helst "grund fil programering" så du bliver dessvære nødt(Hvis du gider) til at vise mig et eksempel for at jeg fatter det :)
Avatar billede arne_v Ekspert
20. maj 2003 - 04:30 #22
Eksempel:

program FileEncrypt;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i,nobyt : integer;
  key : string;
  infile,outfile : file;
  buffer : array [1..1] of char;

begin
  key := 'hemmelig';
  assign(infile,'C:\z.1');
  reset(infile,1);
  assign(outfile,'C:\z.2');
  rewrite(outfile,1);
  nobyt := 0;
  while not eof(infile) do begin
    blockread(infile,buffer,1);
    buffer[1] := chr(ord(buffer[1])+ord(key[(nobyt mod length(key))+1]));
    nobyt := nobyt + 1;
    blockwrite(outfile,buffer,1);
  end;
  close(infile);
  close(outfile);
end.
Avatar billede arne_v Ekspert
20. maj 2003 - 04:32 #23
Det er ikke særligt effektivt, men det skulle virke.

Decrypt er helt det samme bare med - i.s.f. +.
Avatar billede arne_v Ekspert
20. maj 2003 - 04:34 #24
Vrøvl.

Det skulle jo væe XOR.

Så:

program FileEncrypt;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i,nobyt : integer;
  key : string;
  infile,outfile : file;
  buffer : array [1..1] of char;

begin
  key := 'hemmelig';
  assign(infile,'C:\z.1');
  reset(infile,1);
  assign(outfile,'C:\z.2');
  rewrite(outfile,1);
  nobyt := 0;
  while not eof(infile) do begin
    blockread(infile,buffer,1);
    buffer[1] := chr(ord(buffer[1]) xor ord(key[(nobyt mod length(key))+1]));
    nobyt := nobyt + 1;
    blockwrite(outfile,buffer,1);
  end;
  close(infile);
  close(outfile);
end.
Avatar billede arne_v Ekspert
20. maj 2003 - 04:34 #25
og med XOR er decrypt det samme som encrypt.
Avatar billede cr2000 Nybegynder
20. maj 2003 - 13:58 #26
Ok... nu har jeg prøvet at xor en mp3 fil med arne's eksempel. Det går sgu for langsomt. :(

Der må en anden løsning til. Evt kun xor starten af filen eller lig. Bare filen ikke kan åbnes i en almindelig mp3 afspiller.
Avatar billede arne_v Ekspert
20. maj 2003 - 14:00 #27
Den kan optimeres meget ved at læse flere bytes af gangen.

Skal jeg prøve at lave en hurtigere version ?
Avatar billede cr2000 Nybegynder
20. maj 2003 - 14:01 #28
Den skal gå meget meget stærkere!... Tænk på at den skal gøre det lige før filen skal bruges til at lave crossfade med forige nummer...
Avatar billede cr2000 Nybegynder
20. maj 2003 - 14:02 #29
Kan du så ikke også skrive lidt tekst ved linjerne?... Så jeg det være jeg selv kan hitte ud af det til sidst.
Avatar billede arne_v Ekspert
20. maj 2003 - 14:22 #30
OK.

Jeg kigger på det i aften.
Avatar billede cr2000 Nybegynder
20. maj 2003 - 14:26 #31
Programmet skal kører på en ca 300 mhz computer så jeg har ikke så meget at arbejde med :(
Avatar billede arne_v Ekspert
20. maj 2003 - 20:34 #32
Her er en tunet udgave (60 doblede hastigheden på min maskine):

program FileEncrypt;

{$APPTYPE CONSOLE}

uses
  Windows,SysUtils;

const
  N = 1000000;

var
  i,nobyt,actual,t : integer;
  key : string;
  infile,outfile : file;
  buffer : array [1..N] of char;

begin
  key := 'hemmelig';
  t := GetTickCount;
  assign(infile,'C:\z.1');
  reset(infile,1);
  assign(outfile,'C:\z.2');
  rewrite(outfile,1);
  nobyt := 0;
  while not eof(infile) do begin
    blockread(infile,buffer,N,actual);
    for i := 1 to actual do begin
        buffer[i] := chr(ord(buffer[i]) xor ord(key[((nobyt+i) mod length(key))+1]));
    end;
    nobyt := nobyt + actual;
    blockwrite(outfile,buffer,actual);
  end;
  close(infile);
  close(outfile);
  writeln((GetTickCount-t),' milliseconds');
end.
Avatar billede arne_v Ekspert
20. maj 2003 - 20:42 #33
Jeg prøver også lige at skrive noget forklaring til det.
Avatar billede cr2000 Nybegynder
20. maj 2003 - 21:27 #34
Takker takker... Hvor hurtig er den om 10mb?
Avatar billede arne_v Ekspert
20. maj 2003 - 21:30 #35
På min PC tager 17 MB 0.9 sekund.

Men altså også Athlon XP 2000+.

Det er dog næppe CPU MHz men snarere hard-disk hastighed
der er afgørende.
Avatar billede arne_v Ekspert
20. maj 2003 - 21:46 #36
Lidt kommentarer (ovenikøbet på dansk, hvilket er usædvaneligt for mig):

program FileEncrypt;

{$APPTYPE CONSOLE}

uses
  Windows,SysUtils;

const
  N = 1000000; (* buffer størrelse, større => hurtigere men kræver mere RAM *)

var
  i,nobyt,actual,t : integer; (* nobyt = total antal bytes læst, actual = faktisk læst antal bytes i en read *)
  key : string; (* krypterings nøgle *)
  infile,outfile : file; (* input og output fil *)
  buffer : array [1..N] of char; (* buffer *)

begin
  key := 'hemmelig';
  t := GetTickCount; (* gem start tid *)
  assign(infile,'C:\z.1');
  reset(infile,1); (* åben input fil for read *)
  assign(outfile,'C:\z.2');
  rewrite(outfile,1); (* ¨ben output fil for write *)
  nobyt := 0;
  while not eof(infile) do begin (* så længe der er mere data *)
    blockread(infile,buffer,N,actual); (* læs klump af data til buffer *)
    for i := 1 to actual do begin (* krypter alle bytes i buffer *)
        buffer[i] := chr(ord(buffer[i]) xor ord(key[((nobyt+i) mod length(key))+1]));
    end;
    nobyt := nobyt + actual;
    blockwrite(outfile,buffer,actual); (* skriv buffer *)
  end;
  close(infile);
  close(outfile);
  writeln((GetTickCount-t),' milliseconds'); (* udskriv slut - start tid *)
end.
Avatar billede cr2000 Nybegynder
20. maj 2003 - 22:01 #37
Jeg ved nu ikke rigtigt :)

Syntes den afsløre koden lidt i enden af filen :)

http://bpracing.dk/screenshot.JPG
Avatar billede arne_v Ekspert
20. maj 2003 - 22:04 #38
Sådan er det med XOR !

nul bytes XOR hemmelig kode giver hemmelig kode
Avatar billede arne_v Ekspert
20. maj 2003 - 22:06 #39
Den har selveste Microsoft forset sig imod, læs:

http://snake.cs.tu-berlin.de:8081/~schwartz/pmh/elser/password.html
Avatar billede arne_v Ekspert
20. maj 2003 - 22:07 #40
Hvis du skal have noget bedre end det så skal du skifte algoritme.
Avatar billede cr2000 Nybegynder
20. maj 2003 - 22:11 #41
Det er også lige meget... :) Bare filen ikke kan åbnes sådan bare lige...
Avatar billede arne_v Ekspert
20. maj 2003 - 22:15 #42
Den her er også XOR baseret men er nok lidt svæerere at bryde:

program FileEncryptX;

{$APPTYPE CONSOLE}

uses
  Windows,SysUtils;

const
  N = 1000000; (* buffer størrelse, større => hurtigere men kræver mere RAM *)

var
  i,actual,t : integer; (* actual = faktisk læst antal bytes i en read *)
  key : integer; (* krypterings nøgle *)
  infile,outfile : file; (* input og output fil *)
  buffer : array [1..N] of char; (* buffer *)

begin
  key := 12345678;
  randseed := key;
  t := GetTickCount; (* gem start tid *)
  assign(infile,'C:\z.1');
  reset(infile,1); (* åben input fil for read *)
  assign(outfile,'C:\z.2');
  rewrite(outfile,1); (* åben output fil for write *)
  while not eof(infile) do begin (* så længe der er mere data *)
    blockread(infile,buffer,N,actual); (* læs klump af data til buffer *)
    for i := 1 to actual do begin (* krypter alle bytes i buffer *)
        buffer[i] := chr(ord(buffer[i]) xor trunc(random*256));
    end;
    blockwrite(outfile,buffer,actual); (* skriv buffer *)
  end;
  close(infile);
  close(outfile);
  writeln((GetTickCount-t),' milliseconds'); (* udskriv slut - start tid *)
end.
Avatar billede cr2000 Nybegynder
20. maj 2003 - 22:18 #43
Du skal have et stort tak for hjælpen !
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