.wav/.ogg Files "verstecken"

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

.wav/.ogg Files "verstecken"

Beitrag von diceman »

Hallo ihr Lieben,
Eine Frage bezüglich Sound-Implementierung ... ich habe für mein Spiel rund 50 kurze Soundfiles, einige im .wav-Format, andere im .ogg-Format. Einige davon sind auch lizensiert, also man erwartet von mir, daß ich diese irgendwie "verstecke", ob im Programmcode selbst oder in einer externen library, wie auch immer.
Ich bin vertraut mit den IncludeBinary() und CatchSound()-Funktionen, ich nutze diese bereits um die Musikstücke von meinem Komponisten im Code zu verstecken, das klappt sehr gut. Dadurch wird natürlich das .exe-File sehr groß - eigentlich möchte ich nur sicherstellen, daß dies kein längerfristig kein Problem darstellt (ich nutze für die Musikfiles bereits die platzsparende .ogg-Variante), bzw. ob es Alternativen gibt, die eventuell besser geeignet sind für viele kurze Sound-Schnippsel.
Vielen Dank.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: .wav/.ogg Files "verstecken"

Beitrag von Mijikai »

Also m.M.n. sollte es reichen die Sound-Files verschlüsselt abzuspeichern auch weil as Aufnehmen über die Soundkarte immer eine (sehr einfache) Angriffsmöglichkeit ist und bleibt.
Mehr Sicherheit (für das Programm selbst) würde z.B. Streaming bieten -> nur kleine Packete entschlüsseln und and den Soundbuffer übergeben.
Hier müsste schon die Streaming Funktion bei einem Angriff gehookt und die Packete als Soundfile neu abgespeichert werden.
Dies wäre schonmal viel aufwändiger als nur den Speicher nach ganzen Soundfiles zu scannen.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: .wav/.ogg Files "verstecken"

Beitrag von diceman »

Um Gottes Willen, sowas erwartet kein Mensch von mir. :freak: :D
Nein, dann mache ich das so weiter wie bisher, mit CatchSound() und IncludeBinary(). Klappt ja auch zufriedenstellend bisher. Wollte nur mal die Optionen abgeklopft haben, weil das so ein Gebiet ist, mit dem ich mich wenig auskenne.
Danke.🙂
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: .wav/.ogg Files "verstecken"

Beitrag von GPI »

per includebinary würde ich es nicht machen, das Zeug ist sonst zweimal in Speicher. Einmal in deiner Datasection und einmal nach "Catch" - das kann einiges summieren.

ich würde die Pack-Routinen benutzen (CreatePack/OpenPack). Alles in eine Datei reinschmeißen und damit laden und mit den Catch* Befehlen zur Verwendung freigeben.

ich würde die Laderoutine so schreiben, das während des Debuggers die Dateien direct aus einen GameData-Folder geladen waren (falls vorhanden), ansonsten immer aus einer Comprimierten datei.

Wenn du noch ein bischen verschlüsseln willst, kannst du den Buffer ja vorher noch mit "xor" bearbeiten. Eine komplizierte AES-Verschlüsselung würde ich nicht nehmen, da sie keine Vorteile bringt (der entschlüsselungscode muss ja in Programm sein).
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: .wav/.ogg Files "verstecken"

Beitrag von diceman »

So, danke euch nochmal. :)
Ich habe eine zufriedenstellende Lösung gefunden, denke ich, und zwar ist es mit der AES-Verschlüsselungs-Bibliothek von PureBasic möglich, Soundfiles zu "crypten", und dann als neue Files speichern. Der folgende Code ist nicht von mir, ich habe ihn hier gefunden, und für meine Zwecke angepasst.
Beim Start werden die entsprechenden Files eingelesen und mit demselben Schlüssel "decrypted" und dann via CatchSound() im Speicher behalten.
Das sollte für so'n kleines Hobbyprojekt reichen, denke ich.

ENCRYPT

Code: Alles auswählen

sFile.s = "mySound.ogg"

;// Read file to encrypt
hFile = ReadFile(#PB_Any, sFile)
lenbuf = Lof(hFile)
*original = AllocateMemory(lenbuf)
ReadData(hFile, *original, lenbuf)
CloseFile(hFile)

;// Encrypt data (from *original to *encrypted buffer)
*encrypted = AllocateMemory(lenbuf)
AESEncoder(*original, *encrypted, lenbuf, ?cipherkey, 128, ?IV, #PB_Cipher_CBC)

;// Save encrypted data
hFile = CreateFile(#PB_Any, sFile+".encrypted")
WriteData(hFile, *encrypted, lenbuf)
CloseFile(hFile)

;// Free resources
FreeMemory(*original)
FreeMemory(*encrypted)
End

           
DataSection
  cipherkey:
  Data.a 189,241,42,69,120,149,97,14,243,149,71,57,160,156,179,143  ;16 bytes for 128-bit AES (use 32 for 256)
  IV:
  Data.a 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0           ;IV is always 16 bytes regardless of 128/192/256
EndDataSection

DECRYPT

Code: Alles auswählen

InitSound()
UseOGGSoundDecoder() 
Define newSound
sFile.s = "mySound.ogg.encrypted"

;// Read file to decrypt
hFile = ReadFile(#PB_Any, sFile)
lenbuf = Lof(hFile)
*original = AllocateMemory(lenbuf)
ReadData(hFile, *original, lenbuf)
CloseFile(hFile)

;// Decrypt encrypted data (from *encrypted to *decrypted buffer)
*decrypted = AllocateMemory(lenbuf)
AESDecoder(*original, *decrypted, lenbuf, ?cipherkey, 128, ?IV, #PB_Cipher_CBC)

newSound = CatchSound(#PB_Any, *decrypted, lenbuf)
PlaySound(newSound)
Delay(5000)		;test if sound plays properly

;// Free resources
FreeMemory(*original)
FreeMemory(*decrypted)
End

           
DataSection
  cipherkey:
  Data.a 189,241,42,69,120,149,97,14,243,149,71,57,160,156,179,143  ;16 bytes for 128-bit AES (use 32 for 256)
  IV:
  Data.a 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0           ;IV is always 16 bytes regardless of 128/192/256
EndDataSection
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Antworten