STÉGANOGRAPHIE CRYPTÉE AVEC VIGENERE

cs_Papymuzo Messages postés 169 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 17 août 2010 - 12 oct. 2008 à 13:12
 Merci Papy - 23 mai 2015 à 05:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48180-steganographie-cryptee-avec-vigenere

Module Graphus
    'Merci Papymuzo.
    'http://codes-sources.commentcamarche.net/source/view/48180/1169569#browser
    Friend PhotoRef As PictureUtil
    Friend CurrentPhoto As PictureUtil

    Function Papymuzodecode() As String
        Dim TaBit As Boolean() = TabChar("")
        Dim S As String = ""
        Dim Pixels As String = ""
        Dim Pixelref As String = ""
        Dim i As Integer = 0
        Do
            For j = 0 To 7
                Pixels = CurrentPhoto.Draw.GetPixel(i, j).ToString
                Pixelref = PhotoRef.Draw.GetPixel(i, j).ToString
                TaBit(j) = Nothing
                Select Case Pixels
                    Case "Color [A=255, R=255, G=255, B=255]"
                        TaBit(j) = False
                    Case "Color [A=255, R=255, G=0, B=0]"
                        TaBit(j) = True
                End Select
            Next
            i = i + 1
            S = S & BinaryToChar(TaBit)
        Loop Until Pixels = Pixelref
        Return S
    End Function

    Sub Papymuzocode(S As String)
        Dim TaBit As Boolean()
        For i = 0 To S.Length - 1
            TaBit = TabChar(S(i))
            ' Dim C As Char = BinaryToChar(TaBit)
            For j = 0 To 7
                Select Case TaBit(j)
                    Case 0
                        CurrentPhoto.Draw.SetPixel(i, j, Color.White)
                    Case 1
                        CurrentPhoto.Draw.SetPixel(i, j, Color.Red)
                End Select
            Next
        Next
        CurrentPhoto.Picture.Image = CurrentPhoto.Draw
    End Sub

    Private Function BinaryToChar(TaBit() As Boolean) As Char
        Dim N As Integer = 0
        For i = 0 To 7
            If TaBit(i) = True Then
                N += 2 ^ i
            End If
        Next
        Return Chr(N)
    End Function
    Private Function TabChar(ByVal C As Char) As Boolean()
        Dim v As Integer = Asc(C)
        Dim TabBits(7) As Boolean

        For p = 7 To 1 Step -1
            If 2 ^ p > v Then
                TabBits(p) = False
            Else
                v -= 2 ^ p
                TabBits(p) = True
            End If
        Next
        If v = 1 Then TabBits(0) = True Else TabBits(0) = False
        Return TabBits
    End Function

    Friend Sub initGraph(Pref As PictureBox, P As PictureBox)
        PhotoRef = New PictureUtil(Pref)
        PhotoRef.Draw = Image.FromFile(Application.StartupPath & "\Donkey.jpg")
        PhotoRef.Picture.Image = PhotoRef.Draw
        CurrentPhoto = New PictureUtil(P)
        CurrentPhoto.Draw = PhotoRef.Draw.Clone
        CurrentPhoto.Picture.Image = CurrentPhoto.Draw
    End Sub
End Module
cs_Papymuzo Messages postés 169 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 17 août 2010 1
22 oct. 2008 à 15:10
Ah mais je viens de comprendre !

En fait pour moi, 2 mod 10 était le reste de la division de 10 par 2, donc 0.
Alors que 10 mod 2 = 2.

Autant pour moi ^^
Du coup je comprends comment sa marche !!! ^^
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
22 oct. 2008 à 08:50
Non, c'est le reste de la division.
Quand tu fais une division à la mais (sans les virgules), il te reste parfois un nombre :
25/10=2*10+5, donc il te reste 5.
Ou sous un autre format :
25|10
-20|2
5

25 mod 10=5
Je ne vois pas comment faire plus simple.
cs_Papymuzo Messages postés 169 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 17 août 2010 1
21 oct. 2008 à 23:21
Tu vas me trouver un peu neuneu mais si 5 mod 10 = 5, alors 2 mod 10 = 8 ?

Je croyais que 5 mod 10 0 (car 10 2 * 5), et que 2 mod 10 = 0 (car 10 = 5 * 2). Par exemple on aurait 2 mod 11 = 1 (car 11 = 2 * 5 +1).
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
21 oct. 2008 à 20:49
Mod, c'est le reste de la division :
5 mod 10=5
2 mod 10=2
0 mod 10=0
10 mod 10=0

Variant n'existe pas en .NET, c'est Object (juste pour rappel).

For i as integer=0 to 10
=
dim i as integer
for i=0 to 10

Voilà.
cs_Papymuzo Messages postés 169 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 17 août 2010 1
21 oct. 2008 à 17:13
Salut !

Il y a un petit "truc" qui me "dérange" dans le code que tu me proposes.
Si j'ai bien compris, le code AscII de la lettre une fois cryptée sera faite en fonction du reste de la division avec 256.
Mais il est possible d'avoir deux codes AscII ayant le même reste non ? Par exemple 5 mod 10 0 et 2 mod 10 0.

J'ai vu plusieurs cryptages qui utilisent le mod 256 mais je ne comprends pas comment ça marche, si tu pouvais m'éclairer ça serait super sympa :) ;)

Et pi sinon pour le "Private _TexteCrypte", je l'ai arrangé et j'ai mis un type String (c'était un oubli de ma part puisque je ne mets jamais de type Variant, mais merci de me l'avoir fait remarqué :)).

