Kezdőoldal » Tudományok » Alkalmazott tudományok » Hangkártyából random entrópia...

Hangkártyából random entrópia forrás kinyerése hogy?

Figyelt kérdés

Legyen egy monó hangcsatorna 44100 Hz mintavételezésű 16 bit bitmélységű integer input forrás. Ennél a konstrukciónál az elméleti maximális true randomgenerátor forrás 44100*16 bit/sec ami kb 689 kilobit/sec. Ehhez az kéne hogy inputnak a teljes spkretumon egyenletes eloszlással olyan intenzitással ahol a határértékét elérte az input ami éppen még torzításmentes.


Gyakorlatban ennél messze kevesebb valódi értékes entrópiaforrás. Valamifajta egyszerűsítését keresem a Kolmogorov-komplexitásának, hiszen az kvázi kiszámíthatatlanul nehéz feladat. Az se baj ha 2x lassabb entrópiaforrást nyerek ki belőle mint amennyi a Kolmogorov-komplexitása, vagy c-szer rosszabbat, ha c az nem túl nagy. Persze ha van jobb közelítése eme komplexitás számításához és így entrópiaforrás generálásához akkor legyen az, ha értelmes számítási kapacitáson belül marad.


Például ha inputnak csupa zéró bájt jön, dehát abszolút csend van az inputon akkor az én követelményem szerint egy rossz randomgenerátor ha az ontja magából az inputból számított randomot.

Az input függvényében a randomgenerátor úgy számítandó ebből, hogy vesztességes titkosítást hajtok végre rajta. Például AES titkosítást CBC módban, a kulcsot és az inicializálási vektort valahogy előállítom, ez lehet más forrásból is, vagy más forrásból belekeverve a hangrátya inputával ötvözve például a /dev/random-ból. Majd (az AES-ben 16 bájt a blokkméret) , 64 blokkonként csak 1 blokkot küldök a generátor outputjára. Persze még mást is belekeverhetek az inputba, az aktuális pontos időt, az aktuális cpu hőmérségletet, az aktuális cpu interrupt számot stb. Ezek már csak plusz részletkérdések. A lényeg azon van a kérdésben hogy csupán a hangkártya bementetéből hogy nyerhető ki az entrópiaforrás, a csuppa zéró hang input értéket csak példának mondtam hogy triviális hogy akkor blokkolni kell a generátoromnak, míg kacifántosabb helyzetben a kimenti sebességet növelni/csökkenteni az input függvényében.



2022. dec. 9. 17:19
1 2
 11/20 anonim ***** válasza:
100%
Nem "kell" a nagy blokk. Csak azért írtam, hogy a maximumra mennék, mert minél nagyobb egy blokk, annál kisebb a konstans overhead aránya benne: 1 másodperc alatt egyszer kódolja le a hálózati búgást, nem tízszer, így talán kicsit többet lehet kifacsarni belőle. De ha az ffmpeg nem tud akkorát, akkor nem érdemes vele foglalkozni.
2022. dec. 13. 08:17
Hasznos számodra ez a válasz?
 12/20 anonim ***** válasza:
100%
Ja és a másik, hogy egymást követő blokkoknak óhatatlanul van mutual information-e, tehát az előző blokk spektrumát ismerve a következőt jobban is lehetne tömöríteni, mint önállóan. Nagy blokkokat használva a mutual information aránya alacsonyabb, mert időben jobban szeparáltak a minták, így "függetlenebbek" a blokkjaid. Ugyanakkor gondolom ha ez komoly tényező lenne a tömörítés tekintetében, akkor eleve ilyenek lennének a top enkóderek. Valószínűleg annyira kicsi a többlethaszna, hogy nem éri meg ezzel vacakolni, és tisztább függetlenül kódolni a blokkokat.
2022. dec. 13. 08:28
Hasznos számodra ez a válasz?
 13/20 anonim ***** válasza:
100%

"Például 4-el elosztva : felét kidobja randomeldobáló segédfüggvény az így megmaradt pcm bájtokat enkriptálja az AES, az AES enkriptált bájtjainak a felét is eldja az eldobó segédfüggvény."


Ezt nem teljesen értem. Miért kéne bármit is eldobálni? Ahogy a PCM jelsorozatod elér legalább n byte-nyira becsült entrópiát, generálsz belőle n byte-ot, és kész. Ha az n entrópiát 4n nyers PCM byte alatt éred el, akkor azzal a 4n byte-tal seedelsz, ha 100n byte alatt éred el, akkor azzal a 100n byte-tal. Nem kell túlbonyolítani a dolgokat.

2022. dec. 13. 11:43
Hasznos számodra ez a válasz?
 14/20 A kérdező kommentje:

