begin process at 2012 02 11 18:10:56
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité & Cryptage

 > MSA CRYPTAGE NON REVERSIBLE PAR MATRICE SEMI-ALÉATOIRE

MSA CRYPTAGE NON REVERSIBLE PAR MATRICE SEMI-ALÉATOIRE


 Description

Petit algo de cryptage par cryptage semi-aléatoire
je l'ai tester avec plusieur chaine tres ressenblante , et je n'ai pas trouvé de collision, ni de bug

exemple :
Texte original : aa
Resultat : H-D9-E/CD/D/9C/E

Texte original : bb
Resultat : I+E=+F*DE*E*=D*F

Texte original : ab
Resultat : H+D=-F/DD*D*9D/F

Texte original : ba
Resultat : I-E9+E*CE/E/=C*E

Texte original : poiuytreza
Resultat : Yb29fYtV2/SjrVmI

Texte original : pzertyuiop
Resultat : 1fRibVo0RkSum0pM

Source

  • using System;
  • using System.Collections.Generic;
  • using System.Linq;
  • using System.Text;
  • namespace YohanFrameWork.Security
  • {
  • public static class YFW_MSA
  • {
  • private static Char GetChatAtPos(int pos)
  • {
  • String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789=/*-+.";
  • return s[pos % s.Length];
  • }
  • /// <summary>
  • /// Creation d'une matrice de 256 * 256
  • /// </summary>
  • /// <param name="target">Chaine a crypter</param>
  • /// <returns></returns>
  • private static Int32[,] Matrice(String target)
  • {
  • Int32[,] Matrice = new Int32[256, 256];
  • int posInTarget = 0;
  • for (int i = 0; i < 256; i++)
  • {
  • for (int j = 0; j < 256; j++)
  • {
  • // A chaque élément de la matrice , on ajoute la valeur de i * j
  • Matrice[i, j] = target[posInTarget] + (i * j);
  • if (++posInTarget >= target.Length)
  • posInTarget = 0;
  • }
  • }
  • return Matrice;
  • }
  • /// <summary>
  • /// Divise la matrice par deux et opére un xor
  • /// </summary>
  • /// <param name="target"></param>
  • /// <returns></returns>
  • private static Int32[,] ComputeMatrice(Int32[,] target)
  • {
  • if (target.GetLength(0) < 8)
  • return target;
  • // Creation d'une nouvelle matrice de taille inferieur de 4 par rapport a target
  • Int32[,] matrice = new Int32[target.GetLength(0) / 2, target.GetLength(1) / 2];
  • for (int i = 0; i < matrice.GetLength(0); i++)
  • {
  • for (int j = 0; j < matrice.GetLength(1); j++)
  • {
  • matrice[(matrice.GetLength(0) - 1) - i, (matrice.GetLength(1) - 1) - j] ^= target[(target.GetLength(0) / 2) + i, (target.GetLength(1) / 2) + j];
  • }
  • }
  • return matrice;
  • }
  • /// <summary>
  • /// Crypte la chaine sur un algo a matice semi-aléatoire ( ce n'est pas reversible )
  • /// </summary>
  • /// <param name="target"></param>
  • /// <returns></returns>
  • public static String MSA_Crypte(this String target)
  • {
  • Int32[,] matrice = Matrice(target);
  • // Reduction de la matrice a 4 * 4
  • while (matrice.GetLength(0) > 4 && matrice.GetLength(1) > 4)
  • {
  • matrice = ComputeMatrice(matrice);
  • }
  • StringBuilder sb = new StringBuilder();
  • for (int i = 0; i < 4; i++)
  • {
  • for (int j = 0; j < 4; j++)
  • {
  • sb.Append(GetChatAtPos(matrice[i, j]));
  • }
  • }
  • return sb.ToString();
  • }
  • }
  • }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace YohanFrameWork.Security
{
    public static class YFW_MSA
    {

        private static Char GetChatAtPos(int pos)
        {
            String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789=/*-+.";
            return s[pos % s.Length];
        }

        /// <summary>
        /// Creation d'une matrice de 256 * 256
        /// </summary>
        /// <param name="target">Chaine a crypter</param>
        /// <returns></returns>
        private static Int32[,] Matrice(String target)
        {
            Int32[,] Matrice = new Int32[256, 256];
            int posInTarget = 0;
            for (int i = 0; i < 256; i++)
            {
                for (int j = 0; j < 256; j++)
                {
                    // A chaque élément de la matrice , on ajoute la valeur de i * j
                    Matrice[i, j] = target[posInTarget] + (i * j);

                    if (++posInTarget >= target.Length)
                        posInTarget = 0;
                }
            }
            return Matrice;
        }

        /// <summary>
        /// Divise la matrice par deux et opére un xor
        /// </summary>
        /// <param name="target"></param>
        /// <returns></returns>
        private static Int32[,] ComputeMatrice(Int32[,] target)
        {
            if (target.GetLength(0) < 8)
                return target;

            // Creation d'une nouvelle matrice de taille inferieur de 4 par rapport a target
            Int32[,] matrice = new Int32[target.GetLength(0) / 2, target.GetLength(1) / 2];


            for (int i = 0; i < matrice.GetLength(0); i++)
            {
                for (int j = 0; j < matrice.GetLength(1); j++)
                {
                    matrice[(matrice.GetLength(0) - 1) - i, (matrice.GetLength(1) - 1) - j] ^= target[(target.GetLength(0) / 2) + i, (target.GetLength(1) / 2) + j];
                }
            }


            return matrice;
        }

        /// <summary>
        /// Crypte la chaine sur un algo a  matice semi-aléatoire ( ce n'est pas reversible )
        /// </summary>
        /// <param name="target"></param>
        /// <returns></returns>
        public static String MSA_Crypte(this String target)
        {
            Int32[,] matrice = Matrice(target);

            // Reduction de la matrice a 4 * 4
            while (matrice.GetLength(0) > 4 && matrice.GetLength(1) > 4)
            {
                matrice = ComputeMatrice(matrice);
            }
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    sb.Append(GetChatAtPos(matrice[i, j]));
                }
            }
            return sb.ToString();
        }
    }
}

 Conclusion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using YohanFrameWork.Security;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string s = null;
                s = @"aa";
                Console.WriteLine("Texte original : {0}\nResultat : {1}\n", s, s.MSA_Crypte());

                s = @"bb";
                Console.WriteLine("Texte original : {0}\nResultat : {1}\n", s, s.MSA_Crypte());


                s = @"ab";
                Console.WriteLine("Texte original : {0}\nResultat : {1}\n", s, s.MSA_Crypte());

                s = @"ba";
                Console.WriteLine("Texte original : {0}\nResultat : {1}\n", s, s.MSA_Crypte());

                s = @"poiuytreza";
                Console.WriteLine("Texte original : {0}\nResultat : {1}\n", s, s.MSA_Crypte());

                s = @"pzertyuiop";
                Console.WriteLine("Texte original : {0}\nResultat : {1}\n", s, s.MSA_Crypte());
            
            }
            catch (ArgumentException ex )
            {

                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
    }
}


 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) PANEL IRC AVEC MARGE DEPLACABLE ET BACKGROUND IMAGE
Source avec Zip Source .NET (Dotnet) OBJECT DYNAMIC PAR REFEXION ET DATAGRIDVIEW
Source avec Zip Source avec une capture Source .NET (Dotnet) USERCONTROL PLANNING / SEMAINE / JOURNÉE
Source avec une capture Source .NET (Dotnet) CPRB CRIPTAGE PAR POSITION ALÉATOIRE DE CLOCK
Source avec Zip Source avec une capture Source .NET (Dotnet) USERCONTROL DE GESTION DE PLUSIEUR LISTE D'OBJECT

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTOGRAPHIE DE RÉPERTOIRE (AES 256) par Vallorbain
Source avec Zip Source .NET (Dotnet) COPIE DE CLÉ USB AUTOMATIQUE par pigedanslelac
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTOGRAPHY par DanMor498
Source avec une capture Source .NET (Dotnet) CPRB CRIPTAGE PAR POSITION ALÉATOIRE DE CLOCK par yohan49
Source avec Zip Source avec une capture UTILITAIRES DE DÉCODAGE ET D'ENCODAGE par Warny

 Sources en rapport avec celle ci

Source avec une capture Source .NET (Dotnet) CPRB CRIPTAGE PAR POSITION ALÉATOIRE DE CLOCK par yohan49
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTAGE PAR CESAR par youma85
Source avec Zip Source avec une capture Source .NET (Dotnet) CAPTCHA [VS 2005] par DelphiCool
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTO MANAGER par mastercatz
Source avec Zip Source .NET (Dotnet) CIPHER: UNE DLL POUR CRYPTER DES FICHIERS AVEC .NET par Romano58

Commentaires et avis

Commentaire de Julien39 le 24/06/2010 07:14:13 administrateur CS

Je me trompe peut être mais je ne pense pas que ton algo donne réellement un cryptage non réversible...

Commentaire de yohan49 le 24/06/2010 12:13:07

salut

Texte original : aaaaaaaaaa
Resultat : H-D9-E/CD/D/9C/E

Texte original : aaaabaaaaa
Resultat : H-D9-E*CD/D/=C/E

j'ai essayé de faire une fonction pour remonter du resultat a la chaine original , mais j'ai pas reussi

Commentaire de Bidou le 24/06/2010 13:27:37 administrateur CS

Je ne sais pas si c'est réversible ou pas (pas envie de perdre du temps mais à mon avis ça risque bien de l'être...) mais en tout les cas, c'est totalement inutile: les algos dans lesquels ont peut avoir confiance font très bien leur travail et sont déjà implémentés dans le framework .NET.

Pas besoin de (mal) réinventer la roue...

Commentaire de Warny le 24/06/2010 17:02:04

@Bidou : Je ne suis pas d'accord avec toi sur ce point. Proposer un tel algo pour le sport me paraît être bonne une chose. Il est néanmoins important de le préciser.

@yohan49 : un tel algo ne correspond pas à du cryptage, mais à du hashage. Le cryptage sert à rendre illisible pour le commun des mortel, alors que le hashage sert à transporter des données de comparaisons (et dans certain cas à générer des séries aléatoires). Comme il s'agit d'une fonction de hashage, pour bien faire, tu devrais implémenter l'interface des fonctions de hashages.
Sinon pour la ritique de l'algo en lui même. utiliser une matrice de 256*256 d'entier sur 4 octets me paraît un peu lourd.
Pour l'attaque, la taille de la matrice de départ me fait penser qu'en soumettant des chaînes de 262144 caractères similaires, il doit y avoir des collisions des parties du hash. A voir...

Commentaire de Warny le 24/06/2010 17:06:22

Milles excuses. Il faut tester avec des chaînes de 65536 caractères (256*256 = taille de la matrice)

Commentaire de Bidou le 24/06/2010 17:23:58 administrateur CS

C'est bien pour s'amuser le week-end, effectivement, mais personne de sérieux en entreprise prendrait le risque d'implémenter une chose pareille! non?

Mon message était donc là pour prévenir les éventuelles personnes qui fonceraient tête baissées...

Commentaire de yohan49 le 24/06/2010 17:26:43

Lol BiDou , tu ma devancer de deux seconde , c justement ce que j'allait dire ! implementer des algos non tester dans des appliquations n'est pas a faire ! moi je cherche juste a reflechir au systeme qui pourrait etre fait :)

Commentaire de Bacterius le 13/07/2010 06:29:54

Non, c'est irréversible en général car le domaine (ensemble d'entrée) est plus grand que le codomaine (ensemble de sortie).

Toutefois il me semble relativement aisé de trouver une collision sur un algorithme aussi simple, une attaque algébrique est triviale ici. Essentiellement le problème est de trouver deux matrices qui produisent la même semimatrice après réduction, ce qui me semble peu ardu étant donné la complexité de la fonction de réduction.

Développer des algorithmes cryptographiques en tant qu'amateur peut être intéressant (bien sûr il ne faut pas les utiliser pour un usage sérieux mais juste pour le fun), car il faut développer des techniques de construction et d'optimisation afin de rendre l'algorithme suffisamment performant niveau cryptographique et informatique (un méga algo qui tourne à 1 ko/s ne sert à rien sauf dans des cas très particuliers, mais un algo peu sûr a beau tourner à 4 Go/s, il ne sert à rien de toute façon).

Cordialement, Bacterius !

 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 les matrices [ par pirate75000 ] Comment créer une matrice a partir d'une image bmp,je pense que pour recréer le fichier bmp a partir d'une matrice on fait l'opération inversele but e 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 ArrayList (C#) vers int ** [ par typhoonx ] Bonjour, je voudrai réaliser une conversion d'un ArrayList contenant un ArrayList pour chaque case du premier ArrayList en int ** dans le but d'appele le produit de deux matrices,l'inverse de deux matrices,le transposé d'une matrice et l'inverse d'une matrice [ par mimikomi ] j'ai besoin des codes sources de produit de deux matrices,l'inverse de deux matrices,le transposé d'une matrice et l'inverse d'une matrice en java et Surcharge de l'opérateur "[ ]" ... [ par LocalStone ] Bonjour ... J'ai une toute petite question un peu b&#234;te, mais j'arrive pas &#224; trouver dans les documentations ... Comment peut-on surcharger


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales