Pourquoi le flou ne cache pas mal les informations sensibles

Certes, tout le monde a vu à la télévision et sur Internet des photos de personnes, particulièrement floues pour cacher leur visage. Par exemple, Bill Gates:



Pour la plupart, cela fonctionne car il n'y a aucun moyen pratique d'inverser le flou en une photo suffisamment détaillée pour reconnaître un visage. Donc, avec des visages, tout va bien. Cependant, beaucoup recourent à brouiller les numéros et les textes confidentiels. Je vais montrer pourquoi c'est une mauvaise idée.

Supposons que quelqu'un ait posté une photo de son chèque ou de sa carte de crédit sur Internet pour une terrible raison (prouver sur le forum qu'il a fait un million de dollars ou montrer quelque chose de drôle, ou comparer la taille d'un objet avec une carte de crédit, etc. .), a brouillé l'image en utilisant un effet de mosaïque trop courant pour masquer les chiffres:



Semble sûr parce que personne ne lira les chiffres? Mauvaise réponse. Il y a une attaque contre ce schéma:

Étape 1. Obtenez une image de contrôle propre


Il y a deux façons de procéder. Vous pouvez soit supprimer les numéros dans un éditeur graphique, soit ouvrir un compte dans la même banque et photographier votre propre carte sous le même angle, combiner balance des blancs et contraste. Supprimez ensuite les numéros dans l'éditeur graphique (dans une photo haute résolution, c'est plus facile à faire).

Dans nos exemples, bien sûr, cela se fait facilement:



Étape 2. Itérations


Utilisez un script pour parcourir tous les numéros de compte possibles et créer un chèque pour chacun, en séparant les groupes de numéros. Par exemple, sur les cartes VISA, les numéros sont groupés par 4, vous pouvez donc traiter individuellement chaque section. Cela ne nécessite que 4 × 10 000 = 40 000 images, ce qui est facilement généré par le script.



Étape 3. Flouter chaque image de la même manière que l'original


Déterminez la taille exacte et le décalage en pixels des mosaïques utilisées pour flouter l'image d'origine (facile), puis faites de même avec chacune de vos images floues. Dans ce cas, nous voyons que l'image floue est constituée d'une mosaïque de 8 x 8 pixels, et le décalage est déterminé par un comptage à partir du bord supérieur de l'image (non illustré):



Maintenant, nous trions toutes les images, les floutant de la même manière que l'original, et nous obtenons quelque chose comme ceci:



Étape 4. Déterminez le vecteur de luminosité de la mosaïque de chaque image floue.


Qu'est-ce que cela signifie? Eh bien, prenons la version mosaïque 0000001 (augmentée):



... et déterminez le niveau de luminosité (0-255) de chaque zone de la mosaïque, en les nommant de manière cohérente comme a=[a1,a2...,an]:



Dans ce cas, le numéro de compte 0000001 crée un vecteur de luminosité en mosaïque a(0000001)=[213,201,190,...]. Nous trouvons le vecteur de luminosité en mosaïque pour chaque numéro de compte de la même manière, en utilisant un script pour flouter chaque image et lire la luminosité. Soit a(x)- fonction de numéro de compte x. Alors a(x)idésigne la i-ème valeur vectorielle du vecteur de luminosité de la mosaïque aobtenu à partir du numéro de compte x. Ci-dessus a(0000001)1=213.

Maintenant, nous faisons de même pour l'image de référence d'origine que nous avons trouvée sur Internet ou n'importe où, obtenant un vecteur que nous appellerons ici z=[z1,z2,...zn]:



Étape 5. Trouvez celle la plus proche de l'image d'origine.


Définissez le vecteur de luminosité de la mosaïque de l'image d'origine, appelons-le z=[z1,z2,...zn]puis calculez simplement la distance de chaque numéro de compte (indiqué par x) au vecteur de luminosité de la mosaïque (après normalisation):

d(x)= sqrt((a(x)0/N(a(x))z0/N(z))2+(a(x)1/N(a(x))z1/N(z))2+...)


N(a(x)) et N(z) sont les constantes de normalisation données

N(a(x))=(a(x)02+a(x)12+...)2


N(z)=(z02+z12+...)2


Maintenant, trouvez le plus petit d(x). Pour les cartes de crédit, seule une petite partie des numéros possibles confirme le nombre hypothétiquement possible de cartes de crédit, il n'y a donc rien de compliqué ici non plus.

Par exemple, dans notre cas, nous calculons

N(z)= sqrt(2062+2112+...)=844.78459


N(a(0000001))=907.47837


N(a(0000002))=909.20647


puis procédez au calcul des distances:

d(0000001)=1,9363


d(0000002)=1,9373


...


d(1124587)=0,12566


d(1124588)=0,00000


...


Peut-être que le numéro de compte correspond à la mosaïque 1124588?

