27. april 2003 - 22:09Der 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.
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
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?
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','+','/'
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...
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.
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.
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 :)
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.
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.
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.
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.