Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CRYPTAGE PAR LA MÉTHODE DE VIGENERE


Information sur la source

Catégorie :Sécurité & Cryptage Source .NET ( DotNet ) Classé sous : cryptage, vigenere Niveau : Débutant Date de création : 09/08/2004 Date de mise à jour : 10/08/2004 13:41:11 Vu : 16 395

Note :
Aucune note

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note


Description

J'ai trouvé sur le net, une méthode de cryptage : Le chiffre de Vigenere --> http://www.bibmath.net/crypto/poly/vigenere.php3

C'est à partir de cette page que j'ai concu cette classe. J'ai entendu le codage aux 65536 caractères existant, le tableau de Vigenere ne fait donc plus 26*26 mais 65536*65536 =2^32

Merci à SimonKari.

J'ai laissé l'ancienne version qui ressemble un peu plus au carré de Vigenere

 

Source

  • #region Using directives
  • using System;
  • using System.Collections.Generic;
  • using System.Text;
  • #endregion
  • namespace ConsoleApplication1
  • {
  • class Program
  • {
  • static void Main(string[] args)
  • {
  • string sKey = "Ceci est la chaîne clé";
  • string sValue = "Voici le texte à encoder avec quelques caractères pénibles // !=] %ù ô i () \" ";
  • Vigenere oVigenere = new Vigenere(sKey);
  • Console.WriteLine(sValue);
  • Console.WriteLine("donne une fois code : ");
  • DateTime dDateDeb = DateTime.Now;
  • Console.WriteLine(oVigenere.Encrypt(sValue));
  • Console.WriteLine("L'encryptage a duré : " + (DateTime.Now.Subtract(dDateDeb).Ticks / 10000) + " ms");
  • Console.ReadLine();
  • Console.WriteLine("Verification : ");
  • Console.WriteLine(oVigenere.Decrypt(oVigenere.Encrypt(sValue)));
  • Console.ReadLine();
  • }
  • }
  • /// <summary>
  • /// http://www.bibmath.net/crypto/poly/vigenere.php3
  • /// </summary>
  • public class Vigenere
  • {
  • private string key;
  • public string Key
  • {
  • get { return key; }
  • }
  • public Vigenere(string cle)
  • {
  • // //Je code la clé avec une autre clé qui reprend tout les caractères
  • // #region "Mis en place de Alphabet"
  • // StringBuilder _key = new StringBuilder();
  • // for (int i = 0; i < 65535; i++)
  • // {
  • // _key.Append((char)i);
  • // }
  • // key = _key.ToString();
  • // #endregion
  • // key = Encrypt(cle)
  • key = cle;
  • }
  • public string Encrypt(string ChaineaEncoder)
  • {
  • string encrypt = null;
  • for (int i = 0; i < ChaineaEncoder.Length; i++)
  • {
  • // encrypt += (char)(((short)key[i % key.Length] + (short)ChaineaEncoder[i])%65536);
  • // Equivalent à :
  • encrypt += Convert.ToString(Convert.ToChar((Convert.ToInt16(key[i % key.Length]) + Convert.ToInt16(ChaineaEncoder[i])) % 65536));
  • }
  • return encrypt;
  • }
  • public string Decrypt(string ChaineaDecrypter)
  • {
  • string decrypt = null;
  • for (int i = 0; i < ChaineaDecrypter.Length; i++)
  • {
  • // decrypt += (Char)(((short)ChaineaDecrypter[i] - (short)(key[i % key.Length])) % 65536);
  • // Equivalent à :
  • decrypt += Convert.ToString(Convert.ToChar(((Convert.ToInt16(ChaineaDecrypter[i]) - Convert.ToInt16(key[i % key.Length])) % 65536)));
  • }
  • return decrypt;
  • }
  • }
  • }
  • //------------------------ Ancienne Version ---------------------------
  • #region Using directives
  • using System;
  • using System.Collections.Generic;
  • using System.Text;
  • #endregion
  • namespace ConsoleApplication1
  • {
  • class Program
  • {
  • static void Main(string[] args)
  • {
  • string sKey = "Ceci est la clé avec des caractères non valide /+ ";
  • string sValue = "Quelle phrase voulait vous encodé ?";
  • Vigenere oVigenere = new Vigenere(sKey);
  • Console.WriteLine(sValue);
  • Console.WriteLine("donne une fois code : ");
  • Console.WriteLine(oVigenere.Encrypt(sValue));
  • Console.ReadLine();
  • Console.WriteLine("Verification : ");
  • Console.WriteLine(oVigenere.Encrypt(oVigenere.Decrypt(sValue)));
  • Console.ReadLine();
  • }
  • }
  • /// <summary>
  • /// http://www.bibmath.net/crypto/poly/vigenere.php3
  • /// </summary>
  • public class Vigenere
  • {
  • #region " Constante "
  • private const string Alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
  • #endregion
  • #region " Properties "
  • private string key;
  • public string Key
  • {
  • get { return key; }
  • }
  • #endregion
  • #region " Constructor "
  • /// <summary>
  • /// Je définis une clé provisoire pour pouvoir encoder la clé.
  • /// J'encode la clé pour deux raisons, il sera ensuite plus difficile de décrypter, et cela resoud les problèmes d'une clé contenant des caractère interdit
  • /// </summary>
  • /// <param name="cle"></param>
  • public Vigenere(string cle)
  • {
  • key = "Cryptage par algorythme de Vigenere";
  • key = Encrypt(cle);
  • }
  • #endregion
  • #region " Encryptage "
  • public string Encrypt(string ChaineaEncoder)
  • {
  • string encrypt = null;
  • for (int i = 0; i < ChaineaEncoder.Length; i++)
  • {
  • char test = CharEncrypt(key[i % key.Length], ChaineaEncoder[i]);
  • encrypt += @test;
  • }
  • return encrypt;
  • }
  • /// <summary>
  • /// S'il existe un caractère invalide il serait remplacé par le caractère d'espacement
  • /// </summary>
  • /// <param name="X"></param>
  • /// <param name="Y"></param>
  • /// <returns></returns>
  • private char CharEncrypt(char X, char Y)
  • {
  • byte NumX = (byte)Alphabet.IndexOf(X);
  • byte NumY = (byte)Alphabet.IndexOf(Y);
  • if (NumY.Equals((byte)255))
  • {
  • Console.WriteLine("Charactère à encoder invalide : " + Y.ToString());
  • NumY = (byte)Alphabet.IndexOf(' ');
  • }
  • string alphabet;
  • alphabet = Alphabet.Substring(NumY) + Alphabet.Remove(NumY);
  • return alphabet[NumX];
  • }
  • #endregion
  • #region " Decryptage "
  • public string Decrypt(string ChaineaDecrypter)
  • {
  • string decrypt = null;
  • for (int i = 0; i < ChaineaDecrypter.Length; i++)
  • {
  • char test = CharDecrypt(key[i % key.Length], ChaineaDecrypter[i]);
  • decrypt += @test;
  • }
  • return decrypt;
  • }
  • private char CharDecrypt(char X, char Result)
  • {
  • byte NumX = (byte)Alphabet.IndexOf(X);
  • byte NumResult = (byte)Alphabet.IndexOf(Result);
  • string alphabet;
  • alphabet = Alphabet.Substring(NumX) + Alphabet.Remove(NumX);
  • return (char)Alphabet[alphabet.IndexOf(Result)];
  • }
  • #endregion
  • }
  • }
