Partea provocatoare este în principal despre procesarea imaginilor și nu foarte mult despre cripto.
Doriți să extrageți din imagine suficientă entropie într-un mod fiabil.
Are foarte mult de-a face cu modul în care folosești imaginea și modelul adversarului tău.
Dacă adversarul tău nu știe nimic despre imagine, unele caracteristici simple și grosiere ar putea fi suficiente, dacă adversarul tău știe multe despre imagine, de exemplu, a aruncat o privire asupra ei sau știe aproximativ unde a fost luată, trebuie să fii mai atent. despre ce informații sunt extrase din imagine și va trebui să utilizați caracteristici de imagine cu granulație mai fină, care vor fi greu de extras într-un mod stabil.
Dacă de fiecare dată când imaginea este utilizată, aceasta este scanată în același scaner de înaltă calitate, iar între utilizări este păstrată în siguranță, astfel încât să nu se estompeze, să nu se încrețească sau să acumuleze praf, ar fi mai ușor să obțineți scanări foarte aproape una de cealaltă și să aibă doar aliniere automată simplă și discretizare (spațială și color) pentru a obține aproape aceeași secvență de biți de fiecare dată.
Atunci întrebarea este care este modelul de eroare pe care îl avem pentru rezultatele scanării? Ne așteptăm la zgomot gaussian? sare si piper? zgomot de aliniere? rotație? adăugarea de bucăți mari continue de zgomot? zgomot de iluminare?
Fiecare tip de zgomot poate fi tratat diferit.
O schiță generală pentru o soluție: folosim tehnici de procesare a imaginii pentru a minimiza zgomotul pentru a trece la o reprezentare care le elimină majoritatea, apoi limitați spațiul la doar anumite puncte valide și alegeți cel mai apropiat punct valid de ceea ce avem pentru a reduce zgomotul. la zero.
Vom discretiza suficient de agresiv și vom alege destul de rare puncte valide pentru a ne permite să ajungem la zero zgomot în mod fiabil. În acest moment, ar trebui să avem în continuare mult mai mult decât lungimea cheii necesară, dar într-un spațiu încă strâns legat de imaginea originală și, ca atare, biții vor fi părtinși și corelați.
Aplicarea unui hash criptografic acelor date ar trebui să le rezolve și să ne permită să avem suficient material cheie de înaltă calitate derivat în mod fiabil și să obținem aceeași cheie exact oricând scanați. Aceasta ar putea fi folosită, de exemplu, ca o cheie AES.
Dacă doriți să creați o cheie RSA, veți avea nevoie de mai mulți biți aleatori. Cu toate acestea, puteți extrage cât mai mulți biți puteți extrage, obținând totuși aceiași biți de fiecare dată și să-l utilizați pentru a genera un PRNG criptografic și a-l folosi pentru a genera o cheie privată RSA.
Edit: nu am încercat să implementez o soluție completă, dar am deschis un notebook și m-am jucat cu modelul de zgomot sugerat, zgomotul gaussian și deplasările cred că se corectează ușor, așa că am verificat ce se întâmplă dacă rotesc imaginea (cu fantezie). interpolări) cu 2 grade și rotire înapoi cu 1,8 grade Am obținut o diferență maximă (pe imaginea de mai sus) de 33%, aceasta este susținătoare pentru afirmația mea că, prin identificarea celei mai bune contrarotații și deplasări, scăderea rezoluției și cuantificarea agresivă ignorând marginile să poată obține 1-2 biți pe canal pe ~25 de regiuni de pixeli. Pentru imaginea de mai sus iese cel puțin 36K de biți, iar după hashing, pariez că va avea 128 de biți de entropie reală
Edit2: Am descărcat imaginile furnizate de scanări în tonuri de gri și m-am jucat cu ele, am aliniat semi-automat la rotit primele două imagini.
img = io.imread("scans/scan078.tif")
img2 = io.imread("scans/scan079.tif")
imgr = transform.rotate(img,unghi = -0,78)
imgr2 = transform.rotate(img2,angle = -0,805)
tr1=transform.rescale(imgr[:-10,:-6],0.1)[20:-20,20:-20]
tr2=transform.rescale(imgr2[10:,6:],0.1)[20:-20,20:-20]
Această citire rotește fiecare aliniere și decupează, eșantionează de 10 ori și decupează pentru a scăpa de marginile care pot avea artefacte.
Acest lucru oferă o diferență maximă de mai puțin de 6% per valoare de pixel. Ceea ce este destul de bine. Cu toate acestea, această diferență de 6% poate fi cu ușurință în jurul oricărei limite pe care o alegem, așa că chiar și cuantizarea agresivă nu dă 0 erori.
bin1 = tr1> 0,5
bin2 = tr2> 0,5
Acest lucru a dat o diferență în 103 biți din 27248 biți sau 0,37% Aceste erori par să fie răspândite în mod rezonabil.
Această redimensionare și cuantificare agresivă pierde o mulțime de informații, dar probabil că avem încă suficiente.
Cam asa arata imaginea:
Erorile sunt destul de bine răspândite (și putem oricând să aplicăm o permutare fixă sau să folosim simboluri mai mari dacă este necesar). Deci, acum putem aplica orice pas de corectare a erorilor (de exemplu Reed Solomon), vom face doar pasul de decodare (de fapt nu am făcut asta) și ar trebui să obținem aceeași ieșire de la oricare dintre imagini cu probabilitate mare și să avem încă ~20K biți.
Dacă reducem de 5x în loc de 10x, obținem 816 biți diferiți. dar obțineți de 4 ori mai mulți biți, la 0,6% diferență. Pot să te joci cu asta și să găsești optimul.
De asemenea, probabil ne putem descurca mai bine la etapa de cuantizare și păstrăm mai multe informații în mod fiabil. Cuantizarea agresivă pe care am folosit-o va funcționa doar pentru fotografii echilibrate rezonabil, o imagine supraexpusă va ieși cu o singură valoare. Am putea adăuga preprocesare pentru a gestiona acest scenariu.