Page 1 sur 1

[Ex] Mercury

Posté : jeu. 21 avr. 2011 17:24
par Zippo
Salut tout le monde,
Un jour, il n'y a pas si longtemps, je m'ennuyais sur mon ordinateur. Je n'avais pas de projet de programmation, donc j'ai regardé la télé :), je suis tombé par hasard sur le film Code Mercury.
► Afficher le texte
@Source : http://www.cinemovies.fr

Après avoir vu ce film, j'ai pensé à faire un script pour codé un texte. Script appelé gentillement Mercury^^...

J'ai créé à cette idée un script avec 2 fonctions; Crypter nommée _Mercury_Crypt & Décrypter nommée _Mercury_Decrypt

Code : Tout sélectionner

_Mercury_Crypt($_Char,$mute)
$_Char = Le texte à crypté.
$mute = C'est la difficulté à crypté, plus le chiffre est grand, plus le message sous la forme crypté va être grand.

Code : Tout sélectionner

_Mercury_Decrypt($_Char)
$_Char = Le texte sous la forme crypté.

Exemple :
Hello world peut ainsi s'écrire comme ceci : 338510:48746880:68381040:73120320:73120320:75151440:21665280:58902480:75151440:77182560:67704000:338530
Ou encore :
363626:52363584:73454472:78545376:78545376:80727192:23272704:63272664:80727192:82909008:72727200:363646
245690:35380800:49631400:53071200:53071200:54545400:15724800:42751800:54545400:56019600:49140000:245710
521420:75085920:105328860:112628880:112628880:115757460:33371520:90728820:115757460:118886040:104286000:521440
537800:77444640:108637620:116166960:116166960:119393820:34419840:93578940:119393820:122620680:107562000:537820
335780:48353760:67829580:72530640:72530640:74545380:21490560:58427460:74545380:76560120:67158000:335800

Oui Oui tout sa veulent simplement dire : Hello world.

Voici le script :

Code : Tout sélectionner

#include <String.au3>;J'inclus la bibliothèque String
#include <Array.au3>;J'inclus la bibliothèque Array

Func _Mercury_Decrypt($_char)
    Local $decrypt;Définition de la variable decrypte
    $_array = _StringExplode($_char,":", 0);Définie la variable _array par la fonction _StringExplode 
    $mute = $_array[UBound($_array) -1] + $_array[0];Définie la variable mute par la variable _array[Ubund(_array)] plus _array[0]
    For $i = 1 To UBound($_array) - 2 Step 1;Boucle qui comme à 1 et ce fini à ubund(_array) avec un step de 1
        $decrypt &= _Decalcule_Char($_array[$i],$mute);Définie la variable decrypt par la fonction _Decalcue_Char
    Next
    Return $decrypt;Renvoie le texte décrypté
EndFunc

Func _Decalcule_Char($chars,$mute)
    $mult_chars = $chars / $mute;Définie la variable mult_chars par chars divisé par mute
    $result = Chr($mult_chars);Définie la variable result par mult_chars correspondant à un code d'ASCII qui définie un caractère
    Return $result;Retourne le caractère
EndFunc