Sinon pour Option Strict, c'est une bonne idée mais je n'aime pas déclarer tous mes compteurs (i, j, k,..), je préfère les utiliser directement.

En te remerciant,

Bonne prog à toi :)
Encore merci pour tes commentaires qui m'aident à optimiser mon code :)

-Papy/kAm-
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
20 oct. 2008 à 16:36
Bonjour,

If CodeAsciiLettreTexteCrypte > 255 then CodeAsciiLettreTexteCrypte -= 255
c'est bien long alors qu'avec
Me._CodeAsciiLettreTexteCrypte = cbyte((cint(Me._CodeAsciiLettreLueTexteACrypter) + Me._CodeAsciiLettreLueClef) mod 256)
c'est tout fait en une ligne.

Pour le décryptage, tu peux mettre +255 avec le Mod 256.

Un autre conseil, toujours mettre "Option Strict" et "Option Explicit" à On.
cs_Papymuzo Messages postés 169 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 17 août 2010 1
20 oct. 2008 à 14:54
Pour te répondre, NHenry, je pense avoir trouvé la solution pour les accents.

Je pense faire ainsi :

If CodeAsciiLettreTexteCrypte > 255 then CodeAsciiLettreTexteCrypte -= 255

En fait, je fais un peu comme le cryptage masque jetable : j'enlève 255 si le code Ascii dépasse 255, et pour le décryptage j'ajoute 255 s'il est négatif (http://fr.wikipedia.org/wiki/Masque_jetable).

Je pense ainsi résoudre les problèmes d'accents (car j'ai remarqué qu'avec les accents, le code Ascii dépasse 255).

Pour le reste, je vais tenir compte de tes commentaires et lorsque j'aurai le temps, je vais essayer de faire une version mieux codée et permettant d'ouvrir l'image de notre choix.
Aussi, je pense faire une représentation graphique de la clef grâce à un système de cryptage "maison" ^^

Merci pour tes commentaires :)
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
20 oct. 2008 à 09:06
Quelques remarques constructives sur le code :
- vu dans Cryptage.vb :
Public Function Crypter(ByVal pTexteACrypter As String, ByVal pClef As String)

Où est le type de retour ?

Private _TexteCrypte
Le type ?

-Dans le même module :
Me._CodeAsciiLettreTexteCrypte = Me._CodeAsciiLettreLueTexteACrypter + Me._CodeAsciiLettreLueClef

Donc, tu ne gère pas les accents afin d'éviter une erreur de dépassement.
Me._CodeAsciiLettreTexteCrypte = (Me._CodeAsciiLettreLueTexteACrypter + Me._CodeAsciiLettreLueClef) mod 256
serait une solution

-Quelques variables pourraient être locale à la fonction plutôt qu'au module

-Tu pourrais faire un traitement avec de l'UTF8 ou 16 afin de faire une gestion plus propre des accents (à ce moment là, c'est bosser sur des Byte() au lieu des String.

-Tu mets les valeurs dans un tableau de chaine de caractères (1 élément reoprésentant 1 bit), il serait mieux (à mon gout) de bosser sur les masques et avec des opérateurs binaires.

Sinon bon code.

Juste une dernière chose, je te conseil de faire en sorte que l'on puisse choisir une image, afin de cacher réellement le message dedans.
cs_Papymuzo Messages postés 169 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 17 août 2010 1
12 oct. 2008 à 22:31
Oui ^^
Mais a la base le programme était fait pour ma "satisfaction personnelle", parce que je voulais le faire depuis 1 an et que je me suis décidé à le faire.
D'où le manque de commentaires :s
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
12 oct. 2008 à 22:29
ça peut servir à des trucs tout à fait serieux :
un site internet ou chaque image contiendrais un message :)))))
cs_Papymuzo Messages postés 169 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 17 août 2010 1
12 oct. 2008 à 21:12
Oui tu as raison Gillardg, mais je progresse petit à petit.
J'ai fait plusieurs versions de ce code. La première regardait chaque caractère (if caractere "a", if caractere "b",..).
Ensuite j'ai fait avec le code Ascii, puis j'ai inséré l'algorithme de Vigénère dans une troisième version.
La prochaine étape est de créer une image sur deux "lignes" (donc une image de 16*1000).
Une fois que j'aurai récupéré le principe, je pourrai l'appliquer à une image existante.

Mais le principal est de régler le problème des accents, qui vient du fait que le code Ascii est supérieur à 255 (allez savoir pourquoi !).

Il faut aussi savoir que ce petit programme est fait pour envoyer des images "truquées" à ses potes via msn par exemple, et que ce n'est pas un truc sérieux ^^
Mais j'avoue que l'image est bien moche !
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
12 oct. 2008 à 21:00
salut,
ton interface est trop noire ( à mon gout) !
ce serait bien de pouvoir choisir une autre image de départ :))
si c'est un problème de couleurs tu pourrais réserver 2 couleurs :
analyse de l'image > si une des 2 couleurs modifier les pixels ensuite seulement accepter l'image.
parce que serieusement si on utilise toujours la même image c'est pas très pratique :)
ou alors il faudrait au moins que ce soit une jolie image que l'on puisse l'inserer dans un site ( la c'est bien que ce soi toujours la même image :)
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
12 oct. 2008 à 14:23
Si il était possible d'arranger un peu la présentation de la source ;-)
cs_Papymuzo Messages postés 169 Date d'inscription jeudi 24 juillet 2003 Statut Membre Dernière intervention 17 août 2010 1
12 oct. 2008 à 13:12
Faites moi des critiques que je puisse en apprendre ;)
Rejoignez-nous