"Mais vous avez utilisé votre propre image, qui est facile à déchiffrer!"


Dans le monde réel, de vraies photos, pas des exemples fictifs pris dans Photoshop. Nous avons une distorsion du texte due à l'angle de la caméra, à un alignement imparfait, etc. Mais cela n'empêche pas une personne de déterminer avec précision le type de distorsion et de créer un script approprié! Dans tous les cas, quelques distances minimales définies peuvent être considérées comme des candidats, et en particulier dans le monde des cartes de crédit, où les numéros sont magnifiquement divisés en groupes de 4, et seul 1 numéro sur 10 est en fait un numéro valide, ce qui facilite le choix parmi plusieurs plus probables candidats.

Pour réaliser cela dans de vraies photographies, l'algorithme de distance doit être amélioré. Par exemple, vous pouvez réécrire la formule de distance ci-dessus pour normaliser les écarts-types en plus de la moyenne. Vous pouvez également traiter indépendamment les valeurs RVB ou HSV pour chaque zone de la mosaïque, ainsi que d'utiliser des scripts pour déformer le texte de plusieurs pixels dans chaque direction et comparer (ce qui vous laisse un nombre de comparaisons complètement limité sur un PC rapide). Vous pouvez utiliser des algorithmes similaires aux algorithmes de voisin le plus proche existants pour augmenter la fiabilité du travail sur des photographies réelles.

Alors oui, j'ai utilisé mon image et l'ai adaptée à ce cas. Mais l'algorithme peut certainement être amélioré pour une utilisation dans le monde réel. Mais je n'ai ni le temps ni l'envie d'améliorer quoi que ce soit, car je ne cherche pas vos informations. Mais une chose est sûre: c'est une situation très simple. N'utilisez pas de mosaïques simples pour rendre l'image floue. Tout ce que vous faites est de réduire la quantité d'informations dans l'image qui contient tout log(10N)/log(2)bits effectifs de données de compte. Lorsque vous distribuez de telles images, vous souhaitez éliminer les informations personnelles plutôt que d'en entraver l'accès en réduisant la quantité d'informations visuelles.

Imaginez une image graphique de 100 × 100. Supposons que je viens de faire la moyenne des pixels et de remplacer chacun d'eux par une valeur moyenne (c'est-à-dire que j'ai transformé l'image en une «mosaïque» à un seul pixel). Vous venez de créer une fonction qui, de 256 ^ (10000) variantes, a haché jusqu'à 256 variantes. Évidemment, avec les 8 bits reçus, vous ne pourrez pas restaurer l'image d'origine. Mais si vous savez qu'au total il y a 10 options pour l'image originale, alors en utilisant ces 8 bits, vous pouvez facilement déterminer laquelle a été utilisée.

Dictionnaire Attack Analogy


La plupart des administrateurs système UNIX / Linux savent que les mots de passe dans / etc / passwd ou / etc / shadow sont chiffrés avec une fonction unidirectionnelle, telle que Salt ou MD5. C'est assez sûr, car personne ne peut décrypter le mot de passe en regardant son texte crypté. L'authentification se produit en effectuant le même cryptage unidirectionnel du mot de passe entré par l'utilisateur lors de l'entrée dans le système et en comparant ce résultat avec le hachage enregistré. S'ils correspondent, l'utilisateur a réussi le test.

Il est bien connu qu'un schéma de cryptage unidirectionnel se casse facilement lorsqu'un utilisateur sélectionne un mot de dictionnaire comme mot de passe. Tout ce que l'attaquant doit faire est de crypter l'intégralité du dictionnaire anglais, de comparer le texte crypté de chaque mot avec le texte crypté stocké dans / etc / passwd et de sélectionner le mot correct comme mot de passe. Par conséquent, il est généralement conseillé aux utilisateurs de choisir des mots de passe plus complexes qui ne sont pas des mots. Une attaque par dictionnaire peut être illustrée comme suit:



De même, le flou d'image est un schéma de cryptage unidirectionnel. Vous allez convertir l'image que vous avez en une autre image destinée à la publication. Mais comme les numéros de compte ne dépassent généralement pas des millions, nous pouvons compiler un «dictionnaire» de nombres possibles. Par exemple, tous les nombres sont compris entre 0000001 et 9999999. Ensuite, lancez le traitement automatique, qui place chacune de ces images sur une photo d'un arrière-plan vide - et brouille chaque image. Ensuite, il ne reste plus qu'à comparer les pixels flous et voir quelles options correspondent le mieux à l'original.

Solution


La solution est simple: ne brouillez pas les images! Au lieu de cela, peignez simplement dessus:



N'oubliez pas que vous souhaitez supprimer complètement les informations et ne pas réduire leur quantité, comme sur une photo floue.

Source: https://habr.com/ru/post/fr449608/


All Articles