Func _Mercury_Crypt($_char,$mute)
    Local $chaine;Définition de la variable chaine
    FileDelete(@TempDir&"\"&"crypt.tmp");Supprime l'ancien fichier crypt.tmp
    $file = FileOpen(@TempDir&"\"&"crypt.tmp", 1);Créer un nouveau fichier crypt.tmp qui est localisé dans TEMP
    If @error Then Exit;Si il y a une erreur, il se coupe
    FileWrite($file,$_char);Ecrit le texte
    FileClose($file);Ferme le handle
    $file = FileOpen(@TempDir&"\"&"crypt.tmp", 0);Réouvre le fichier avec le MODE 0 pour le lire
    If @error Then Exit;Si il y a une erreur, il se coupe
    $rand = StringLen($_char);La variable rand calcule le nombre de caractère qu'il y a dans le texte
    $cal_mute = $mute / 2;La variable cal_mute est égale à la moitié de la variable mute
    $chaine &= Number($cal_mute - $rand) &":";Premier configuration du cryptage, la variable cal_mute - rand et ajoute ':' 
    While 1;Boucle
        $chars = FileRead($file, 1);Définie la variiable chars par les caractères pris 1 par 1 du texte dans le fichier crypt.tmp
        If @error = -1 Then ExitLoop;Quand il n'y a plus de caractère à traîté, fin de boucle
        $chaine &= _Calcule_Char($chars,$mute);Traîte le caractère 1 par 1
    Wend
    $chaine &= $cal_mute + $rand;Ajoute à la variable chaine la variable cal_mute + rand
    FileClose($file);Ferme le handle du fichier
    FileDelete(@TempDir&"\"&"crypt.tmp");Supprime le fichier crypt.tmp
    Return $chaine;Retourne la chaîne du texte sous la forme crypté
EndFunc

Func _Calcule_Char($chars,$mute)
    $mult_chars = Asc($chars) * $mute;Définie la variable mult_chars par la variable chars sous ASCII multiplié par mute
    $mult_chars &= ":";Ajout de ':' 
    Return $mult_chars;Retourne chars traîté
EndFunc
Explication :
Commençons par le cryptage : Il prend la chaîne de caractère que vous lui avez donné, la copie dans un fichier situé dans TEMP, il le ré-ouvre et le lis caractère par caractère. Il prend un caractère, le traduit en ASCII puis le multiplie par la variable mute.

Décryptage : Pour décrypter la chaîne de caractère, il faut bien évidement la variable mute qui à été définie lors du cryptage. Mais pour que le décryptage fonctionne, il faut la variable mute. Regardé de plus prêt ces deux chaîne de caractère bleu :
473918:68245632:95733456:102368448:102368448:105212016:30331392:82463472:105212016:108055584:102368448:94785600:473938
C'est l'ensemble de ces deux chaînes de caractère que l'on obtient la variable mute. En locurence, ici, la variable mute est égal à 473918 + 473938 = 947856.
Donc pour le décrypté le programme fait :
68245632 divisé par 947856 est égal à 72 traduit en ASCII cela fait : H
95733456 divisé par 947856 est égal à 101 traduit en ASCII cela fait : e
102368448 divisé par 947856 est égal à 108 traduit en ASCII cela fait : l
102368448 divisé par 947856 est égal à 108 traduit en ASCII cela fait : l
105212016 divisé par 947856 est égal à 111 traduit en ASCII cela fait : o
30331392 divisé par 947856 est égal à 32 traduit en ASCII cela fait : ;C'est un espace
82463472 divisé par 947856 est égal à 119 traduit en ASCII cela fait : w
105212016 divisé par 947856 est égal à 111 traduit en ASCII cela fait : o
108055584 divisé par 947856 est égal à 114 traduit en ASCII cela fait : r
102368448 divisé par 947856 est égal à 108 traduit en ASCII cela fait : l
94785600 divisé par 947856 est égal à 100 traduit en ASCII cela fait : d
Ce qui donne : Hello world

Voilà :) Ma démonstration est finie :p.
J'espère avoir bien expliqué, Bonne fin d'aprèm' à tous!

Ps: C'est impressionnant quand on configure la variable mute par @MDAY*@MON*@MSEC*StringLen(@ComputerName) ce n'est jamais la même configuration :twisted: :twisted:.

Re: [Ex] Mercury

Posté : jeu. 21 avr. 2011 20:02
par zeshrek
Hmmmm
Algo beaucoup trop simple.
Comme chaque lettre aura a chaque fois le même code, puisqu'elle a toujours le même code ascii et qu'elle est multipliée par le même 'mute' une simple analyse de fréquence des 'mots' permettra de retrouver les lettres.
Bref, en terme de complexité, c'est a peu pres du même niveau que le code de César, cad c'est un code qui ne demande même pas un ordinateur pour le casser.
Mais bon, créer ton propre code de César est un premier pas dans la cryptographie.
L'étape suivante consiste a faire un cryptage facon Vigene(ou un nom de ce genre, j'ai oublié le nom exact) Vernam cad avec une table a double entrée, la première étant le message, la second la clé, la combinaison donnant le cryptograme. C'est la base du cryptage a masque jetable (la même clé sert au cryptage et au décryptage, donc pour éviter qu'elle soit identifiée, elle ne doit servir qu'une fois).
Apres tu pourras passer au cryptage a clé publique/clé privée.
Et ensuite il te restera plus qu'a postuler a la NSA ;)

Edit j'ai vérifié, le masque jettable c'est Vernam. Y a d'ailleur une page wikipédia a son sujet ;)

Re: [Ex] Mercury

Posté : jeu. 21 avr. 2011 20:25
par Zippo
Merci beaucoup de ton indication, je vais amélioré mon codage alors ! Je vous tien au courant.

Re: [Ex] Mercury

Posté : jeu. 21 avr. 2011 22:51
par zeshrek
De rien.
Au fait tu fais quoi les 5 prochaines années ? parcqu'il faudra penser a passer un doctorat en mathématiques si tu veux t'orienter sur la création de codes.
Par contre si tu veux te lancer dans el cassage de codes, oriente toi plutot vers un doctorat en physique quantique, il parait que l'ordinateur quantique sera l'outil révé pour casser tous les codes existants... le jour ou lui même existera ;)

Re: [Ex] Mercury

Posté : jeu. 21 avr. 2011 23:07
par Zippo
Je suis très intérressé par tout sa et je *voudrais* devenir déveuloppeur donc des études d'informatique du cercle de la programmation, malheureusement et je suis le seul responsable, mon parcourt scolaire n'est pas concluant ... Et 5 ans je crois que ce n'est pas assez ^^, je suis en 3ème.

Re: [Ex] Mercury

Posté : jeu. 21 avr. 2011 23:11
par jchd
Tu voilà donc animé d'une sérieuse motivation pour rendre ton parcours plus concluant !

Re: [Ex] Mercury

Posté : jeu. 21 avr. 2011 23:22
par Zippo
Bah c'est à dire que mes choix de parcourt ont été totalement rétrécie ... Au point de ne pas pouvoir le faire.
Enfin breff ne parlons pas de ma vie^^.

Re: [Ex] Mercury

Posté : ven. 22 avr. 2011 10:11
par sylvanie
ça tombe bien que tu sois en 3eme, car si le pgcd est toujours au programme, alors sache que c'est un des moyen possible de cryptanalyser le code proposé.
En effet ce code est basé sur la multiplication des éléments d'un message par une même constante (le fameux mute).
Donc un moyen de le retrouver est de calculer le Plus Grand Diviseur Commun (pgcd) de tous les éléments du message (sous réserve qu'il y ai au moins 2 éléments premiers entre eux mais là on va mettre ça de côté).

Voici donc pour compléter ce post intéressant une attaque possible du message :

Code : Tout sélectionner

Dim $Message="48746880:68381040:73120320:73120320:75151440:21665280:58902480:75151440:77182560:67704000"
$tab=StringSplit($Message,":")
If Not IsArray($tab) Then Exit 1
$current_pgcd=$tab[1]
For $ind = 1 to $tab[0]-1
    $candidat=pgcd($tab[$ind],$tab[$ind+1])
    If $candidat<$current_pgcd Then $current_pgcd=$candidat
Next
ConsoleWrite($current_pgcd&@CRLF)
If $current_pgcd=0 Then Exit 2
$decoded=""
For $ind = 1 to $tab[0]
    $decoded&=chr($tab[$ind]/$current_pgcd)
Next


ConsoleWrite($decoded)


Func pgcd($a,$b)
    Local $reste
    If $b > $a Then Return pgcd($b,$a)
    If $b = 0 And $a = 0 Then
        SetError(1)
        Return 0
    EndIf
    SetError(0)
    If $b = 0 Then Return $a
    $reste=Mod($a,$b)
    If $reste = 0 Then Return $b
    Return pgcd($b,$reste)
EndFunc
 
Comme le disait Zeshrek, tu peux y aller crescendo en passant par vigenere, Beaufort, etc.
Voici 2 sites ludiques sans être "prise de tête" sur le sujets:
http://www.dcode.fr
http://www.apprendre-en-ligne.net/crypt ... index.html
Perso, j'adore ^^

Re: [Ex] Mercury

Posté : ven. 22 avr. 2011 18:20
par Zippo
Oui, je confirme, le PGCD est toujours d'actualité. Je vais regardé attentivement les 2 sites & le script si-join à ton message. merci

Re: [Ex] Mercury

Posté : mar. 26 avr. 2011 00:19
par arrkhan
Le vigenere est cassable de "tête", si le texte crypté est suffisamment long et la clé pas trop ^^
J'en avais cassé un avec mes petits neurones il y a une dizaine d'années pour un concours de crypto organisé par "Simon Singh" http://en.wikipedia.org/wiki/Simon_Singh
100000 £ était à la clé si ma mémoire est bonne ^^

Re: [Ex] Mercury

Posté : mar. 26 avr. 2011 09:30
par sylvanie
Bien-sûr qu'il est cassé, mais dans une optique d’apprentissage c'est plus soft de continuer par lui que d'attaquer AES et autre Feistel, sinon à se dégoûter :lol:

Re: [Ex] Mercury

Posté : mar. 26 avr. 2011 10:28
par ZDS
Hello!

Si tu es un peu bercé dans les maths, je t'aurai plutôt conseillé de laisser tomber les codes de base, et t'intéresser directement au RSA:lien (juste à remplacer tes multiplications par des puissances/modulo, et prévoir de générer des clefs).

C'est pas très compliqué sur le principe et ça reste le principe de cryptage le plus intelligent de mon point de vue, tant coté utilisation que coté fonctionnement.

Re: [Ex] Mercury

Posté : mar. 26 avr. 2011 12:23
par jchd
Très vrai. Et là, BigNum est impérative.

Re: [Ex] Mercury

Posté : mar. 26 avr. 2011 13:28
par sylvanie
RSA est très bien pour la signature et l’échange de clés, mais il faut garder à l'esprit qu'il n'est pas fait pour chiffrer des gros volumes d'information.
C'est d’ailleurs pour cela qu'il est souvent couplé avec un algo symétrique comme l'AES qui se charge de chiffrer les données, tant dis que RSA va chiffrer la clé symétrique de l'AES.
On peut dire de lui qu'il est très très bien pour les problématiques de cryptographie asymétrique, mais on ne peut pas l'utiliser pour tout faire.