Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 10-07-2018 08:02:33

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Longueur de clé

Bonjour à tous,

Pour les systemes (ou méthodes) de cryptologie, on parle souvent de "longueur de clé" !
J'ai consulté Wikipedia(*) à ce sujet, mais je doit dire qu'apres lecture de leur explication asssez complete je suis resté, malgré tout sur ma faim !
Si quelqu'un pouvait me donner une explication, sur la base d'un cas concret connu, comme par exemple le chiffre de vigenere avec les 26 lettre de l'alphabet, ça serait super!

Merci à vous

(*)https://fr.wikipedia.org/wiki/Longueur_de_cl%C3%A9

Hors ligne

#2 10-07-2018 12:35:25

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 907

Re : Longueur de clé

Bonjour,

Voilà un texte codé avec la méthode souhaitée et une clé de 8 lettres :


NQWYR PHYPV VSHZR MOUKH BREIM CTIRB GPDKG XVSEW PZREO EJIYC TGNWT SIKXI GGFRI CISZQ VTVZK
BRQGP ZTKGU MWJMM JIIMX IIMXI NZVGG MYZVR XVNQD PRXKV ZAJIY ECTCI HIGGR WZZGM GWLTZ Z

Le même texte codé de la même façon avec une clé de 5 lettres (la clé c'est... toi !) :


VQBIY OYFIH SWFJU LBXSX RVYSL XVPSR STTQU WQZBM XZWOV DAPRO QKLGW RVNFY WKZBH XKZAG HXLFY
AMXDF HTPQB LNQFY GMGWA HVPFY DDPQF HAGWH JBDWR OMEHL HAOSF DTAVU EMEQU VMCOC WAFDY U

Fait avec les outils BibMaths :
http://www.bibmath.net/crypto/index.php … poly/index
http://www.bibmath.net/crypto/index.php … y/vigenere
Mécanisme :
http://www.bibmath.net/crypto/index.php … y/vigenere

@+


Arx Tarpeia Capitoli proxima...

En ligne

#3 10-07-2018 13:20:34

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

"Si quelqu'un pouvait me donner une explication, sur la base d'un cas concret connu, comme par exemple le chiffre de vigenere avec les 26 lettre de l'alphabet, ça serait super!"

Voila la solution... ! mais ce n'est pas ça que je posait comme question ...?

Hors ligne

#4 10-07-2018 13:42:20

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

Et donc puisqu'on en est au devinette, voici la meme phrase codée avec ma methode (Vigenere sans ses defauts..) saurez vous trouver la clé ? ..et la methode ?
WECRJMWSFIVNVPXHQMNCWRCHYOHPMTIXTOGTTTNZPOJCBJLRRHCAMZJTIQGIRHVTMMQWVTTEYIONPNBECBBUFRGDNDMADYEMHPZNNAEDKUKFEDXQSXSBDKIXVNWJYGVUIEVFQJRZJAPVWMKCAR
un indice : "Le même texte codé de la (Presque de la) même façon avec une clé de 5 lettres (la clé c'est... toi !)
;-)

Hors ligne

#5 10-07-2018 15:49:16

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 907

Re : Longueur de clé

Re,

Voila la solution... ! mais ce n'est pas ça que je posait comme question ...?

Ah ?...
Tu voulais quoi alors ? Parce que là :
http://www.bibmath.net/crypto/index.php … y/vigenere
pour la méthode de Vigenère, tu as le fonctionnement de A à Z avec une clé utilisée, tout est expliqué et tu vois - en principe - parfaitement ce que c'est...
Donc, si ce n'est pas ce que tu veux, que voulais-tu donc ?

Sur ce, je me retire sur la pointe des pieds, en cherchant un trou de souris pour aller me cacher...
A l'avenir, je m'abstiendrai d'intervenir dans ce sous-forum.

Mille excuses.

@+


Arx Tarpeia Capitoli proxima...

En ligne

#6 10-07-2018 17:54:47

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

Bonsoir Yoshi,
Je connais bien la méthode de Vigénere et je disais même un peu plus haut que je m'en été inspiré pour en créer une (de méthode) qui normalement devrait supprimer les défauts de celle d'origine …!

Quand je parlais de longueur de clé, je voulais parler , non pas du nombre de caractères(ou symboles) qui compose la clé, mais plutôt de sa valeur correspondante en puissance de "2" on entend souvent parler de clé de 128 , 256 bits voire 1024 bits…!

Et donc ma question était de savoir comment est on  capable d'établir la "force" de la clé (exprimée en puissance de 2) d'une à une méthode comme celle de Vigénere ? j'ai mis dans mon 1er post un lien de Wikipedia qui parle de ça ..!
En tout cas merci déjà pour votre intérêt ..!

@+

Hors ligne

#7 14-07-2018 11:45:37

Rossignol
Membre
Inscription : 19-06-2015
Messages : 290

Re : Longueur de clé

Bonjour,