#region Using directives

using System;
using System.Collections.Generic;
using System.Text;

#endregion

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string sKey = "Ceci est la chaîne clé";

            string sValue = "Voici le texte à encoder avec quelques caractères pénibles // !=] %ù ô i () \" ";



            Vigenere oVigenere = new Vigenere(sKey);
            Console.WriteLine(sValue);
            Console.WriteLine("donne une fois code : ");
            DateTime dDateDeb = DateTime.Now;
            Console.WriteLine(oVigenere.Encrypt(sValue));
            Console.WriteLine("L'encryptage a duré : " + (DateTime.Now.Subtract(dDateDeb).Ticks / 10000) + " ms");

            Console.ReadLine();

            Console.WriteLine("Verification : ");
            Console.WriteLine(oVigenere.Decrypt(oVigenere.Encrypt(sValue)));
            Console.ReadLine();
        }
    }


    /// <summary>
    /// http://www.bibmath.net/crypto/poly/vigenere.php3
    /// </summary>
    public class Vigenere
    {

        private string key;
        public string Key
        {
            get { return key; }
        }

        public Vigenere(string cle)
        {

            //            //Je code la clé avec une autre clé qui reprend tout les caractères
            //            #region "Mis en place de Alphabet"
            //            StringBuilder _key = new StringBuilder();
            //            for (int i = 0; i < 65535; i++)
            //            {
            //                _key.Append((char)i);
            //            }
            //            key = _key.ToString();
            //            #endregion
            //            key = Encrypt(cle)

            key = cle;

        }

        public string Encrypt(string ChaineaEncoder)
        {
            string encrypt = null;

            for (int i = 0; i < ChaineaEncoder.Length; i++)
            {
                // encrypt += (char)(((short)key[i % key.Length] + (short)ChaineaEncoder[i])%65536);
                // Equivalent à : 
                encrypt += Convert.ToString(Convert.ToChar((Convert.ToInt16(key[i % key.Length]) + Convert.ToInt16(ChaineaEncoder[i])) % 65536));
            }

            return encrypt;
        }

        public string Decrypt(string ChaineaDecrypter)
        {
            string decrypt = null;

            for (int i = 0; i < ChaineaDecrypter.Length; i++)
            {
                // decrypt += (Char)(((short)ChaineaDecrypter[i] - (short)(key[i % key.Length])) % 65536);
                // Equivalent à : 
                decrypt += Convert.ToString(Convert.ToChar(((Convert.ToInt16(ChaineaDecrypter[i]) - Convert.ToInt16(key[i % key.Length])) % 65536)));
            }

            return decrypt;
        }

    }
}



