Oppure

Loading
15/08/13 9:36
Roby94
Salve, mi sto cimentando nella creazione di un algoritmo che generi da una chiave e un immagine una seconda immagine che non presenti alcun riferimento visivo alla prima immagine, e che da essa si possa ritornare all'immagine di partenza mediante la chiave senza alcuna perdita di dati.
Fino ad ora ho pensato di operare su ogni pixel modificando il colore di esso sommando il valore ascii ricavati da un singolo carattere della chiave
Ecco il codice che ho adoperato:
            keyArray = Encoding.ASCII.GetBytes(this.key);
            int i = 0;
            for (int y = 0; y < sourceImage.Height; y++)
            {
                for (int x = 0; x < sourceImage.Width; x++)
                {
                    Color pixelColor = sourceImage.GetPixel(x, y);
                    int a = pixelColor.A + keyArray[i] - ((pixelColor.A + keyArray[i]>255)?256:0);
                    i++;
                    if (keyArray.Count() == i) i = 0;
                    int r = pixelColor.R + keyArray[i] - ((pixelColor.R + keyArray[i] > 255) ? 256 : 0);
                    i++;
                    if (keyArray.Count() == i) i = 0;
                    int g = pixelColor.G + keyArray[i] - ((pixelColor.G + keyArray[i] > 255) ? 256 : 0);
                    i++;
                    if (keyArray.Count() == i) i = 0;
                    int b = pixelColor.B + keyArray[i] - ((pixelColor.B + keyArray[i] > 255) ? 256 : 0);
                    i++;
                    if (keyArray.Count() == i) i = 0;
                    newImage.SetPixel(x, y, Color.FromArgb(a, r, g, b));
                }
            }

Questo sistema è molto semplice e permette una facile decodifica, ma l'immagine è pressoché identica solo con i colori alterati se la chiave non è molto complessa.
Mi potreste aiutare, visto che non mi sono mai cimentato in un operazione del genere.
Grazie in anticipo
aaa
15/08/13 14:34
arack95
Prova a dare un'occhiata a questo articolo:
arxiv.org/pdf/…
aaa
15/08/13 19:47
Qwertj
Quello che hai fatto è un Vigenerè modificato
Per rendere la chiave più complessa puoi usare un algoritmo di hashing che la porti ha una lunghezza fissa piuttosto lunga
Per rendere l'immagine meno riconoscibile poi dovresti fare in modo che cambino i valori di luminosità dei pixel (la media tra i valori dei colori) oppure modificare geometricamente l'immagine (rotazione di righe/colonne, traslazioni, mescolamenti)

Un ottima tecnica è quella della crittografia visuale (se cerchi nella sezione programmi ne ho scritto una implementazione in VB.NET), citata anche nell'articolo linkato da arack95, che scompone l'immagine in diversi layer che mostrano l'immagine solo se sovrapposti tutti (se ne manca anche solo uno non si ottiene nessuna informazione dell'immagine originale)

Se vuoi creare un nuovo algoritmo però devi inventare qualcosa di nuovo :rofl:
aaa
16/08/13 19:40
Roby94
allora per iniziare grazie, ma la crittografia visuale non è proprio quello che cerco, voglio basarmi su algoritmi matematici che si devono basare su una chiave dando come risultato una sola immagine in modo che nessuno, che non sia in possesso della chiave e del suddetto algoritmo possa ottenere l'immagine di partenza. Stanotte mi mettero a leggermi per bene l'articolo (che sono contentissimo che sia disponibile solo in inglese XD) cosi vedo se trovo qualcosa che puo fare al caso mio. Per concludere rispondo a querty, si in effetti dovrei fare tante operazioni sui pixel ma ho paura di tirarmi la zappa sui piedi creando qualcosa che non abbia una via di ritorno.
aaa