Si j'ai bien compris la question (ce n'est pas sûr), ce que vous appelez "longueur de la clé en bits" est une notion liée à la théorie de l'information.

Pour faire simple, l'entropie d'un cryptosystème est une mesure de l'espace des clés de ce système.
Si $K$ est le nombre de clés possibles, l'entropie du système est
$$H = \log_2(K)$$

On suppose, pour simplifier, que deux clés différentes donnent toujours deux chiffrements différents (ce n'est pas toujours le cas, voir plus bas).

L'entropie est définie à une constante (positive) multiplicative près; autrement dit, on peut changer de fonction logarithme.

Si on utilise le logarithme de base 2, l'unité est le shannon ou le bit (Shannon);
Si on utilise le logarithme de base 10, l'unité est le hartley ou le ban (Turing).
Si on utilise le logarithme naturel (base e), l'unité est le nat.

Prenons le cas d'une substitution simple. La clé est l'alphabet utilisé. Pour un alphabet de 26 lettres, il y a donc $26!$ clés possibles.
L'entropie pour la substitution simple est donc $\log_2(26!)\approx 88.38 \text{ bit}$ ou $\log_{10}(26!)\approx 26.6\text{ ban}$ ($266\text{ deciban})$ ou encore $\ln(26!)\approx 61.26 \text{ nat}$

Dans le cas d'un chiffrement par le système de Vigenère, la clé est de la longueur que l'on veut. Le nombre de possibilités est infini (dénombrable).
Si on se restreint aux clés de $n$ caractères d'un alphabet de 26 lettres, le nombre de clés est $26^n$, ce qui correspond à une entropie de $\log_2(26^n) = n\log_2(26) \approx 4.7n \text{ bit}$

Si on chiffre en Playfair, on remplit un carré de Polybe 5x5 : l'alphabet a 25 lettres.
Mais attention, compte tenu du procédé utilisé, on ne change pas le chiffrement en faisant une permutation circulaire sur les lignes ou les colonnes du carré : on n'a seulement que $\frac{25!}{5\times 5} = 24!$ possibilités.

L'entropie pour le Playfair est $\log_2(24!)\approx 79.04 \text{ bit}$

En cryptographie moderne, on utilise des clés en binaire. Le nombre de clés de 64 bits (8 octets) est $2^{64}$ ce qui correspond à une entropie de $\log_2(2^{64}) = 64 \text{ bit}$.
Pour une clé binaire, l'entropie en shannon est égale à la longueur de la clé en bits : c'est dû au fait qu'on utilise le logarithme de base 2. On comprend pourquoi on préfère utiliser le terme bit plutot que shannon.

Le calcul du nombre de clés d'un système n'est pas toujours facile.
Par exemple, pour le chiffre de Hill avec l'alphabet normal, les clés sont les matrices $n\times n$ inversibles dans $\mathbb{Z}/26\mathbb{Z}$.

Leur nombre est
$$K_n = \prod_{k=0}^{n-1}(2^{n}-2^{k})(13^{n}-13^{k})$$

(Pour le cas général voir le papier On the Keyspace of the Hill Cipher)

ce qui donne les entropies :

Hill 2x2 : $\log_2(157248) \approx 17.26 \text{ bit}$
Hill 3x3 : $\log_2(1634038189056) \approx 40.57 \text{ bit}$
Hill 4x4 : $\log_2(12303585972327392870400) \approx 73.38 \text{ bit}$
Hill 5x5 : $\log_2(64714617089933324791497994587340800) \approx 115.64 \text{ bit}$

On pourrait penser en voyant ces nombres que le vieux DES avec sa clé de 56 bit est beaucoup plus faible que le chiffre de Hill 5x5 avec son entropie qui fait plus du double.

C'est vrai, mais uniquement si on cherche la clé par force brute, c'est à dire en testant les clés une à une jusqu'à trouver la bonne.

Pour le DES on ne connait pas de raccourci; on en est réduit à la force brute. Craquer le DES est hors de portée de mon ordinateur perso.

Par contre, pour le chiffre de Hill, on connait des méthodes plus efficaces que la force brute. J'ai un programme Python qui casse le chiffre de Hill 5x5 en 3 heures environ.

Donc méfiance : pour un cryptosystème avoir une forte entropie est une condition nécessaire mais nullement suffisante pour assurer sa sécurité.

@+

Hors ligne

#8 15-07-2018 11:56:24

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

Bonjour Rossignol
Je serais curieux de voir ce que ça aurait donné, si vous aviez été « sûr » de la question… ?!  ;-)

Merci donc pour votre réponse donc très complète..…et qui prouve qu’il n’est pas aussi simple que ça d’établir la longueur d’une clé pour un système de chiffrement..!