//------------------------ Ancienne Version ---------------------------

#region Using directives

using System;
using System.Collections.Generic;
using System.Text;

#endregion

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string sKey = "Ceci est la clé avec des caractères non valide /+ ";

            string sValue = "Quelle phrase voulait vous encodé ?";

            Vigenere oVigenere = new Vigenere(sKey);
            Console.WriteLine(sValue);
            Console.WriteLine("donne une fois code : ");
            Console.WriteLine(oVigenere.Encrypt(sValue));
            Console.ReadLine();

            Console.WriteLine("Verification : ");
            Console.WriteLine(oVigenere.Encrypt(oVigenere.Decrypt(sValue)));
            Console.ReadLine();
        }
    }


    /// <summary>
    /// http://www.bibmath.net/crypto/poly/vigenere.php3
    /// </summary>
    public class Vigenere
    {

        #region " Constante "

        private const string Alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";

        #endregion

        #region " Properties "

        private string key;
        public string Key
        {
            get { return key; }
        }

        #endregion

        #region " Constructor "

        /// <summary>
        /// Je définis une clé provisoire pour pouvoir encoder la clé.
        /// J'encode la clé pour deux raisons, il sera ensuite plus difficile de décrypter, et cela resoud les problèmes d'une clé contenant des caractère interdit
        /// </summary>
        /// <param name="cle"></param>
        public Vigenere(string cle)
        {
            key = "Cryptage par algorythme de Vigenere";
            key = Encrypt(cle);
        }

        #endregion

        #region " Encryptage "

        public string Encrypt(string ChaineaEncoder)
        {
            string encrypt = null;

            for (int i = 0; i < ChaineaEncoder.Length; i++)
            {
                char test = CharEncrypt(key[i % key.Length], ChaineaEncoder[i]);
                encrypt += @test;
            }

            return encrypt;
        }

        /// <summary>
        /// S'il existe un caractère invalide il serait remplacé par le caractère d'espacement
        /// </summary>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        /// <returns></returns>
        private char CharEncrypt(char X, char Y)
        {

            byte NumX = (byte)Alphabet.IndexOf(X);
            byte NumY = (byte)Alphabet.IndexOf(Y);
            if (NumY.Equals((byte)255))
            {
                Console.WriteLine("Charactère à encoder invalide : " + Y.ToString());
                NumY = (byte)Alphabet.IndexOf(' ');
            }
            string alphabet;
            alphabet = Alphabet.Substring(NumY) + Alphabet.Remove(NumY);

            return alphabet[NumX];
        }

        #endregion

        #region " Decryptage "

        public string Decrypt(string ChaineaDecrypter)
        {
            string decrypt = null;

            for (int i = 0; i < ChaineaDecrypter.Length; i++)
            {
                char test = CharDecrypt(key[i % key.Length], ChaineaDecrypter[i]);
                decrypt += @test;
            }

            return decrypt;
        }

        private char CharDecrypt(char X, char Result)
        {

            byte NumX = (byte)Alphabet.IndexOf(X);
            byte NumResult = (byte)Alphabet.IndexOf(Result);
            string alphabet;
            alphabet = Alphabet.Substring(NumX) + Alphabet.Remove(NumX);

            return (char)Alphabet[alphabet.IndexOf(Result)];
        }
        #endregion

    }
}