Kipróbáltam az ffmpeg-el úgy is, hogy csövön kapja a mikrofonból nyers pcm-ben a bemenetet a flac-ot pedig fájlba menti. Menet közben is belehallgattam a flac fájlba, ekkor a lejátszó programok nem jelzik hogy milyen hosszú a média, csak miután végzett az ffmpeg. Kipróbáltam úgy is, hogy a bemenetet csövön kapja a flac kimenetet pedig másik csőbe írja amit másik processz dolgoz fel, egy az egybe fájlba kiírtam a cső tartalmát, ez esetben nem jelzi előre a tartalom hosszát a lejátszó. Szerintem ez normális, mert a fejléc ekkor nem tartalmazza a hosszt, az ffmpeg nem seek-elhet vissza a fejléchez ha csőbe ír.

Nekem ez lenne a kézenfekvő, hogy az ffmpeg-en csöveken keresztül menne input + output és nem tárolni, csak addig még az algortimus feldolgozza mint entrópiaforrást. Azt írtam múltkor hogy az eredeti nyers pcm inputot csonkítanám a randomgenerátorom számára. Viszont ahogy nézem technikailag kényelmesebb lenne a flac stream bájtjait randomizáltan csonkítani ezt enkriptálni stb.

Jól látom, hogy ez is van olyan biztonságos matematikailag, technikailag?

2022. dec. 13. 12:13
 15/20 A kérdező kommentje:

"Ezt nem teljesen értem. Miért kéne bármit is eldobálni?"

Azért kell eldobálni, mert C*n bájt jön tömörítetlenül a nyers pcm-ben a hangkártyából. Amit vesztességmentesen flac-ba tömörítve n darab bájt lesz belőle. Azt felételezzük, hogy a Kolmogorov-komplexitása legalább n/4 bájt. Ezért a 3/4-ét el kell dobálni így vagy úgy. Ha egy az egybe ráeresztem az AES-t akkor nem dobál el belőle semmit.

2022. dec. 13. 12:20
 16/20 anonim ***** válasza:
100%

Akkor félreértetted, amit a 7-esben javasoltam. A FLAC-nak mindössze annyi a dolga, hogy segítsen megbecsülni, hogy a jeledben mennyi entrópia van. Összefoglalva, az általam javasolt metódus:

raw: nyers PCM jel, 2*m byte (16-os bitmélységet írtál)

flac: n byte tömörített jel, m blokkmérettel

approx_entropy: n/4 vagy hasonló (n-overhead)/paranoiafaktor alakú függvény


Ezután sha3.absorb(raw)

És a véletlengenerátorod: sha3.squeeze(approx_entropy)


Remélem így érthető. Semmi, az égvilágon semmi értelme egyetlen byte-ot is eldobni bármiből. Az az SHA-3 dolga, hogy a hosszú inputból rövid, de maximális entrópiájú outputot csináljon, nem a tied. Nem tudod nála jobban csinálni. Neked az egyetlen dolgod, hogy gondoskodsz róla, hogy az SHA-3 inputban valóban legyen annyi entrópia, mint ahány byte-ot utána kikérsz tőle.

2022. dec. 13. 13:24
Hasznos számodra ez a válasz?
 17/20 A kérdező kommentje:

Így már értem mire gondolsz, eresszek rá hash függvényt.

Viszont gondolj bele az implenetáció szempontjából.

Van egy gyerekfolyamatom ami az ffmpeg, ennek bemenete és kimenete be van kötve a fő folyamatba. A fő folyamat olvassa a hangkártya inputot amit névtelen csövön küld az ffmpeg gyerekfolyamatnak. A fő folyamat külön szálba olvas , külön szálba ír. Ha nem veszem külön szálba akkor instant holtpont alakul ki, befagy az egész.


Jóval egyszerűbb magára a tömörített flac stream-re ráereszteni a hash függvényt mint azt visszakövetni hogy melyik bájt offsettől melyik bájt offsetig a tömörítetlen pcm-ből a tömörített flac hogy alakul pontosan és a szerint skálázni hogy mekkora darabonként számítson rá hash-t. Gondolom ez így is jó.

Még ha egyszerűsítek már kész is van. Az egyszerűsítés az ,hogy előbb utóbb összegyűlik mindenképpen n darab bájt a flac streamre akkor is ha az abszolút csendet (csupa nulla pcm-et) enkódolom, csak nem mindegy mennyi idő alatt. Ha timeout alatt gyűlt össze n bájt akkor a random generátorom kiad annyi random bájtot az sha3_512 aktuális kimeneti állapotát, ha timeout-ot túllépte akkor csak az sha3_512 állapotát updateli azzal az adattal. Így végülis az az információ mint entrópiát nem dobtam ki, hogy x ideig volt abszolút csend ha volt ilyen (miután timeout felé kerülünk).

Pszeudo kódba ( a _ jelek szóközöket helyettesítenek, így nem gyomlálja ki a gyk a behúzásokat):

hashobj = create_sha3_512()

t1 = now()

while puffer = flac.read(n): Értékadás és feltételvizsgálat egyszerre

__t2 = now()

__hashobj.update(puffer)

