corrections

Transcription

corrections
Université d’Aix-Marseille
Cryptographie
Semestre 2
Exercices et corrections pour le TP 4
2012–2013
Cryptosystèmes classiques
Charger :
Crypto = "http://iml.univ-mrs.fr/~kohel/crypto/"
exec(open(get_remote_file(Crypto + "Crypto.sage")).read())
L’ensemble S = {A, B, . . . , Z}∗ et les textes standards en français et en anglais, encodés
dans S, se créent avec les commandes suivantes :
S = AlphabeticStrings()
fr = S.encoding(open(get_remote_file(Crypto + "pt/fr.txt")).read())
en = S.encoding(open(get_remote_file(Crypto + "pt/en.txt")).read())
1. Trouver le chiffrement de m et les textes standards français et anglais avec le chiffrement à substitution avec la clé ULOIDTGKXYCRHBPMZJQVWNFSAE. Par exemple, nous
trouvons le chiffrement du texte m comme ci-dessous :
Subs = SubstitutionCryptosystem(S)
m = S("LAMAISONBLANCHE")
K = S("ULOIDTGKXYCRHBPMZJQVWNFSAE")
E_K = Subs(K)
c = E_K(m)
Comparer les fréquences des caractères dans les textes clairs et chiffrés (en utilisant
les textes standards français et anglais pour m). D’abbord, définir des colours :
(rouge, vert, bleu) = ((0.8,0,0),(0.2,0.5,0.2),(0,0,0.8))
et faire la comparaison visuelement des fréquences des textes :
F_m = m.frequency_distribution()
F_m.plot(rgbcolor = bleu).show()
F_c = c.frequency_distribution()
F_c.plot(rgbcolor = rouge).show()
Quelles proprietés restent inchangées par un chiffrement à substitution ?
2. Trouver le chiffrement du texte standard français avec un chiffrement par transposition avec la clé [3,5,2,6,1,4]. Le chiffrement par transposition se crée en Sage
avec les commandes suivantes :
Trans = TranspositionCryptosystem(S,6)
K = Trans.key_space()([3,5,2,6,1,4])
E_K = Trans(K)
Quelles proprietés restent inchangées par un chiffrement par transposition ?
3. Trouver le chiffrement des textes standards avec un chiffrement de Vigenère avec la
clé SECURITE. Le chiffrement par transpostiion se crée en Sage avec les commandes
suivantes :
Vigen = VigenereCryptosystem(S,8)
K = S("SECURITE")
E_K = Vigen(K)
Qu’est-ce se passe au fréquences des caractères dans un texte chiffré avec un chiffrement de Vigenère ?
Cryptanalyse des textes chiffrés
Pour les exercices ci-dessous, nous prendrons les textes chiffrés suivants :
ct1 = S(open(get_remote_file(Crypto + "ct/ct1.txt")).read())
ct2 = S(open(get_remote_file(Crypto + "ct/ct2.txt")).read())
ct3 = S(open(get_remote_file(Crypto + "ct/ct3.txt")).read())
Les graphes des fréquences des lettres peut distinguer les textes chiffrés par chiffrement
de Vigenère, à substitution et par transposition, en comparaisant avec les fréquences des
textes standards avec ceux des textes chiffrés :
en.frequency_distribution().plot(rgbcolor=rouge)
fr.frequency_distribution().plot(rgbcolor=bleu)
ct1.frequency_distribution().plot(rgbcolor=vert)
ct2.frequency_distribution().plot(rgbcolor=vert)
ct3.frequency_distribution().plot(rgbcolor=vert)
Solution. Voir les fréquences des textes standards ci-dessus, pour comparer avec les fréquences des textes chiffrés :
0.06
0.05
0.04
0.03
0.02
0.01
5
10
15
20
25
0.15
0.1
0.05
5
10
15
20
25
5
10
15
20
25
0.15
0.1
0.05
4. Identifier les textes chiffrés par un chiffrement de Vigenère, à substitution et par
transposition. Quelles proprietés restent inchangées par un chiffrement à substitution ? Et par un chiffrement par transposition ?
Solution. Les fréquences sont typique d’un chiffrement de Vigenère, à substitution,
et par transposition, respectivement.
5. L’indice de coïncidence est la probabilité de répetition de lettres choisis au hasard
dans un texte. Montrer que, pour un texte aléatoire de longuere n, avec distribution
uniforme des caractères {A, B, . . . , Z}, l’indice de coïncidence est 1/26 = 0,03846 . . . .
ct1.coincidence_index()
ct2.coincidence_index()
ct3.coincidence_index()
Quels chifferements sont compatibles avec ses indices de coïncidence ? Est-ce c’est
plus probable que leurs textes clairs sont anglais ou français ?
Solution. Les indices de coïncidence sont respectivement :
0.0402696536223284
0.0759274826163665
0.0759190704411202
qui sont cohérent avec l’hypothèse d’un chiffrement de Vigenère, suivi par des chiffrements à substitution et par transposition (qui sont indiscernables du texte clair
par leurs indices de coïndences).
Cryptanalyse des chiffrements de Vigenère
Supposons que ct = c0 c1 . . . est un texte chiffré par un chiffrement de Vigènere. Pour
chaque 0 ≤ i < r, on peut calculer les décimations
ci ci+r ci+2r . . .
avec la syntaxe ct[i : :r] en Python/Sage. Alors l’indice de coïncidence moyenne de
tous les décimations se trouve facilement :
ct = ct1
for r in range(1,20):
print "%2s: %s"%(r, sum([ ct[0::r].coincidence_index() ])/r)
Pour la bonne période r, l’indice de coïncidence sera la valeur du texte clair.
6. Trouver la période pour le texte chiffré par un chiffrement de Vigenère.
Indication.
AZ = S.gens() # l’alphabet {A,B,..,Z}
ct1[0::13].frequency_distribution().plot(labels=AZ)
Solution. Les indices de coïncidences sont :
..
.
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
0.0401730781990439
0.0402389947320170
0.0403206031474393
0.0402195108311553
0.0402466694421316
0.0759989045710829
0.0402557944259612
0.0402278695024143
0.0401440658500127
0.0402066243021489
0.0402073662094264
0.0401614960921800
et pour la période probable, r = 13, il atteint un valeur typique pour le français.
Cryptanalyse des chiffrements par transpositions
Supposons que ct = c0 c1 . . . est un texte chiffré par un chiffrement par transposition.
Pour I = (i, j), nous formons la suite de couples de lettres
ci cj , ci+r cj+r , ci+2r cj+2r , . . .
avec la fonction decimation(ct,[i,j],2). Les positions (i, j) tel que ci+rk cj+rk semble
suivre les probabilités d’un texte clair peut être trouver avec une analyse de la correlation :
ct = ct3
F2 = fr.frequency_distribution(2)
i = 0
for r in range(2,20):
max_corr = -1
for j in range(r):
ct_ij = decimation(ct,[i,j],r)
F2_ij = frequency_distribution(ct_ij)
X2_ij = DiscreteRandomVariable(F2, F2_ij.function())
max_corr = max(max_corr, F2.correlation(X2_ij))
print "%2s: %s" % (r, max_corr)
Alors avec la bonne période les positions (i, j) tel que ci+rk cj+rk semble suivre les probabilités d’un texte clair peut être trouver avec une analyse des correlations :
for i in range(r):
for j in range(r):
ct_ij = decimation(ct,[i,j],r)
F2_ij = frequency_distribution(ct_ij)
X2_ij = DiscreteRandomVariable(F2, F2_ij.function())
corr = F2.correlation(X2_ij)
if corr > 0.65:
print "(%2s, %2s): %s" % (i,j,F2.correlation(X2_ij))
7. Trouver la période pour le texte chiffré par un chiffrement par transposition.
Solution. La correlation maximum des c1j avec le texte standard français atteint
0.9758 pour r = 13 :
2: 0.733463075089963
3: 0.705507948803534
4: 0.733943859623517
5: 0.754509984845739
6: 0.678409995416661
7: 0.762542379298266
8: 0.732512233714092
9: 0.671295899122123
10: 0.735364273903129
Alors la période est 13.
11:
12:
13:
14:
15:
16:
17:
18:
19:
0.723405371951133
0.675651471693057
0.975804376856512
0.693742563655006
0.654419908176978
0.706808580139146
0.746768729693388
0.645641011773908
0.688626548982101
8. Pour le chiffrement par transposition, trouver la suite des indices (i, j) qui étaient
adjacents dans le texte clair.
Solution. Les résultats de la recherche de couples (i, j) tel que {ci+kr cj+kr } a une
correlation élevé avec les digrammes du texte français sont :
( 0, 1): 0.975804376856512
( 1, 5): 0.944930811297243
( 2, 8): 0.949279198494620
( 3, 2): 0.971386725839731
( 4, 6): 0.972060598958292
( 5, 12): 0.914040390253914
( 6, 3): 0.960808730189264
( 7, 4): 0.957041174359527
( 8, 9): 0.964384895746858
(10, 7): 0.969217182879885
(11, 0): 0.959563265908409
(12, 10): 0.967439414332218
qui correspondent à des indices adjacents dans le texte clair. Alors nous trouvons que
les indices apparaissent probablement ou dans l’order [11, 0, 1, 5, 12, 10, 7, 4, 6, 3, 2, 8, 9]
ou l’envers.
Si nous essayons ce chiffrement par transposition (en ajoutant 1 pour avoir des
indices dans {1, . . . , 13} au lieu de {0, . . . , 12}) :
Trans = TranspositionCryptosystem(S,13)
E_K = Trans([ i+1 for i in [11,0,1,5,12,10,7,4,6,3,2,8,9] ])
E_K(ct3)[:64]
Nous trouvons que le texte clair est :
CHAPITREIMARSEILLELARRIVEELEFEVRIERLAVIGIEDENOTREDAMEDELAGARDESI.
Cryptanalyse des chiffrements à substitution
Construire le chiffrement à substitution avec une clé K, qui doit être une suite des 26
lettres A,B,. . .,Z :
Subst = SubstitutionCryptosystem(S)
E_K = Subst(S("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
on peut trouver la correlation avec les fréquences des lettres avec les commandes suivants :
F1_fr = fr.frequency_distribution()
pt = E_K(ct)
F1_pt = pt.frequency_distribution()
X1_ct = DiscreteRandomVariable(F1_fr, F1_pt.function())
F1_fr.correlation(X1_ct)
Il faut changer la clé ABCDEFGHIJKLMNOPQRSTUVWXYZ, qui répresente l’identité :
A 7→ A, B 7→ B, . . . Z 7→ Z,
pour les approximations successives à la bonne clé.
9. Pour un de ces textes chiffrés, identifier le chiffrement utilisé et touver la clé (et
donc le texte clair). Combien de clés possibles existent pour chaque cryptosystème
(avec les périodes utilisés) ?
Solution.
Vigenère : Nous avons déjà trouvé la période 13. Il nous reste de trouver le décalage,
pour chaque 1 ≤ i ≤ 13, en regardant le lettre plus fréquent dans le decimation
ci ci+13 ci+26 . . . .
Le nombre de clés : 2613 = 2481152873203736576, soit 13 log2 (26) = 61.105 bits.
Transposition : Nous avons reussi à trouver le déchiffrement du troisiéme texte
chiffré au-dessus.
Le nombre de clés : 13! = 6227020800, soit log2 (13!) = 32.536 bits.
Substitution : Les fréquences des lettres du texte chiffré suivent celles de français.
Pour le texte standard français, l’ordre des lettres sont
K = EAINTRSUOLDMCPVQBGHJFZXYWK
(du plus fréquent au moins fréquent), contre L = OCJNAUDLYSGXPBQKMIFRWZTVHE
pour le texte chiffré c = ct2 . Alors nous prenons EK (DL (c)) pour trouvé un texte
avec les bonnes fréquences des lettres.
E_K = Subst(S("EAINTRSUOLDMCPVQBGHJFZXYWK"))
E_L = Subst(S("OCJNAUDLYSGXPBQKMIFRWZTVHE"))
D_L = E_L.inverse()
AZ = mul(S.gens()); AZ
E_K(D_L(AZ)) # la cle pour E_K*D_L:
E_K(D_L(ct2))[:64]
et la bonne clé se trouve avec la permutation de G et H :
D = Subst(S("TPASKGDWHIQUBNECVJLXRYFMOZ"))
fr == D(ct2)
Pour un texte moins long, il faut utiliser les fréquences des digrammes !
Le nombre de clés : 26! = 403291461126605635584000000, soit 88.382 bits.
Remarque. Pour un cryptosystème symétrique moderne, les nombres de bits d’une
clé est typiquement entre 128 et 256, selon les besoins de sécurité.