Conclusion

J'ai utilisé VC# 2005 Express Edition pour faire ce code, je pense que ca devrait qd meme fonctionner avec la framework 1.1 si c'est pas le cas faites le moi savoir

c'est la premiere fois que je codais en C# donc c'est possible que vous voyez des trucs farfelus, si c'est le cas, merci de me le dire.

j'aimerais avoir vos avis sur cette simplissime classe aussi bien sur cette classe que sur ma facon de codé en C#

 

Historique

09 août 2004 21:36:44 :
Ajout : - Mini Gestion des erreurs - Quelques caractères à Alphabet - Encodage de la clé, pour éliminer les caractères interdit
10 août 2004 13:41:11 :
Correction de la limitation du au nombre de caractère

Commentaires et avis

signaler à un administrateur
Commentaire de SimonKari le 10/08/2004 10:07:12

C'est un code assez concis que tu as là ! Mais en y réflechissant 2 minutes, j'ai pondu ceci :

Asc(Lettre à crypter) + Asc(Lettre clé) = Asc(Lettre codée)

Avec cette formule, il n'y a aucune limitation. Il faut simplement connaitre la page de code désirée. Et avoir 2 tableau qui contiennent le texte à crypter et le texte dupliqué de la clé.

Qu'en penses-tu ?

signaler à un administrateur
Commentaire de ousta le 10/08/2004 10:42:56

et lencryptage sha1 il ne vous convient pas?

signaler à un administrateur
Commentaire de jesusonline le 10/08/2004 11:12:19 administrateur CS

Je ne connais pas l'encryptage sha1, je sais qu'il existe dans le framework des classes de cryptage.
Mais mon but, n'est pas de concurrencer les grands algo de cryptage, mais je considére ca plus comme un exercice, j'ai trouvé un algo de cryptage sur internet et je m'entraine à le traduire en C#

Mais je suis d'accord que d'autres algo sont surement plus performant


SimonKari, je vais reflechir à ta méthode, mais j'ai un problème je ne trouve pas la fonction Asc,  je sais qu'elle existe en VB mais je ne sais encore pas comment faire pour qu'elle soit presente en C#

j'ai essayé using Microsoft.VisualBasic; mais ca ne marche pas :(

mais je reflechis à ta solution :)

signaler à un administrateur
Commentaire de SimonKari le 10/08/2004 12:17:50

System.Convert.ToInt32(Char)

