16 juillet 2018 · 4 min de lecture
En informatique, une signature numérique peut être créée pour chaque fichier. A la moindre modification de l’original, l’empreinte générée sera totalement différente. L’intérêt est de vérifier si le document a été altéré.
Par conséquent, si on redimensionne une image, les signatures sont différentes. Il est donc impossible via cette solution d’identifier deux images proches. Il faudra dans cette situation utiliser le hachage perceptuel.
Les fonctions de hachage MD5 et SHA1 sont les plus utilisées. Elles lisent en cascade chaque donnée binaire d’un fichier pour en déduire une chaîne de caractères de taille fixe. Le calcul est irréversible, on ne peut pas extraire le fichier source d’après sa signature. Il existe des logiciels gratuits sur Windows pour calculer ces empreintes cryptographiques. Les commandes md5sum
et sha1sum
sont disponibles dans le terminal Linux.
Voici une image nommée waterlily.jpg
. Sa taille est 640x360 pixels. Calculons sa signature numérique :
md5sum waterlily.png
# résultat: 6a9e70e1def784f6e26027c7c914a702
sha1sum waterlily.png
# résultat: d0edc2c6d65ee79441f78dc149e08df79d348e5e
L’image est redimensionnée en 500x280 pixels :
md5sum waterlily.png
# résultat: b2b3ee10491bc1486bcadd19397a769e
sha1sum waterlily.png
# résultat: d43c780ef66e8e6eed9aaf38a25c827cc89219d7
Comme vous pouvez le constater le résultat est totalement différent. Cela prouve que l’original a été altéré. Et c’est le but de ces empreintes numériques.
Mais dans le cas de fichiers multimédias, si on veut vérifier qu’une image est dérivée d’une autre, il est préférable d’utiliser le hachage perceptuel.
C’est un algorithme qui produit une empreinte numérique particulièrement adaptée aux fichiers multimédias. L’intérêt est que le résultat est proche si les fichiers le sont, contrairement aux algorithmes précédents. Il est utilisé pour détecter les violations de droits d’auteurs sur des images, des articles, des fichiers audio, ou en criminalistique numérique.
Dans cet exemple la librairie Javascript Jimp est utilisée.
Reprenons le nénuphar précédent et calculons son hash perceptuel :
const Jimp = require("jimp");
Jimp.read('waterlily.jpg', function (err, image) {
console.log('hash waterlily : ' + image.hash());
});
Résultat :
hash waterlily : cipbA1M9j42
Effectuons une retouche sur l’image originale :
En reprenant le code précédent, le hash de cette nouvelle image est :
hash waterlilycopyright : d6pbA1M9i02
Seules quelques lettres ont changé. On peut calculer la “distance” entre ces deux images :
const Jimp = require("jimp");
let img1 = 'waterlily.jpg';
let img2 = 'waterlilycopyright.jpg';
Jimp.read(img1, function (err, image1) {
console.log('hash waterlily : ' + image1.hash());
Jimp.read(img2, function (err, image2) {
console.log('hash waterlilycopyright : ' + image2.hash());
console.log('distance : ' + Jimp.distance(image1, image2));
});
});
Résultat :
hash waterlily : cipbA1M9j42
hash waterlilycopyright : d6pbA1M9i02
distance : 0.078125
A une distance de 0, les images sont identiques, à 1 elles sont très éloignées visuellement. Il est estimé une correspondance à une distance inférieure à 0.15, ce qui est le cas ici.
J’ai pu vérifier qu’une image redimensionnée a exactement le même hash que l’originale.
Grâce au hachage perceptuel, on peut donc automatiser des tests, pour rechercher par exemple d’après une liste de hash d’images connues, celles qui ont été copiées et retouchées parmi un lot d’images donné.
Attention ! cela ne fonctionne pas pour retrouver des images similaires. Deux photos d’une même scène avec un cadrage différent et une faible variation d’objets auront des empreintes trop différentes et donc une distance ne permettant pas d’établir une correspondance.