__if (t2-t1 < timeout) and puffer.length == n:

____randomgen_output(hashobj.digest)

__t1 = t2

2022. dec. 13. 16:53
 18/20 anonim ***** válasza:
100%
Igen, a flac-ot is használhatod a hash bemenetének, mivel a veszteségmentesség miatt a nyers jelfolyam teljes entrópiája ugyanúgy benne van.
2022. dec. 14. 06:31
Hasznos számodra ez a válasz?
 19/20 A kérdező kommentje:

Köszönöm a megerősítést, technikailag így praktikusabb. Végülis így kész. A többi része az már eleve adott. (A nyers random bájtokból előállítva random egész tól-ig tartományban, random lebegőpontos, listából random kiválasztás, random keverés ... stb. dolgot értek a többi alatt.)


Még néhány gondolat :

Újra átgondolva az AES-es dolgot, az AES használható hash függvénynek is CBC módban. Triviális úgy ha az AES blokkméret egész számú többszöröse adatra kell. Mindig az enkriptált adat utolsó blokkját tekintem a hash értéknek. Bár ez bonyolítás lenne, mivel natívan az AES a blokméretének egész számú többszörösére számítandó

egyébként 16 bájt a blokkmérete az AES-nek, ha nem oszható vele akkor erre vannak praktikák, ha pedig így használnám mint itt hogy menet közben is kellenek az aktuális hash állapotok és ha nem osztható 16-al akkor ott már igen csak érteni kell matematikailag is.


Érdemes alábecsülni a Kolmogorov-komplexitásnak. Itt megjegyzem, hogy valójában nem tudom, hogy tényleg kell e maximális tömörítés (compression_level 12-es paraméter, default 5), mert a konstans faktor amit ráhagyok az alábecsülés miatt úgy is lecsonkítja a nyers random kimenetet. A level 5-ös tömörítés nem ad 2x nagyobb kimenetet mint a maximális azaz a level 12-es, legalábbis amiket teszteltem. Ha pedig tévedek és 2x nagyobb, akkor a hasítófüggvénnyel generált streamet 2x ritkábbra skálázom. Felőlem maradhat a level 12-es, nem muszáj ezzel spórolni (mármint cpu időt spórolna, de elbírja a gép bőven így is).

Triviálisan azért kell alábecsülni mint a Kolmogorov-komplexitása, mert ha pontosan nem tudjuk meghatározni akkor becsüljünk alá inkább mint felé. Ami talán kevésbé triviális, a törés miatt. Az sha2_512-nek nem brahiból a tovább fejlesztése az sha3_512. Mint kriptográfiai hash függvény az md5-ről tudom, hogy viszonylag egyszerű ütközést találni rá. Így azért is kell alábecsülni ezt a komlexitást, mert ha a jövőben törést találnak az alkalmazott hash függvényre akkor is megállja a helyét. A törés alatt nem csak a triviális eseteket értem, hanem már azt az esetet is ahol n darab bit ismeretében a következő bit előre kitalálásának valószínűsége több mint 50%.

2022. dec. 14. 17:28
 20/20 A kérdező kommentje:

Még eszembe jutott megjegyzés amiről el is feletkeztem.

Valójában nincs olyan algoritmus ami garantáltan legrosszabb esetben is 2x vagy 4x, de írhatom úgy is c konstansszor rosszabbul tömörítene mint a Kolmogorov-komplexitása. A c konstans lehet például egy milliárd is akár.

Csak gondoljunk a minden évben megrendezett function party-ra. Ott 64 kilóbájtba zenét, animációt "belepréselnek". A top hang, videó tömörítők meg se közelítik azt. Az informatikai mester munka. Megnéznék olyan általános célú képtömörítőt ami vesztességmentesen csak egy képkockáját legfeljebb akkorába betömörít mint az egész demó, zenével mozgóképpel tokkal vonóval együtt. Igaz az fordítva van, ott a kódot írnak ami elindításkor a beleírt algoritmusok generálják a zenét meg az animációt, a kódon addig csiszolnak az animáció és zene változtatásával ha kell, hogy beleférjen.

Viszont ha nem kell kreatív pl zenének lenni, könnyen csinálok tetszőlegesen rövidebb kódból hangot (ahol maga a kód a hangnak a egy tömörített változata tulajdonképpen), mint ahányszor nagyobb fájlt csinál belőle a flac tömörítő. Sőt mondok még jobbat, maga a hang digitális képe informatikailag egy adatszerkezet. Végtelen (számított) adatszerkezetet könnyen lehet csinálni, így végtelen hosszú hanganyagot véges kódból. Végtelenszer rövidebb a kód mint amit a flac csinálna belőle.

Ha pedig nem generátoros trükk akkor csak valószínűsíthetjük hogy túl messze nem jár a flac tömörített mérete az adott hanganyag Kolmogorov-komplexitásától.

2022. dec. 16. 18:35
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!