J’exprimais un peu plus haut, le fait que j’avais mis au point, une méthode de chiffrement, basée sur le chiffre de chiffre de Vigénere,.
Cette Méthode consiste en fait, à introduire un décalage de « l’alphabet d’origine » à chaque « itération » ! c’est-à-dire que l’alphabet se décale de la valeur de l’indexation du caractère « trouvé » ( dans mon programme, je décale de sa valeur « Unicode » en décimal modulo (nombre de caractère de l’alphabet) et ceci donc pour chaque caractère ! En résumé,  pour chiffrer (et déchiffrer) une phrase contenant « n » caractères, on doit construire  n  « carré de Vigénere » !
Je ne pense pas avoir lu et trouvé un système « équivalent », dites-moi si j’ai loupé quelque choses dans mes lectures (passionnantes )
si cela vous tente de la « tester » et de me faire part de vos commentaires,
Je serais incapable de « formaliser mathématiquement » cette méthode (je vous en laisse le soin), par contre, je vous livre
les morceaux de code (vb.net) que j’ai écrit pour ce système . Je vous laisse le soin de faire la conversion en Python,. 
Dans mon programme l’alphabet que j’ai choisi comporte 215 caractères mais dans l’exemple ci-dessus, il n’y a que les 26 lettre de l’alphabet. 
Voici donc le code, où :
PhC = le caractere a chiffrer (ou a déchiffré)
COD = le caractère de la clé
Alphabet(1)=65 Alphabet(2)=66 …alphabet(26)= 90 (Unicode décimal de chaque lettre de l’alphabet)
DimModulo = 26
AlphabetNew=  « ABCDF….XYZ »
0 <= IdCard <=25 (décalage de l’alphabet)

‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’Chiffrement’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
Lgn = (InStrRev(AlphabetNew, PhC) - 1 + IdCar) Mod (DimModulo)
            Cln = (InStrRev(AlphabetNew, Cod) - 1 + IdCar) Mod (DimModulo)
            PosCar = (Lgn + Cln) Mod (DimModulo)
            If ((PosCar - IdCar) Mod (DimModulo) + 1) Mod (DimModulo) = 0 Then
                ResulText = ResulText + ChrW(Alphabet(DimModulo, 1))
            Else
                LgnCalcL = (PosCar - IdCar) Mod (DimModulo)
                If LgnCalcL < 0 Then LgnCalcL = DimModulo + LgnCalcL
                ResulText = ResulText + ChrW( Alphabet(  (LgnCalcL + 1) Mod (DimModulo) ) )
            End If
            IdCar = (IdCar + PosCar) Mod (DimModulo)
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’DéChiffrement’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’

Lgn = (InStrRev(AlphabetNew, PhC) - 1 + IdCar) Mod (DimModulo)
Cln = (InStrRev(AlphabetNew, Cod) - 1 + IdCar) Mod (DimModulo)           
            If Cln > Lgn Then
                    PosCar = DimModulo - Cln + Lgn
            Else:
                    PosCar = Lgn - Cln
            End If
            ClnCalcL = (PosCar - IdCar) Mod (DimModulo)
            If ClnCalcL < 0 Then ClnCalcL = DimModulo + ClnCalcL
            ClnCalcL = (ClnCalcL + 1) Mod (DimModulo)
            If ClnCalcL = 0 Then ClnCalcL = DimModulo
           ResulText = ResulText +  = ChrW( Alphabet(ClnCalcL))
            IdCar = (IdCar + Lgn) Mod (DimModulo)
     ‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’fin’’’’’’’’’’’’’’’’’’’’’’’’’’
évidement ce code n'est pas complet, il faut le compléter par le découpage de la phrase par les caractères de la clé…"façon Vigénere"…!

Bon courage et merci encore

Dernière modification par Dilou (15-07-2018 12:15:21)

Hors ligne

#9 15-07-2018 13:49:15

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 907

Re : Longueur de clé

Salut,

Côté informatique.
Les codes Unicode des lettres de A à Z se confondent avec les codes ASCII...
Il y a 7 ans, j'avais moi aussi implémenté une variante de Vigenère avec un procédé que je pensais amélioré : l'applet du site ne déchiffre pas mon message même en lui donnant la clé...


#!/usr/bin/env python
# -*- coding: Latin-1 -*-

def prepare(PhraseEnClair):
    li1=["âà","éèêë","îï","ô","ûü","ç"]
    li2=["A","E","I","O","U","C"]
    i=0
    # Remplacement des caractères accentués éventuels
    for mot in li1:
       repl=li2[i]
       for lettre in mot:
           PhraseEnClair=PhraseEnClair.replace(lettre,repl)
       i+=1      
    for lettre in " ',-;:!?. ":            # Suppression de la ponctuation et des espaces
        PhraseEnClair=PhraseEnClair.replace(lettre,"")
    PhraseEnClair=PhraseEnClair.upper()    # Passage en majuscules
    return PhraseEnClair

Cle="PAGOTZINKAY"
LongCle=len(Cle)
decalage=[]
Crypt=""
for i in range(LongCle):              # Calcul des décalages à appliquer et rangement dans tableau
    decalage.append((ord(Cle[i])-65-i))
   
PhraseEnClair="Sur la corniche la terre etait rouge et fertile, les arbres \
et les sources abondaient. En ce monde de solitude, nous trouvions à la fois \
l'espace et la sécurité. Nous l'appelâmes pa gotzin Kay ce qui veut dire \
le fort de la montagne du paradis. Coupée du monde de deux côtés par un merveilleux\
paysage de rochers, cette corniche n'était accessible sans danger qu'à un aigle \
ou un cerf."

# Les \ ci-dessus permettent d'étaler le texte sur plusieurs lignes

MessageClair=PhraseEnClair  # Je garde la trace du message d'origine avant retouches
PhraseEnClair=prepare(PhraseEnClair)
LongPhraseEnClair=len(PhraseEnClair)

for i in range(LongPhraseEnClair):
    lg=ord(PhraseEnClair[i])
    j=i%LongCle
    asc=lg-decalage[j]
    asc=asc-26*(asc>90)+26*(asc<65)
    Crypt+=chr(asc)
print
# Préparation du message de sortie en groupes de 5 lettres séparés par une espace    
Coupes=LongPhraseEnClair//5-(LongPhraseEnClair%5==0)
for i in range(Coupes):
    # Ci-dessous : équivalent BASIC : MID$(Crypt$,i,5+6*i)+" "+MID$(Crypt$,5+6*i,LongPhraseEnClair-5-6*i)
    Crypt=Crypt[0:5+6*i]+" "+Crypt[5+6*i:LongPhraseEnClair]
    # Ci-dessous l'équivalent de LongPhraseEnClair=LongPhraseEnClair+1
    LongPhraseEnClair+=1
   
print ("           Message d'origine :")   # non modifié
print (MessageClair)
print ()
print ("           Message crypté :")
print (Crypt)
 

Sortie :

Message d'origine :
Sur la corniche la terre etait rouge et fertile, les arbres et les sources abondaient. En ce monde de solitude, nous trouvions à la fois l'espace et la sécurité. Nous l'appelâmes pa gotzin Kay ce qui veut dire le fort de la montagne du paradis. Coupée du monde de deux côtés par un merveilleux paysage de rochers, cette corniche n'était accessible sans danger qu'à un aigle ou un cerf.

           Message crypté :
DVNAL IMLLR OSFHP EKPLC NFLJP GZAEY CCRPS PXWKJ YQJDM SAHPZ JYQBA FSYTD GZILM MTFJI PTAYK XZOFZ TDUJC RDPPO KJDZP ISEUZ OOPWG DIGBX PTLPN KCNJJ EPDQG TZCHM DEWBL EPRYG CBBLH KIKOL EYHOP RQXGK SNBRD PMAUZ XRXCU MXPJI LMLYB DBLSW STYAI SYQPE QBZTB YBNPP VTRZZ CMNJD FOITC BCCJU QFYLP JYYAC MQCPY WPXQW CCFPD KGYOA BCWQE BEILI AYQBU MMAHL TQXYW SPSMJ LALUG PXPPQ JYICL D

Pourtant gielev et feu nerosson mis au défi ont déchiffré assez le vide le message et cherché seulement après, quelle était la clé...

Le procédé crayon/papier de feu nerosson est décrit ici :
http://www.bibmath.net/forums/viewtopic.php?id=3738

Le programme ci-dessus date de 2011, les échanges avec gielev et feu nerosson de 2010 : je ne me souviens plus si j'avais procédé à une une modification ou pas.
Sûrement, parce que le texte chiffré n'est pas le même que celui que j'avais fourni...
Je vais chercher le sens de chaque mot-clé de ton code, voir quel est l'équivalent Python, traduire puis comparer...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#10 15-07-2018 15:51:59

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

Bonjour Yoshi,

Voici ce que j'obtiens de mon coté avec le même texte (SUR LA CORNICHE LA TERRE..) la même clé (PAGOTZINKAY) !
désolé, mon programme de découpe pas le résultat en lot de 5...

HBMPOFJNCUSYGBJLMDPZZGZBMRWTHKKVCTKVJNILMEINZIAMVJKJVZZIXRBEPEVGBVMUTAJTRWCCPPNOQXIRILVYLISWJXGVNAQNUGVGKSFBKKHWQARITBRXHELNSUJDKPDWSYDBAXGLXZMQCJNKPJYMEEKOIFXGDCTTAXCXKTVZGSTWVNUOCHGLIWPOOOCPHFHTJPXQAXGAIHOEZWPVEPFLKXKQPKZHYQBWWQKDXSCGLRZXGALDAJKLBPIMUEYFKJWBOCKCJFTSCBXEJZODSOKEHTIHBJKZLPCZGRJQR

A+

Hors ligne

#11 16-07-2018 07:29:24

gielev
Membre
Inscription : 08-03-2007
Messages : 407

Re : Longueur de clé

Dilou a écrit :

J’exprimais un peu plus haut, le fait que j’avais mis au point, une méthode de chiffrement, basée sur le chiffre de chiffre de Vigénere,.
Cette Méthode consiste en fait, à introduire un décalage de « l’alphabet d’origine » à chaque « itération » ! c’est-à-dire que l’alphabet se décale de la valeur de l’indexation du caractère « trouvé » ( dans mon programme, je décale de sa valeur « Unicode » en décimal modulo (nombre de caractère de l’alphabet) et ceci donc pour chaque caractère ! En résumé,  pour chiffrer (et déchiffrer) une phrase contenant « n » caractères, on doit construire  n  « carré de Vigénere » !
Je ne pense pas avoir lu et trouvé un système « équivalent », dites-moi si j’ai loupé quelque choses dans mes lectures (passionnantes )
si cela vous tente de la « tester » et de me faire part de vos commentaires,

bonjour,
je suis cette intéressante discussion et j'en ai appris sur l'entropie...
Pour commenter ce que je cite ci-dessus je dirais que, à première vue,  cela me semble correspondre à une clé aussi longue que le clair, donc à un chiffre ne pouvant être craqué.
La particularité résiderait dans la manière de construire la clé (car on aurait tout aussi bien pu choisir un texte).
Cependant, si on part du principe, de Kerkhoffs, selon lequel la méthode ne doit pas être le secret, mais c'est bien la clé qui doit rester secrète, le déchiffrage pourrait être simplifié par la seule connaissance de la première lettre de la clé. Je dis ça sur une simple réflexion "théorique", je n'ai pas (eu) le temps de tester cette hypothèse pour l'instant, mais je pense qu'un programme de "hill climbing" devrait en venir à bout.

Hors ligne

#12 16-07-2018 08:32:22

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

gielev a écrit :

bonjour,
je suis cette intéressante discussion et j'en ai appris sur l'entropie...
Pour commenter ce que je cite ci-dessus je dirais que, à première vue,  cela me semble correspondre à une clé aussi longue que le clair, donc à un chiffre ne pouvant être craqué.
La particularité résiderait dans la manière de construire la clé (car on aurait tout aussi bien pu choisir un texte).
Cependant, si on part du principe, de Kerkhoffs, selon lequel la méthode ne doit pas être le secret, mais c'est bien la clé qui doit rester secrète, le déchiffrage pourrait être simplifié par la seule connaissance de la première lettre de la clé. Je dis ça sur une simple réflexion "théorique", je n'ai pas (eu) le temps de tester cette hypothèse pour l'instant, mais je pense qu'un programme de "hill climbing" devrait en venir à bout.

Bonjour,
Je me suis souvent posé la question si Kerkhoffs aurait ecrit les memes principes si il y a 120 ans, il avait eu 'lidée de ce que l'on pouvait faire grace à l'informatique  ??
Dans mon programme d'originne , donc pas dans l'exemple (SUR LA CORNICHE LA TERRE..) ou j'ai du simplifier le code pour vous soumettre l'exemple (pour justement qu'il n'y ai que la clé qui compte..) , pour "brouiller" les pistes, l'ordre de l'aphabet d'origine est une "fonction" de la clé..!

Hors ligne

#13 16-07-2018 12:28:11

Rossignol
Membre
Inscription : 19-06-2015
Messages : 290

Re : Longueur de clé

Bonjour,

Si j'ai bien interprété votre code, voici une version en Python :

# coding: utf-8

alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
module = len(alpha)

def C_autoclave(s, key):
    idx = 0
    IdCar = 0
    ResulText = ''
    for c in s:
        # Lgn = (InStrRev(AlphabetNew, PhC) - 1 + IdCar) Mod (DimModulo)
        Lgn = (alpha.index(c) + IdCar)%module
        # Cln = (InStrRev(AlphabetNew, Cod) - 1 + IdCar) Mod (DimModulo)
        Cln = (alpha.index(key[idx]) + IdCar)%module
        # PosCar = (Lgn + Cln) Mod (DimModulo)
        PosCar = (Lgn + Cln)%module
        # LgnCalcL = (PosCar - IdCar) Mod (DimModulo)
        LngCalcL = (PosCar - IdCar)%module
        # ResulText = ResulText + ChrW( Alphabet(  (LgnCalcL + 1) Mod (DimModulo) ) )
        ResulText += alpha[LngCalcL]
        # IdCar = (IdCar + PosCar) Mod (DimModulo)
        IdCar = (IdCar + PosCar)%module
        idx = (idx+1)%len(key)
    return ResulText

def D_autoclave(s, key):
    idx = 0
    IdCar = 0
    ResulText = ''
    for c in s:
        # Lgn = (InStrRev(AlphabetNew, PhC) - 1 + IdCar) Mod (DimModulo)
        Lgn = (alpha.index(c) + IdCar)%module
        # Cln = (InStrRev(AlphabetNew, Cod) - 1 + IdCar) Mod (DimModulo)
        Cln = (alpha.index(key[idx]) + IdCar)%module
        # PosCar = Lgn - Cln
        PosCar = Lgn - Cln
        # ClnCalcL = (PosCar - IdCar) Mod (DimModulo)
        ClnCalcL = (PosCar - IdCar)%module
        # ResulText = ResulText +  = ChrW( Alphabet(ClnCalcL))
        ResulText += alpha[ClnCalcL]
        #  IdCar = (IdCar + Lgn) Mod (DimModulo)
        IdCar = (IdCar + Lgn)%module
        idx = (idx+1)%len(key)
    return ResulText

clair = 'SURLACORNICHELATERREETAITROUGEETFERTILELESARBRESETLESSOURCES\
ABONDAIENTENCEMONDEDESOLITUDENOUSTROUVIONSALAFOISLESPACEETLASECURITEN\
OUSLAPPELAMESPAGOTZINKAYCEQUIVEUTDIRELEFORTDELAMONTAGNEDUPARADISCOUPE\
EDUMONDEDEDEUXCOTESPARUNMERVEILLEUXPAYSAGEDEROCHERSCETTECORNICHENETAI\
TACCESSIBLESANSDANGERQUAUNAIGLEOUUNCERF'

crypto = C_autoclave(clair, 'PAGOTZINKAY')
print(crypto)

# affiche :
# HBMPOFJNCUSYGBJLMDPZZGZBMRWTHKKVCTKVJNILMEINZIAMVJKJVZZIXRBEPEVGBVM\
# UTAJTRWCCPPNOQXIRILVYLISWJXGVNAQNUGKGJQXHDIZDUGLUOYDTVYKAFGIACEKGMK\
# ZKVBRIOGVACOJFMRGICKXVFLDKACHDINMYTACBRHEOVXITKXCHAUHKRXWHKGZZEKTWI\
# YBBQREQPKMZHWSETUKTKZPBDJZUNIERENLWXRCIZTHXXWVHPIIPYFFFGOLDJBOSGCUN\
# SRHSWCCKJPFWOSSGLLSHJRCNWLZTCHXPBTUSIF

txt =  D_autoclave(crypto, 'PAGOTZINKAY')
print(txt)  # affiche le texte clair

print(txt == clair)  # True

Il s'agit d'une variante d'un Vigenère autoclave sur le chiffré.
Tout se passe comme si on avait deux clés, le mot-clé et le chiffré.
La faiblesse, c'est que le chiffré, on l'a sous les yeux !
On peut se ramener un simple Vigenère.

Partons du crypto complet (pas le vôtre : votre programme a bouffé tous les caractères accentués !)

On fait :

k = 'HBMPOFJNCUSYGBJLMDPZZGZBMRWTHKKVCTKVJNILMEINZIAMVJKJVZZIXRBEPEVG\
BVMUTAJTRWCCPPNOQXIRILVYLISWJXGVNAQNUGKGJQXHDIZDUGLUOYDTVYKAFGIACEKGM\
KZKVBRIOGVACOJFMRGICKXVFLDKACHDINMYTACBRHEOVXITKXCHAUHKRXWHKGZZEKTWIY\
BBQREQPKMZHWSETUKTKZPBDJZUNIERENLWXRCIZTHXXWVHPIIPYFFFGOLDJBOSGCUNSRH\
SWCCKJPFWOSSGLLSHJRCNWLZTCHXPBTUSIF'

print(D_autoclave(k, 'A')) # pas besoin de la clé !

On obtient le crypto intermédiaire :

HUXZTBWEXIAWEROMDZEOERPIZFHTOROTDTRZWEDTRCAPQRKGXSTRCSMJRISLZJBXDYXET
HXMKRWOLSEJSLNTVDUBTNUILSZBEVGDNYOEZNBSSJTSVOVDMGVAQTCAFBSMAYUQAAVDXK
IZOSNPGUHSHVXKYATQAWODCGNIPTLKTHQBQOLYBOTHTFVRNUNPRGRBRKBEPCTDAAHMLRN
EBTUDQHSMFZAPJNSSKUMVVLCJXVORRITODCGOIVXQAPOTRTCUFGHKUONCIAOHTBKRCSGQ
LKGTMAQKNETRWITTVNSGJTOAIGBMEP

On colle ce crypto dans l'applet du site et on obtient :

L'indice de coïncidence maximum  a été trouvé pour la longueur 11, nous avons trouvé : 0.07327857327857328.
On recherche les lettres de la clé. La répartition doit respecter le plus possible la répartition théorique.
En analysant les fréquences, on trouve que la clé proposée est PAGOTZINKAY.
La solution proposée est alors :
SURLACORNICHELATERREETAITROUGEETFERTILELESARBRESETLESSOURCESABONDAIENTENCEMONDED
ESOLITUDENOUSTROUVIONSALAFOISLESPACEETLASECURITENOUSLAPPELAMESPAGOTZINKAYCEQUIVE
UTDIRELEFORTDELAMONTAGNEDUPARADISCOUPEEDUMONDEDEDEUXCOTESPARUNMERVEILLEUXPAYSAGE
DEROCHERSCETTECORNICHENETAITACCESSIBLESANSDANGERQUAUNAIGLEOUUNCERF

Il ne faut jamais faire un autoclave sur le chiffré, mais sur le clair. Voir http://www.bibmath.net/forums/viewtopic.php?id=6028

@+

Hors ligne

#14 16-07-2018 14:30:04

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

Bonjour Rossignol
Je suis "impressioné", une chose est sure, c'est que vous n'usurpez pas votre "pseudo" ..!
Mais je ne comprend pas pourquoi vous etes passé a votre chifrage "print(D_autoclave(k, 'A'))" k étant le chiffrage issu du 1er chiffrement
et votre résultat est simplement le chiffrage "vigenere" de la phrase en clair par la clé PAGOTZINKAY
votre routine "D_autoclave" que fait elle exactement ??

Pourquoi dites vous:"La faiblesse, c'est que le chiffré, on l'a sous les yeux !" ??

je ne remet pas vos capacité en doute, mais juste pour voir si votre analyse est "correcte", pouvez vous me faire la meme demonstration avec le texte chiffré suivant :(j'ai pris garde de retirer les caracteres accentués)

LDVCZAKHUPGVHRVHZEDCZFNEQNQALQFOJZPYETBRGFQCDSVIBXXTKTOAONABVZKRMPRGXDFTSKISBIDMAGAYOPCQDKXAXZLWIKFWLBIIAVYQQYHNVGGFPVNUZRZEQMMGIAINXXDZCHVJWWYVKRTEOCUDVMRTWWQRWSAEPIBGLCZMSNPULUQUMPHVZEIWWTZTASKOMBWSIHTPSXQXTSOJHERWMVGJGUEBUJKFAUNJSQEIUROXHACDJKKODJOQYWVGLDJZXCUFQDSMTOIOAAPQIOTCKOAXJZQRQFHRGDWPSYIHKAGPAFDFMMCGNZCRBRSDRHZWNVKEAFMEAKMYQOLYNWCHAXOHMQODHYDAKBNFRPEBPCMCUMOAKYNCHNWUANLSCPDQBWJXBVDUGOJQLKOGMRYXVRSHBARQWNLLB

Hors ligne

#15 16-07-2018 14:48:29

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

Re-bonjour Rossignol,
Ne perdez pas de temps, j'ai (Presque) tout compris !
a par le fait que je ne comprend pas pourquoi vous dites :"La faiblesse, c'est que le chiffré, on l'a sous les yeux !" ??

Hors ligne

#16 16-07-2018 19:00:06

Rossignol
Membre
Inscription : 19-06-2015
Messages : 290

Re : Longueur de clé

Soit $C_i$ le caractère du crypto, $P_i$ le caractère du clair (Plaintext), $K_i$ le caractère de la clé (périodique), $A_i$ le caractère de l'autoclave, tout cela pour l'indice $i$ compris entre $0$ et $n-1$ où $n$ est la longueur du message. Toutes les congruences sont modulo 26.

L'équation de chiffrement est $C_i \equiv P_i + K_i + A_i$ où la suite $(A_i)$ est définie par récurrence : $A_0 \equiv 0$ et $A_{i+1}\equiv A_i + C_i$.

La suite $(A_i)$ ne dépend que de $(C_i)$ qu'on a sous les yeux; donc on peut calculer $C_i - A_i \equiv P_i + K_i$ or $P_i + K_i$ est du Vigenère pur (il ne reste que la partie périodique $K_i$)

Si on a une fonction de déchiffrement, elle utilise l'équation de déchiffrement :
$P_i \equiv C_i - K_i - A_i$

Si on choisit la clé d'une seule lettre 'A', on aura $K_i\equiv 0$ pour tout $i$ et la fonction de déchiffrement va retourner $P^{\prime}_i \equiv C_i - 0 - A_i\equiv C_i - A_i$ et comme on a vu que $C_i - A_i \equiv P_i + K_i$ ...

Vu ?

@+

Hors ligne

#17 16-07-2018 19:31:48

Dilou
Membre
Inscription : 04-07-2018
Messages : 26

Re : Longueur de clé

Vu ...!
Merci pour votre patience..!!
@+

Hors ligne

#18 17-07-2018 19:06:24

Rossignol
Membre
Inscription : 19-06-2015
Messages : 290

Re : Longueur de clé

Bonsoir yoshi,

Le crypto que tu donnes dans cette page est décrypté par l'applet du site.
On retrouve le texte clair, par contre la clé obtenue est LBWPLGYUYJM.

Ta fonction de chiffrement (débarrassée du formatage) est

def C_Yoshi(PhraseEnClair, Cle):
    LongPhraseEnClair = len(PhraseEnClair)
    LongCle = len(Cle)
    decalage = []
    Crypt = ''
    for i in range(LongCle):    # Calcul des décalages
         decalage.append((ord(Cle[i]) - 65 - i))
    # print('decalages = ', decalage)
    for i in range(LongPhraseEnClair):
        lg = ord(PhraseEnClair[i])
        j = i%LongCle
        asc = lg - decalage[j]  # Crypto = Clair - Clé
        asc = asc - 26*(asc>90) + 26*(asc<65)
        Crypt += chr(asc)
    return Crypt

Le schéma de calcul des décalages à partir de la clé est original : on prend l'indice de la lettre dans l'alphabet moins son rang dans la clé.

Ainsi pour 'PAGOTZINKAY' les décalages sont (15, -1, 4, 11, 15, 20, 2, 6, 2, -9, 14) alors qu'avec le schéma habituel on a seulement les rangs de chaque lettre dans l'alphabet, ce qui donne (15, 0, 6, 14, 19, 25, 8, 13, 10, 0, 24)

15, 0, 6, 14, 19, 25, 8, 13, 10,  0, 24
-0 -1 -2  -3  -4  -5 -6  -7  -8  -9 -10
15,-1, 4, 11, 15, 20, 2,  6,  2, -9, 14

D'autre part, le chiffrement est de la forme $Crypto = Clair - Clé$, c'est ce qu'on appelle généralement la variante à l'allemande du chiffre de Beaufort.

Pour retrouver le mot-clé original, il faut, pour chaque lettre, inverser son indice dans l'alphabet et ajouter son rang dans la clé :

def conversion(Cle):
    alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    k = ''
    for i in range(len(Cle)):
        idx = -alpha.index(Cle[i]) + i
        k += alpha[idx%len(alpha)]
    return k
 
print(conversion('LBWPLGYUYJM')) # affiche PAGOTZINKAY

@+

Hors ligne

#19 18-07-2018 08:59:43

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 907

Re : Longueur de clé

Salut,

Je vois... Conclusion : aucune chance de tromper son monde avec du Vigenère même "amélioré" ?
Avec une clé aussi longue que le texte peut-être ?
Et encore faudrait-il qu'elle soit incohérente, non ?

Et le code de Che Guevara ?

@+


Arx Tarpeia Capitoli proxima...

En ligne

#20 18-07-2018 19:19:28

Rossignol
Membre
Inscription : 19-06-2015
Messages : 290

Re : Longueur de clé

Bonsoir,

Avec une clé aléatoire aussi longue que le texte et sous condition que la clé ne soit utilisée qu'une fois, on est dans le cas du masque jetable [One Time Pad] : le crypto est incassable.

Malheureusement, cette méthode de chiffrement est malcommode. Il ne faut surtout pas utiliser deux fois la même clé sinon c'est la catastrophe. Les Russes l'ont appris à leurs dépens (voir Projet Venona)

On peut toutefois s'approcher du masque jetable.
Sur le site de Didier Müller, dans un page consacrée aux cadrans chiffrants nerosson propose, à la fin, une telle méthode.
Elle est basée sur la variante de Rozier du chiffre de Vigenère.

Pour ceux que l'informatique n'effraie pas, voici deux fonctions en Python pour chiffrer et déchiffrer suivant la variante de Rozier :

def C_Rozier(clair, clef1, clef2):
    """ Chiffrement Vigenere variante Rozier a deux clefs
    """

    alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    idx1 = 0 # indice clef1
    idx2 = 0 # indice clef2
    clef1 = [alpha.index(x) for x in clef1]
    clef2 = [alpha.index(x) for x in clef2]
    crypto = ''
    for c in clair:
        crypto += alpha[(alpha.index(c) - clef1[idx1] + clef2[idx2])%len(alpha)]
        idx1 = (idx1 + 1)%len(clef1)
        idx2 = (idx2 + 1)%len(clef2)
    return crypto
   
def D_Rozier(crypto, clef1, clef2):
    """ Dechiffrement Vigenere variante Rozier a deux clefs
    """

    alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    idx1 = 0 # indice clef1
    idx2 = 0 # indice clef2
    clef1 = [alpha.index(x) for x in clef1]
    clef2 = [alpha.index(x) for x in clef2]
    clair = ''
    for c in crypto:
        clair += alpha[(alpha.index(c) + clef1[idx1] - clef2[idx2])%len(alpha)]
        idx1 = (idx1 + 1)%len(clef1)
        idx2 = (idx2 + 1)%len(clef2)
    return clair
 
# exemple de nerosson :
 
clair = 'ONPLACELELIVRESURLATABLE'
clef1 = 'ONCALCULRALSINTRVALLSSPA'
clef2 = 'LAVARIANTNQUSTIONUTILISD'
 
crypto = C_Rozier(clair, clef1, clef2)
print(crypto)
txt = D_Rozier(crypto, clef1, clef2)
print(txt)
print(clair == txt)

En choisissant des phrases dans des livres et en supprimant les E pour les deux clés, on obtient un chiffrement de Vigenère avec une clé presque aléatoire. On est proche du masque jetable.
Je tiens le cryptogramme donné à la fin comme pratiquement incassable.

@+

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
cinquante trois plus cinquante deux
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums