[Ex] Mercury

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Zippo
Niveau 6
Niveau 6
Messages : 243
Enregistré le : mar. 30 nov. 2010 12:50
Status : Hors ligne

[Ex] Mercury

#1

Message 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:.
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [Ex] Mercury

#2

Message 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 ;)
Si vis pacem para bellum
Avatar du membre
Zippo
Niveau 6
Niveau 6
Messages : 243
Enregistré le : mar. 30 nov. 2010 12:50
Status : Hors ligne

Re: [Ex] Mercury

#3

Message par Zippo »

Merci beaucoup de ton indication, je vais amélioré mon codage alors ! Je vous tien au courant.
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [Ex] Mercury

#4

Message 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 ;)
Si vis pacem para bellum
Avatar du membre
Zippo
Niveau 6
Niveau 6
Messages : 243
Enregistré le : mar. 30 nov. 2010 12:50
Status : Hors ligne

Re: [Ex] Mercury

#5

Message 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.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [Ex] Mercury

#6

Message par jchd »

Tu voilà donc animé d'une sérieuse motivation pour rendre ton parcours plus concluant !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Zippo
Niveau 6
Niveau 6
Messages : 243
Enregistré le : mar. 30 nov. 2010 12:50
Status : Hors ligne

Re: [Ex] Mercury

#7

Message 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^^.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [Ex] Mercury

#8

Message 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 ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Zippo
Niveau 6
Niveau 6
Messages : 243
Enregistré le : mar. 30 nov. 2010 12:50
Status : Hors ligne

Re: [Ex] Mercury

#9

Message 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
Avatar du membre
arrkhan
Niveau 8
Niveau 8
Messages : 528
Enregistré le : sam. 17 nov. 2007 03:30
Status : Hors ligne

Re: [Ex] Mercury

#10

Message 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 ^^
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [Ex] Mercury

#11

Message 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:
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [Ex] Mercury

#12

Message 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.
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [Ex] Mercury

#13

Message par jchd »

Très vrai. Et là, BigNum est impérative.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [Ex] Mercury

#14

Message 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.
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Répondre