signaler à un administrateur
Commentaire de jesusonline le 10/08/2004 13:43:19 administrateur CS

Merci SimonKari

J'ai trouvé une autre methode :

                encrypt += (char)(((short)key[i % key.Length] + (short)ChaineaEncoder[i])%65536);
               qui est equivalent à :
                encrypt += Convert.ToString(Convert.ToChar((Convert.ToInt16(key[i % key.Length]) + Convert.ToInt16(ChaineaEncoder[i])) % 65536));

la premiere est plus compact, mais je sais pas si elles sont equivalentes.

Je vais regarder avec ILDASM

signaler à un administrateur
Commentaire de jesusonline le 10/08/2004 13:55:32 administrateur CS

Je viens de comparer le code IL donc avec la version abregé le code de Decrypt faisait 83bytes contre 95bytes, et la grande difference c'est que dans le code allegé

au lieu de cette ligne (code IL) :
call int16 [mscorlib]System.Convert::ToInt16(char)

la version abregé a seulement  
conv.i2

Je sais pas si il y a une grande difference entre les deux,en tout cas niveau temps d'execution c'est sensiblement pareil, il faudrais faire des tests a grande echelle pour se rendre compte.

il y aurait il qqn qui connaitrait un peu le code IL ?

merci

signaler à un administrateur
Commentaire de deck_bsd le 18/01/2006 19:44:42

Merci pour l'adresse de l'algo :) Moi je m'en vai le faire en C :p .

signaler à un administrateur
Commentaire de ghuysmans99 le 29/11/2006 17:56:55

merci pour la formule, SimonKari !

signaler à un administrateur
Commentaire de pwalinett le 03/10/2007 11:04:02

bonjour, je voulais juste dire, moi je suis débutante en c# et on a des fois besoin de ce genre de code qui est efficace et pascompliqué. il m'a été bien utile alors merci beaucoup. tout n'a pas toujours besoin d'être compliqué! :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

cryptage [ par zeusdsl ] bonjour je debute le C depuis peu et je faire un prog de cryptage selon vigenereles codes sources que j ai eu sur d autres sites sont un pe Cryptage décryptage [ par maevacmoi ] Hello !Je dois créer pour aujourd'hui 15h une fonction C# permettant d'encrypter (et décrypter) un string avec une clef donnée (cf ci-dessous). J'ai t Cryptage ... [ par maevacmoi ] Hello !Je voudrais faire une fonction toute bête qui crypte un string selon une clef donnée et renvoi un string crypté. Et une autre fonction qui reço Cryptage asymetrique [ par stronglou ] LoulouBonjour,Quelqu'un pourrait-il me dire comment fairepour crypter un fichier ou autre en utilisant le cryptage asymétrique (si p Cryptage Decryptage à la volée [ par jdaviaud ] Salut tout le mondej'ai un programme qui se base sur un fichier Ini pour sa configuration.Ce que je veux, c'est lorsqu'il y a une modif de la configur Cryptage de string en C# ?????????????? [ par shinkan ] Bonjour,Je suis débutant en C#, j'aimerais crypter et décrypter des chaines de caracteres avant de les écrire ou lire.Je ne cherche pas à crypter des Programme de cryptage [ par LFHL ] LFHLSalut je m'appelle LFHL je suis débutant je voudrais savoir comment fonctionne L'Algorithme ou le cryptage car je voudrais crée un programme de cr Police et cryptage [ par LFHL ] LFHLBonjour je voudrai savoir si on peut  faire une police de caracére pour un programme? j'expliqueje consoi un programme de cryptage et quand l'util cryptage de la table des utilisateurs [ par cudenetf ] bonjour,j'utilise sqlexpress et j'aimerais que ma table contenant le sutilisateurs avec leur login , mot de passe et niveau soit crypté.peut -on  cryp code source vigenere [ par ptipat ] bonjour , voila je cherche comment on utilise les sources pour pouvoir decrypter un pass , ou existe t'il un pti logiciel qui fait ceci , j'ai la cles


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.