Cryptographie et Protocoles Sécurisés
Cryptographie et Protocoles Sécurisés
Yohan Boichut
Version 2.0
Who am i
Yohan Boichut
[twitter] @YohanBoichut
[github] yohanboichut
[youtube] [Link]
Enseignant chercheur
Organisation
• 15h de CM — Y. BOICHUT
• 8h de TP — M. CHAPELLE et M. DUMAS
• 1 CC sur feuille
• 1 CT sur feuille
Supports de cours
• Celene : [Link]
◦ Sujets de TD
Le cours
• Pourquoi la cryptographie ?
• Ere pré-Informatique
• Ere informatique
1
Chapter 1. Une évolution au fil de l’Histoire
1.1. Sources et références
• L’histoire des codes secrets, S. Sigh
• Wikipédia
• [Link]
• Comment faire ?
▪ ils s’isolent
▪ ils doivent transmettre un message que personne ne pourra lire sauf le destinataire
◦ steganos : étanche
◦ graphein : écriture
• -480 : Démarate (sparte) prévient son pays du projet d’invasion de Xerxès (perse) à l’aide de
tablettes de cire
2
(...)
Quand je jure à vos pieds un éternel hommage
Voulez-vous qu'inconscient je change de langage
Vous avez su captiver les sentiments d'un coeur
Que pour adorer forma le Créateur.
Je vous aime et ma plume en délire.
Couche sur le papier ce que je n'ose dire.
Avec soin, de mes lignes, lisez les premiers mots
Vous saurez quel remède apporter à mes maux.
(...)
A. De Musset
(...)
Cette indigne faveur que votre esprit réclame
Nuit à mes sentiments et répugne à mon âme
(...)
3
G. Sand
1.7. Un code
• Un code est une table de correspondance entre texte clair et texte codé
• Code particulier
• Sources : [Link]
4
• Pas de problème d’entrée manquante
• Expérience : [Link]
5
1.12. Chiffre
Un algorithme de chiffrement permet de transmettre n’importe quel message (historiquement des
textes, de nos jours bits, donc textes, images, binaires, …)
• C=E(K,M)
• M = D(K,C)
◦ Kruptos : caché
◦ graphein : écriture
◦ 1918 : Enigma
6
• Utilisé par César pour ses correspondances secrètes
• Mise en pratique
Décodez :
LO Q'B D SDV D GLUH... RQ VDYDLW FKLIIUHU GDQV O'DQWLTXLWH...
1.18. Cryptanalyse
• Fréquence des lettres selon la langue utilisée :
◦ Français : E, A, S, I, N, …
7
◦ Anglais : E, T, A, O, N, I, S, …
• Indice de coïncidence
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def formatMessage(m):
return unidecode(m).upper()
def ic (m):
# transforme les caractères accentués en leur version
# non accentuée
m=formatMessage(m)
# calcule le nombre d'occurences de chaque lettre dans m
# sous forme de dictionnaire
freq = calculFreq(m)
somme=0
n =0
for x in ALPHABET:
somme += freq[x]*(freq[x]-1)
n+=freq[x]
return somme/(n*(n-1))
En français, IC : 0.0746
• Plus le texte à analyser est grand, plus facile finalement est le déchiffrement
8
QHT UTVEXU LHR-NTNT
YHE TUUHOT KSG LS USEHGT RUPXUUHT JT PTEET YXGPT, CS EDTXGRT KTGNTEESRE JT JTPGRGT
EGTC PXGGTPETNTUE LTC
NXHFTNTUEC ETGGTCEGTC TE PTLTCETC.
freq: {'A': 6, 'B': 4, 'C': 62, 'D': 3, 'E': 90, 'F': 18, 'G': 55, 'H': 34, 'I': 9,
'J': 39, 'K': 22,
'L': 56, 'M': 2, 'N': 22, 'O': 1, 'P': 29, 'Q': 9, 'R': 56, 'S': 66, 'T': 180,
'U': 71, 'V': 4,
'W': 0, 'X': 45, 'Y': 14, 'Z': 0}
◦ Substitution mono-alphabétique ?
• Description :
◦ Chiffrement d’un message avec plusieurs configurations successives données dans le chiffre
9
1.23. Le chiffre de Vigenère
• Au fait, pourquoi un chiffre poly-alphabétique ?
10
1.26. Et pour déchiffrer on fait comment ?
• Exactement le même algorithme
def calculCleDecodage(cle):
return "".join([tochar((26-toint(x))%26) for x in cle])
VHRAA VHEDUAQHL. C'RBB KCET PE PSFE GAQJHO DQ PHBLEE ZCV AKRUE VHNAEC XFIBRMIW
SMRR YIIAS NAUV GB EYUM RJKIF CRBGU PNB RZQODIWVFE QN KYWPFDEPSGT. ZJTYSERQUVSFEAC
XFIB EXLH, WGTRAVVH X'EJIVHTIG YIJ SXCARH (CN AYXZJ GYUE UQS YOEVM USQRMDHS),
WOAL K'VHKIF PDG LIZYTV RO SQ THBBR VWNFFWE. O'EWOBT YJ XVBCEQ DX XHUE. H. JFWMHGT
◦ toutes les lettres d’un même paquet ont subi le même décallage
• l'IC d’un texte français chiffré par un chiffrement mono-alphabétique est d’environ 0,0746
11
1.30. Attaque de Vigenère suite et fin
• Oui il suffit d’itérerer en commençant par une taille de clé de 0, puis 1, …
• A chaque taille de clé, on crée autant de blocs de textes comme précédemment cité
• si l’IC est proche de 0,O746 alors la taille de clé est alors la bonne
PPA HESWHUUAXQG QI MMLH IEKTVN VF RR WZV HLVW ZYHNU DWIEW, TW GSEGK TAZFFR VFAKE
WELPSY SAFTSG, AGNU JBJAIWE.
WYW DWFT MI KLZUCFOG HP TS SZRMOLSV PS CPFAAEVVL QVUVGFF LTALOSMJBLS.
MMGVPJ JGRHSO H KEJ OOEENBWRJWMPXUVE DESNPW DF FHYPS JBOFWVG, DE 10F GAHTPZAB QY XWFDF
H'XJOETE SG HZCTLF
GAHTPZAB Q'YCAK : IM THZZEUQ ZR QPUW TZTX KL TROHVUFMK, A ME FLTE YMPVPPBW DF JBU KE
GMFGMP, ML MFX XU VELHFR PFQ SUTWB
BUE MQFFMZV HASXBJBLZQFR HP TS DFJXUZE JUQVPTMFNF. IM, JVMDQ JNWTTQ BPVZVC, BFDWF
WAIKSLC T LB LLU OHWDQ MNF VXUJOEFFR
GPTWBSI TCLC LZ OZICQUAJR, UVIBP RWFGSMJ, QVM T LB LZQI RR 1972 PB S EUI JBHLZRWRI OM
<< EAUGA KB SZQQYI >> PVLRF P'NYZS
VF ZRW PBSTT-YGPZ. LFDGDYP JGRJW LWHSJWW CICL XADI T MPSTTSE, MW AW CPQIVYTV MZBVD
KGMNI EL WEIECARLOW FJGMPM
VREWYC MWJGPZ : BS ZE JQ XBMYB SU QYUSPC GAIE EAXDAVHBY SUZ MIFWT KWLVM JBP VZQBG HP
TW VBMGJYE31.
UMBF PL XJEGEVL KU IAANR ZZAGJRTS, S'ALFSHV, HIDTFV MLCIJ, MANXPCJ FFVN K'LCYQQF,
MYLAQVI L'LARV UBFTTZW EHEELTEEF
DBYC AGN HVTUK MRUHEI QQUTJJ OHZICK PBVRWNDV KKHUD DMWGVP IFAUSEP RAIBCI (TWCKIFYKZ
MOZE QUEXXAOO HN TVNUQ RR 1975
E 1998). LVSTPPB RHRGAJ N YY ALYMI WL QEL CIV E AC WTSI WLJRZF QBQXM MNF SYMLNJUJR
GLTEE, MIGAL, SRZG NXEIIUFW OPCEJ,
YOVW TUHLBGTISE VF FRROIFT UVXZ KIWRWPMWM MNF GHUARV-MHGEBCW : IM W'TNPT UQ Z'<< RGZTW
SPZBLAIHGS >> EIOWMTFI IHY LV
BSEWZVFAHI IYPNTUDNP OM DA TIKPL BVFV UECUGN.
FRYPU, L'YQFBMYM VE ME LLYIV QGG YYM HESWHUUE UQ BNXTWFAMMML HMVDWPETVW QVM WLMIV XO
FYAZWMBXBL LCYUEHIPVFE SYLZL
D'RBFRW-RCWRSI, VL XUZ BSHX PDGQVIK IVBSK TVWNPWR BJYYVNKMBG FZZAS TTTZZKP. XS ZEEKZ
QVM VSVT CM GRVTM XESEBA HLFDG
RGSW SU << NEMJO DL EWRGWM >> IUJ SIWVSR XSF HPCP JPYXBYS GAIE PP BATSI WL JHRYDVSY LM
MPRWL K'ETTSPW PV 1972, MN NEMJO
GRSBR TLZ TOCFR MPSYQF, DYT, BGUU GHTTE C'TSESTVW DF PT ZLRZQ PEMDM SIOWB S'OEXQABRTM
KOWMXAPQLQ GHV WI VITGBWSIEQ.
ANMD TWS TMFPSIKGRRW PVLRF P'ALYOZZS QI WI KESMX LA BFNPL JTAUHFV GL Z'AIDSGIYB HAT
PT. AVUK P'OOSCL DA QIKPVDV OCHZPZLE
QEK SH SVDWR, HP 1958 I 1968, UOSVXZWOEP O PIWTW DF P'TWVGVQ RR PL KSRSMXYL DL NCOFJ
NASDLXY. IOSNM SMDKZES IMHPT
12
VSOYIXMFT VR CVBELD HEID XJEDSVL, AOLF QBQXM TEUL AHYMFZ. SG MW INAJX XNHLVYSAX, NWEMF
IESL, DVE RVJQQUUMXXZ KAEE GRW
TVLESEVAPOEE GBGTIDET. GHTTE VXZR, MW TASBMM SLS IQJHID AMR MIL LJHVOG, RX NWEMF IESL,
IC M OCTCQK A QEKSLR CQ FHWDM.
AL EILPYAZF SA IQNWT QSNCVII XWEI WMK RFZNLZ RLEGRW, NWFSJHXYLEJ OCZQP TWS NIBSSELDSF
WZCJCFW W'PUFFDANXTWF SVV ELZ
ETTSPW. MWTBZ JBZJHVD OIETB WGBPXTLNK XS ZIXM LYQI WL QEL CIR P'SMJOJRX KL LR ESEMP
JWTI LTYTOE : UZ RXLQL TSIL HNRVEGVJ
PB HATWTPA RRBWQIXMFT B P'TAAAHGS PSYBJE TIL HKVVDGNMCMK. PBV VVUTIQ, WY R'PBSIU TTZ
KEGQBQEYB S DFW FLKITMARREA
UONQX ILTY TOEQZV. D'AVXXBY DL XWIVP LGNU ILA AIIQ ZN QTVA-SFVBL, DACFSE XPDAS, T'ILA
PNJBWEI OM KA QVHWYE VJDRVTMFCF
GHUJEIZOAX NML ATTXJA DV ECA LPZGIOI : AVZPZFOYMDM HOVV NU JOVGF ELFUSTJWFHS, IC M
FRGF LW TSIL MVRKQG QI OWKET HX
TLDZOOZIYBK EU ME LZT UQJRRF LWPFRWHUT. LZS NYEZW DJJYLYEEOS RWE YME CSUIF FZEQUIC V'S
PBW XAL DRZG HR
ZZHHFPBUHT. GMF PSYBJE, JP OLJUK POAW FV WNWMKVUNVYSAX QIEIMMTS KIWRWPMWM, KOO TXYL
EKMBG EMAWNU IM ZH MVDS RXLVL UOI
YLTMV OCZTWMPE, DI JBP NFGFEME AS VPPHUAE UQ G'RZLLWR HVTJL ALJ SPLPKK, QV'ME KLCFGJEI
L T'SGF HX 6 HUS.
UQIK RZUK DF NHBLUJQG ZSTVK CPRGBLS HGW BRE XM SFVOPY D'ZZGCMCILIPR TB WEIECARLOW DF
FXAO DRZG YI CWEAO SGA LTV
BFBTZAWS : MMLH SAEQ, QUEXXAOORX KLS VFOGW-FVAS BY WLIUK PSF EYVWET 1960 UNP MIK XO
HRP LW SQSKAZ ICXIFXCILEE IG 1961,
LA DZMBN PLVFI, VRX QVUVGGR EXMJIDEBUL NVQ SA 1955 UFQ DUUXT JVNKDS FE EWPIDSFHUIV QH
SME VMLMI VVUTIQ ZN GSIEPJSGUL DL
YCAHP AGVJIMPXUV ZCAE RIHRJRWHJHMUZV E W'WDYNTBHKE U'QQUINA VE 1982, BY FVTEEF CH
P'LCLEVV XJYIMMWG WZV DIWVX.
PS Y R QUNPPUWNU HXZ YEJESZFWIFCFW TCLC AGRVX AWDGBV. VLATV PSERTMJE B IOVSUV POAW FV
MNJZXYZ EEOCEI ATMS NELJBLZZ
EHI OIFS ME LLYIV, XSF LZUEET HHBAAEF RR WL ZWEMPX JHPROWGI L RGUFV T BU HRGH AMGMSU.
OSMHTMVZH, YI RZSNE QTPARV
DIFWP OSRSC DHZPRDCI, P'FV VET QXPSLVGFF NZCWUSW WL AOLE ZRW EMEPT, EOHPT VEHVQP YM'IM
IMHPT << ZYDBWDQTLF >> UN'PS SFUH
OEEBM PBV CBKIK BCYKLZ. KEMSG JLTKQ RRVYQWRF, KTYYY BMGCECWN A EIVSHRV CIR << PPA
XENQXZ UE JABG TLA UAQEUSLS UQ URVPZ
UE UCIL KE GDSFWTWF >>. MBML, AVUK OCZQP T'ZESSBUL DV XO FICQW BFXA OHRDAB, WYOQL
PPPZHY A TABAY FVW ATGXUZIFZ PEMWTSNUI,
VBTUCMBG PPA KUDGXZ, LT R RWAM AIJ BBXMYL LV VCHIFZ JUTWX. ZLLFZ XRRYQXES WAHOAUQ,
QUEXXAOORX HTEIUQNMYM, BUEMM WVLXMF
NZLQL CPQFL IEKT VNVXWF UO WMFSE UQ XRY EZWS BKKLZSZR. QRTPVVAOX, NUL DZRTRVPVUE
OSMHILV QGG UFM BUEMM WVLXMF N GZUEEOGX
H HPGDSAHCM S JPYXY H PRDHVV OM 3 SNT, IM XBE JAB CICM DA QVHNYADYOVX AWMR EIOLUII GBR
GSIEPJSGUL. BVFV UECUGN, FPEL,
JODYSAGP LSNT PT ZLRZQ O WSFMJ AVB TSLNKAIEW OM VIY EGZ, LT UQQBYGZW LFW XJOETE DNV
SIKASH. NUL ALFFR HTNXESIGJL EJF
EHI UCVIU THSNAI ZS PSYAGMNEBA WAJ PS FXFXWFJEGAZ.
CVOW RWE CF MFWLHNE R PSFXTVSTJSG KLS GXIF GZCJAHINE. ZAMQN ISFA IUF PT ZAEXMBB HLVK
13
LFW BTHGVE B'RWE XSS
RY'NU LNJQWTRPUWNU MVP ? JECM ARVTBWRBMM KL PREGRV DWMS ME EVBPV CIRPBCWS JQTNLS
EAB ? L. FZQUHVX
• Avec ces données : Trouver la clé qui a été utilisée pour chiffrer ce message
14
Chapter 2. Aire pré-numérique — Enigma
2.1. Contexte
• 1918 : Arthur Scherbius à la quête d’innovations techniques - naissance d’Enigma
2.2. Sa composition
• Un clavier
• Un tableau de fiches
• 3 rotors
• Un réflecteur
• Disposition de 6 fiches
• Impact d’un point de vue combinatoires ? 100 391 791 500 possibilités d’agencements
2.5. Et voilà
• Techniquement parlant, c’est tout
• Donc les plus grands cerveaux de l’époque se sont arrachés les cheveux sur un chiffrement
mono-alphabétique ??
15
2.6. Réel fonctionnement des rotors
• Le rotor crée une nouvelle substitution à chaque frappe de caractères… en tournant d’un cran
• Rotor qui change de position une fois que le premier rotor a fait un tour complet
• Rotor qui change de position une fois que le deuxième rotor a fait un tour complet
16
2.10. Et le réflecteur
• est situé à la sortie du 3e rotor
• A un câblage qui fait que la lettre originale est liée électriquement à la lettre finale et
réciproquement
2.11. Enigma
• C’est une machine à chiffrement symétrique
◦ Les 6 fiches
15
• Il y a donc environ 10 agencements possibles pour Enigma
17
2.14. Du point de vue des alliés
• Soit on récupère une table par mois et on est content
• Soit il faut trouver parmi les milliards de configurations, la configuration qui va bien pour
déchiffrer le message
◦ Fiches
2.16. Rejewski
AFWA, BQZKVELRIB,CHGOYPDC,JMXSTNUJ
2.17. Rejewski
• Même procédé pour les 2e/5e caractères et 3e/6e caractères
• Empreinte digitale
15
• On passe de 10 à 105546 configurations (17576*6)
18
2.18. Rejewski
• 6 bombes de Rejewski
• Temps de calcul : 2 à 3h
2.19. Turing
• Les anglais prennent le relai : Alan Turing
2.20. Turing
3 machines
19
2.21. Turing
• Là encore les fiches n’interviennent pas dans ces cycles
#!/usr/bin/env pypy
## Python 2 Enigma I simulator
## N. Ollinger 2016
rotors = {
"I": ("EKMFLGDQVZNTOWYHXUSPAIBRCJ","Q"),
"II": ("AJDKSIRUXBLHWTMCQGZNPYFVOE","E"),
"III": ("BDFHJLCPRTXVZNYEIWGAKMUSQO","V"),
"IV" : ("ESOVPZJAYQUIRHXLNFTGKDCMWB","J"),
"V" : ("VZBRGITYUPSDNHLXAWMJQOFECK","Z")
}
reflectors = {
"B": "YRUHQSLDPXNGOKMIEBFZCWVJAT",
"C": "FVPJIAOYEDRZXWGCTKUQSBNMHL"
}
def rotor(s,i):
r=rotors[s]
o=map(toint,r[0])
l=range(26)
for j in range(26):
l[j]=(o[(j-i+1)%26]+i-1)%26
l[toint(r[1])]=l[toint(r[1])]-26
return l
def reflector(s):
return map(toint,reflectors[s])
def plugboard(p):
l=range(26)
if p:
for (a,b) in map(lambda x: map(toint,x), [Link]().split("-")):
l[a]=b
20
l[b]=a
return l
def inv(l):
r=range(26)
for i in range(26):
r[l[i%26]]=i
return r
def setintern(s):
global rot,tor,ref,prot,plug
try:
l=[Link]().split(" ")
a=l[0]
b=l[1]
if len(l)>2:
c=l[2]
else:
c=None
x=[Link]().split("-")
y=map(int,[Link]().split("-"))
rot=[rotor(x[i+1],y[i]) for i in range(3)]
ref=reflector(x[0])
tor=map(inv,rot)
prot=[0,0,0]
plug=plugboard(c)
except:
print "invalid format (see /? pouet)"
def setextern(s):
global prot
try:
prot[0]=toint(s[0])
prot[1]=toint(s[1])
prot[2]=toint(s[2])
except:
print "invalid format (see /?)"
def step():
if rot[1][prot[1]]<0:
prot[0]=(prot[0]+1)%26
prot[1]=(prot[1]+1)%26
prot[2]=(prot[2]+1)%26
elif rot[2][prot[2]]<0:
prot[1]=(prot[1]+1)%26
prot[2]=(prot[2]+1)%26
else:
prot[2]=(prot[2]+1)%26
21
def key(c):
step()
return toletter(plug[gmi(2,gmi(1,gmi(0,ref[img(0,img(1,img(2,plug[toint(c)])))]))
)])
def encode(s):
return ''.join(map(key,s))
setintern("B-I-II-III 01-01-01")
setextern("AAA")
if __name__ == '__main__':
try:
while True:
s=raw_input()
if len(s)>0 and s[0]=='/':
if s[1]=='i':
setintern(s[2:].strip())
elif s[1]=='e':
setextern(s[2:].strip())
elif s[1]=='r':
print ''.join(map(toletter,prot))
else:
print """??? unknown command
/i set internal state (/i B-I-II-III 10-14-21 AP-BR-CM-FZ-GJ-IL-NT-OV-QS-WX)
/e set external state (/e VQQ)
/r print external state
HABHVHLYDFNADZY encode message"""
else:
print(encode(nettoie([Link]('utf-8'))))
except EOFError:
pass
2.23. Echauffement
• La table du mois d’octobre vue précédemment a été utilisée pour chiffrer le message ci-dessous.
PQVBZTQHESPJUEOTCTMAAZCKPNZLLWXJGNCWVLDLZDDSCAMUUTYEJNCJEOFCBWSRPMAUNAXKZCH
WAIKAKMFXMNLEWBPROBTOYUGXXFGMXOOKYVXVTGXJADVILLZXYZNBPTPPCJAXJOEJAYXFXVVFEK
WOLRQPBOUMXGFGMKWWGXLCIITRNFGTWVAIFCLLIFYJRZQLUEDUOJFGMOOSRBROXWSZYVXDDLOJP
22
BCUXJXPZXNKQVEHNSOBCMADCLJHBNQRSLQMGOKFEEITXJLCJHHEZJSOMDEAYZRXERLWTDMUWJSC
ABKVJSBOKYNGEWFPZWOPLFAXWOYBEWPSDYTWZDWHMHHGTDSSVPOKZUVMREYHKUIIKTXVRFRXFSP
VUFZUJXPQTSBTFIHJVOQOKUQKYOZCNKWLJNNADHETMKQXHTXWDEYTRRBUYEHEAFLCAPEEGDFOWQ
SGTJETICXIZDJFTJNLIPNRDKSDWGRTTGVOZOPFDDCFRPAENQNDYCJMRUSKWVWGCOLUIQTNCWQWD
ARYXSXCTGTQVKSEOHCNFRSVGPJPCZNFSQJFLFZQOREPBFOQUZPHTZSVNFPYAUHVXIUSWWLRKNIX
FBSZBLPOKLQXQPGFVCHHBBWMSYNOJCIQIPDLSQFNVGZOQRESUENFUKFTBMPZESVZWFYKORPFLGK
RSOZEPTDREBZGDAWIEKMXNDXPPLYILVNXRMDHCDGQUKJFJMVKDTYPHONQCQJTEKDBISKJDATWZV
BEDOYFGRCJDTSPBUNYKCACZHAFKPQZLTODIGEOSKPNVMEXEZHQKPSMVCZCJHGGOZTHSNMUGEBAB
BCOYFMYXNFPVEYKVGIBLULXDZQPAQUFCQBBHWOFPOCJOKYWZCLNXLXNAOQMUBROFTNGLHTHOKZN
SUHBSZ
23
Chapter 3. Secret parfait
3.1. Cryptographie classique
• Historiquement la cryptographie repose sur un secret partagé i.e. une clé
• Principe de Kerckhoffs : un système cryptographique doit pouvoir tomber entre les mains de
l’ennemi : la sécurité doit uniquement reposer sur la clé
• un chiffrement à flux : chaque bit du message est combiné avec un bit de la clé. Un flux
chiffrant aléatoire est généré à partir de la clé secrète et utilisé pour masquer le message
original
• on xore le message chiffré et la clé pour récupérer le texte clair i.e. m = c xor k =k xor m xor k
• Le chiffrement par substitution ne peut pas être candidat au chiffrement parfait i.e. corrélation
statistique entre le message clair et le message chiffré
• Vigenère ne peut pas l’être non plus dans sa définition générale i.e. clé répétée
• Qu’en est-il d’un vigenère avec clé aléatoire aussi longue que le message à chiffrer ?
24
• Confusion : utiliser la clé pour camoufler le message clair
• Effet d’avalanche : modifier un bit en entrée peut modifier tous les bits de la sortie
def generer_blocs(s,iv,n):
st=Init(s,iv)
blocs=[]
for i in range(0,n):
(y,st)=GetBits(st)
blocs = blocs + [y]
return blocs
3.10. Protocole
def send(s,m):
iv = genIV()
blocs = generer_blocs(s,iv,len(m))
for i range(0,len(m)):
c[i]=m[i]^blocs[i]
25
return iv+c
def receive(s,iv.c):
blocs = generer_blocs(s,iv,len(m))
for i range(0,len(m)):
m[i]=c[i]^blocs[i]
return m
• si un attaquant connait tout ou partie de la suite de bits générés par GetBits, il est difficile de
retrouver la clé utilisée (ou la paire (s,iv))
3.12. RC4
• Inventé en 1987 par Ron Rivest
def rc4_init(k):
for i in range(0,256):
S[i]=i
n = len(k)
j=0
for i in range(0,256):
j=(j+S[i] + k[i%n])%256
swap(S,i,j)
return (S,0,0)
def rc4_getbits(st):
(S,i,j)=st
i = (i+1)%256
j = (S[i]+j)%256
swap(S,i,j)
26
t= (S[i]+S[j])%256
return ((S,i,j),S[t])
• Un message à chiffrer doit d’abord être converti en octal puis chaque entier sera xoré avec les
mots générés par rc4_getbits à la demande
• La conversion octale est donnée ci-dessous (la lettre B est codée par 0,1)
3.16. Application
• Le message suivant a été chiffré avec la clé K=[1,6,6,4]
• Déchiffrez le :
0, 7, 1, 7, 2, 2, 3, 5, 4, 7, 7, 4, 5, 4, 5, 1, 7, 2, 5,
6, 6, 3, 2, 5, 5, 7, 6, 1, 1, 2, 7, 1, 5, 5, 0, 4, 4, 7,
6, 2, 4, 2, 0, 3, 1, 3, 1, 0, 4, 3, 1, 7, 1, 0, 3, 4, 0,
5, 0, 4, 7, 7, 6, 6, 0, 2, 3, 5, 2, 1, 7, 0, 2, 1, 7, 4,
0, 1, 6, 1, 3, 6, 0, 4, 5, 2, 1, 2, 6, 3, 1, 4, 2, 2, 4,
3, 7, 7, 5, 2, 7, 1, 5, 4, 4, 7, 3, 5, 3, 2, 6, 6, 0, 7,
6, 2, 5, 6, 2, 5, 4, 0, 0, 6, 5, 2, 0, 3, 3, 6, 0, 1, 1,
5, 7, 7, 6, 7, 2, 2, 5, 4, 5, 1, 5, 3, 6, 0, 4, 4, 5, 7,
1, 4, 5, 3, 6, 1, 1, 4, 2, 0, 2, 1, 4, 7, 7, 0, 7, 6, 0,
7, 3, 3, 7, 7, 0, 3, 2, 1, 7, 7, 4, 0, 3, 6, 0, 1, 5, 0,
2, 2, 7, 4, 2, 4, 6, 6, 4, 3, 1, 5, 1, 7, 1, 5, 5, 5, 0,
2, 6, 5, 2, 2, 1, 3, 5, 2, 5, 6, 1, 5, 1, 2, 6, 2, 5, 2,
6, 0, 1, 7, 4, 1, 2, 7, 4, 2, 0, 0, 5, 0, 1, 7, 1, 2, 4,
6, 3, 3, 6, 5, 1, 7, 4, 5, 2, 3, 1, 5, 5, 6, 0, 4, 5, 3,
6, 4, 0, 4, 2, 2, 1, 4, 7, 4, 0, 7, 2, 3, 5, 6, 0, 1, 1,
27
4, 1, 1, 3, 2, 7, 3, 2, 2, 6, 6, 3, 3, 6, 2, 2, 4, 5, 5,
0, 1, 0, 2, 6, 5, 6, 4, 4, 7, 4, 3, 4, 2, 6, 2, 3, 3, 2,
5, 7, 5, 3, 2, 6, 1, 6, 6, 4, 2, 3, 5
• Un message clair est alors scindé en blocs et chaque bloc subit des transformations
3.18. DES
• Développé par IBM
• DES n’est plus considéré comme sûr car clés trop petites (56 bits)
• 1973 : Feistel propose une structure générique pour les chiffrements par blocs
• En résumé :
Li+[Link]+1=ronde_feistel([Link],Ki)
• f est une fonction qui effectue une opération à partir de deux blocs de tailles identiques pour
fournir un bloc de même taille
28
3.21. Déchiffrement de Feistel ?
• Il faut le procédé inverse
[Link]=ronde_feistel(Ri+[Link]+1,Ki+1)
29
3.24. DES - Calcul des clés
• Comme pour Feistel, il faut inverser l’ordre des clés ainsi que les moitiés de message en entrée
de ronde
30
3.28. AES - schéma principal
6 4 2 1
X + X + X + X + 1 = 01010111 = 0x57
31
3.31. En résumé
• Il devrait y avoir des multiplications modulaires dans un corps de Galois
◦ multiplications de nombres compris entre 0 et 255 qui donnent des nombres compris entre
0 et 255
◦ additions de nombres compris entre 0 et 255 qui donnent des nombres compris entre 0 et
255
• En réalité, nous manipulerons une version pédagogique avec des blocs de 4 bits
• ShiftRow : c’est un décallage circulaire vers la gauche appliqué sur la matrice selon la ligne. La
première ligne n’est pas décalée. La seconde, toutes les valeurs sont décalées d’un cran, la
troisième de 2, etc
32
3.33. Dernière étape
• XOR avec la clé de tour - 128 bits = 16*8
• Expansion de clés : 128 bits → 1408 bits (11 clé de 128 bits)
◦ Phase un peu mystique avec une constante de tour pour chaque premier octet de nouvelle
matrice
• 2 rondes
• Addition : xor
4
• Multiplication : multiplication modulo x +x+1
3 2 5 4 4 2
• Exemple : (x + x + 1)* (x + x + 1) = (x + x + 1) mod x +x+1 = x
33
3.38. Mini AES — ShiftRow
34
3.41. Mini-AES — les clés
• 2 rondes, 3 clés
35
3.44. Autres
• Deux blocs identiques seront chiffrés de la même façon → ça sent les statistiques → ça sent un
chiffrement pas parfait du tout
3987 50f9 b6d6 4c06 9f02 29df 7c05 ec10 d983 9322 fb43 389d 6f19 368d d983
b0f0 c878 2c1e 9ea2 bf16 60f8 5422 0d6a ed3c 6328 368d 6d69 c0f7 e9d0 9f39
a0ca 5d02 66d9 c0f7 5329 bb41 b511 ed0c d983 eaf0 356d 098b d0fe c878 ff33
3e5d ac0a c327 66d9 5329 ed30 7c05 9322 bf16 6519 d0c3 c0f7 5329 def3 ec10
d193 ff34 1d0e b976 bc06 9f02 df33 098b d0fe bc06 a1da 3d3d 26de 3d3d 6b49
9f39 374d 56d2 6f39 9e52 d56c 098b c327 66d9 4886 9d09 3e5d 6c15 d193 f0ff
8ec6 6259 8b4c 7d05 3d3d 9b49 d0c3 e9d0 dd63 61b8 d9dc 9199 53b2 3d3d 098b
1323 3c0d 5422 6f39 76eb 46ec be3e b7de
• On a utilisé la table ci-dessous pour encoder les caractères dans une premier temps sur 8 bits
36
• Indice sur le procéssus de chiffrement : Yeah → 59 65 61 68 → 5965 6168 (2 blocs de 16 bits)
• Par contre, il faut revoir l’utilisation qu’on en fait sur des messages plus grands que la taille
prévue
• Besoin de brouiller dans une plus grande généralité les blocs chiffrés produits
• On part du principe ici qu’un message est cassé en blocs d’une taille donnée i.e. 128 bits
◦ [Link]
37
Chapter 4. Modes opératoires
4.1. Previously in Desperate Student’s Life
• Algo standart symétrique permettant de chiffrer des blocs de bits
• Faiblesse car approche naïve donne pour deux blocs clairs identiques, deux blocs chiffrés
également identiques
• Pour le chiffrement par blocs, même idée à un détail près… la clé est de taille fixe
4.4. Padding
• Pour les modes ECB, CBC, CFB il est nécessaire de compléter le message clair
38
◦ séquence de k octets de valeur k (PKCS)
4.6. Application
• Le message suivant a été chiffré avec :
◦ AES-CBC
◦ la clé abe7
1664 f732 737c 3f51 6b65 3d5f 86d4 f471 71df 8391 4970 6f38 0ebe
1adb 14a1 e716 6281 dc59 83c2 907c 3e9a 8abc 5d43 3aae c816 b21e
9959 c86d 5826 5aa7 7494 e51f 3674 d5b9 5a19 3bae 2499 165e 967d
c27d 92ab 18c5 dfcb 23e4 39bd 5334 7e93 0f2d e18a d8de e0fe 702c
8e8b 0a89 e26a fb19 73cc 71cb f14e 9753 ba9e 9e44 d70d 16e0 2e60
cd5e fe74 09d4 f3ef 1a18 a9f4 1f12 1831 fc3f 59da 9df2 00f6 3f12
948a 8c0e
4.7. Indices
Voici les tables AES précalculées pour la clé abe7
39
4.8. Indices
4.9. Indices
40
4.10. Vecteur d’initialisation
• Pour éviter deux premiers blocs identiques soient chiffrés exactement de la même façon, on
ajoute un vecteur d’initialisation
41
4.13. CTR (Counter)
4.15. Application
• On sait que le message ci-dessous a été chiffré en CTR avec la clé b33f
42
• Toutes les données liées à AES sont données dans le slide suivant
feed b413 5148 725a a122 976b 272e 1163 b778 c168 526d db65 706b 472d
b269 3e26 f268 8062 5b7c 706e b246 cb44 3e1e 0250 eb49 ce4f 1a52 cf14
7259 5f54 e955 2845 ea57 8f13 5f5d 2b5b bb61 8161 2b7c 4e78 a17f dd2d
126e cd24 7362 5d72 ff67 3b75 ae6d 8b23 7d45 2f2e
Yohan:fac3eb8d0497bcc3158c0c8fc18ffdc809ce5280c889bdc98b9a6192b79a5a853493979f089f
aa96778819d7c195f2d846de67878284b68b928d2792f8ab7ecd6da7
Mathieu:fac3f79901c2a582319e5897c79ffa9c49806cc58188f887d8962880b78b56836792d2dc14
82b59a39895794c28ef39d079f799b8291
Yohan:fac3fd8a0e87ab97319b1d8acd84fcc40883798c9bc4bc9cd88c6794e7db5dd0269f979a069b
b3d32791129ec9dae39d078e72818e80a4d9939a6198eea5
Yohan:fac3fb891d9ae8922d845894888be59d5b8b6a8a8690f890d89b7a8ee28d52822898c3dc129c
a2d324920583c2dae39d078c72968899a79c998c62df
Mael:fac3ed820dc2ba863b821597cd84fb8d08cf
Yohan:fac3f79901c2a9c3348c5896dd8ffb9c418176c5dfc4bc8cd8832884ef9417922898c28f479b
abd3319c02838788e2884890738782d49b9c8196
Yohan:fac3fd98488ba4c321cd19c7d886ed8146ce7c80c896bd9997817b84e4db5491249ed29914dc
• Auto-synchronisation
• Accès randomisé
43
4.19. Quel algorithme choisir ?
• Pour garantir la confidentialité
key = get_random_bytes(32)
iv = get_random_bytes(16)
# Message à chiffrer
message = b"Hello, World!"
# Création d'un objet AES en mode CBC avec la clé et le vecteur d'initialisation
cipher = [Link](key, AES.MODE_CBC, iv)
# Chiffrement du message avec padding
ciphertext = [Link](pad(message, AES.block_size))
[Link](recoveredPlaintext);
}
44
private static byte [] encrypt(SecretKey key, String ivStr,String plaintext)
throws Exception {
Cipher cipher = [Link]("AES/CBC/PKCS7Padding");
byte[] iv = [Link]("US-ASCII");
[Link](Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
return [Link]([Link]());
}
• D’ailleurs, sauriez vous déchiffrer les octets ci-dessous ? (indice : le résultat sera un fichier et on
fonctionne en CBC)
dc3678ac3ba8384c0a04245aac6cfae6b5a860d90f7d2ab11849daec34573cb2682b8bcb5240a791790
03e4227347102
1b5c3016c3b5a314337211b348d799cb19c1e28ef8d3c196534cad97c09c925fa5199e946f10782f31a
40b7c3de5506c
7e16207b68fb37fb4930e991f07f9f0aed593564c36c25fbf9a703ccf54d4e07fbc323e9c66d3b3fdb0
be3d0e03f1085
bb375db22671f671299f789bf3dc9200bee14cac41b959528f7272a745f7a4ed8f3ceae300e13c94907
99c4ef48f16b7
ae49ca1b67a11c6afd339b53f4859ab432dfc37129fb4e33abc6a4c7d6bf42fd853770a2bc99b519253
3f08762c4ccad
a4b4bbc37e8d42cf0be8b7de3862cdfc26e6505b681d2ced1549f5f8315cbf99ce6010fc7f9e0e1e52b
e3a91abe92d61
2f53d99d6903887028619eabd6f203e2fc1fe050210a868c12675715bcea3861742578ee1f005f6276f
45
0bb26ed7de9f6
5e1b433a507032374004a2564122bf231367c7c5f1b89e8a9b346b2dde2fdc6a53a74fa8f267c71bc55
d8c0941f2809a
cbf70d36c983a877695072d86b0bbd809c2445d0a0e3aeed88a34df7a03e11125ee03b42a84621f00b6
47ce826b819a3
◦ Confidentialité
◦ Intégrité
◦ Authenticité
◦ Non répudiation
46
Chapter 5. Intégrité des messages
5.1. Previously in Desperate Student’s Life
• Algo standart symétrique permettant de chiffrer des blocs de bits
◦ Si tel est le cas, comment être sûr que le message n’a pas été modifié entre temps
5.2. MAC
Message Authentication Code
5.3. CBC-MAC
• Utiliser le dernier bloc d’un chiffrement comme MAC (avec une autre clé )
47
• Possibilité de forger des messages valides pour des messages de taille variable → CBC-MAC non
sûr pour les messages de taille variable
• Munie d’une clé secrète K de 256 bits, elle chiffre un message M comme suit :
FBI ou non ?
5.6. Hachage
* t
• H: {0,1} → {0,1}
• Fonction qui associe une empreinte de taille fixe à une entrée de taille arbitraire
• Tables de hashage
• Propriété attendue : les valeurs prises par H doivent être uniformément réparties ; faible
48
probabilité de collision H(m)=H(m')
• Il propose de prendre IV=0 et comme fonction de compression le chaînage d’AES-256 avec la clé
0.
• Montrer que cette fonction n’est pas du tout résistante aux collisions !
49
• Conçu pour être rapide sur architecture 32 bits
• Padding : on ajoute un bit à 1 puis des 0 pour obtenir une taille congrue à 448 mod 512 et enfin
on ajoute la longueur initiale du message codée sur 64 bits.
md5sum *.png
c23bdb95d34d1d56c8a5e6845182b8b1 [Link]
d7df07f1874f3631632feeedd3cb869a [Link]
5.12. Mais…
Modifions quelque peu les images avec [Link]
[Link]
md5sum collision*.png
4905e947e3b9542011ab2c1e8721a78f [Link]
4905e947e3b9542011ab2c1e8721a78f [Link]
50
• Le z dans le cas des PNG : concaténation des deux images mais l’interprétation globale donnera
soit l’une, soit l’autre
◦ [Link]
◦ [Link]
51
5.16. SHA-1 MD5
• Même combat
• Toutes les attaques possibles en pratique sur MD5 le sont également sur SHA-1
• SHA-3 ?
• HMAC-MD5
• HMAC-SHA-1
• HMAC-SHA256
52
5.20. Pause exercice
Un étudiant un peu fatigué de toutes ces notations résume le HMAC à la chose suivante : Oui ben il
suffit de prendre la clé K et de concaténer le texte à authentifier et utiliser une fonction de hachage
quelconque. En gros, MD5(K.M).
53
Chapter 6. Canal sûr
6.1. Protocole cryptographique
Un protocole cryptographique est contruit à partir de briques, les primitives cryptographiques,
dans le but d’assurer un certain nombre de propriétés, typiquement
• confidentialité
• intégrité
• authenticité
• non répudiabilité
6.2. Confidentialité
• Assurer que seuls les deux parties ont accès aux données échangées
6.3. Intégrité
• Assurer la correction et la consistance des données transmises
6.4. Authenticité
• Permettre aux deux parties en présence de valider l’identité de l’autre partie
54
6.6. Conception d’un protocole sécurisé
Alice et Bob ont échangé des clés secrètes de 256 bits et élu les algorithmes AES-CTR-256 et HMAC-
SHA-256. Ils souhaitent établir un canal sécurisé entre eux. Eve écoute les échanges sécurisés.
55
6.10. Petit résumé
• Chaque mode de chiffrement/authentification propose des garanties
• SSL fondé sur du MtE reste safe si ce dernier utilise du chiffrement par flots ou du CBC
• Quelques documents :
• Proposer des modes opératoires qui apportent le chiffrement et le contrôle d’intégrité tout en
assurant la sécurité
56
6.14. Fonctionnalités
• Authentification : vérifier l’identité des deux extrémités du VPN par authentification mutuelle
6.15. IPsec
• RFC 4301
• Un mécanisme type pare-feu pour décider des paquets qui passent par le tunnel et doivent être
encapsulés par AH ou ESP
6.17. AH et ESP
• Encapsulation de chaque paquet IP qui transite par le VPN, nouvelle entête IP + entête AH/ESP
◦ SN : Sequence Number
57
6.19. Security Policy Database
• Détermine la politique d’encapsulation IPsec du flux réseau
58
• Security Association = protocoles + clés + …
59
Chapter 7. Comment partager un secret ?
7.1. Au-delà du chiffrement symétrique
• Etablir un canal sûr nécessite le partage d’un secret entre les deux parties (a priori)
• Comment fait on dans un environnement ouvert où les deux interlocuteurs ne se sont jamais
rencontrés ?
• Quelques notations
60
7.5. Protocole de Needham-Schroeder
7.6. En pratique
• Ce type d’algorithme permet de mettre en oeuvre des systèmes à authentification unique
61
Chapter 8. Cryptographie clé publique
8.1. Cryptographie à clé publique
• Idée : briser la symétrie !
• Dans la vie, il existe de nombreux phénomènes pour lesquels l’opération inverse est plus
difficile que l’opération initiale
◦ Si quelqu’un veut vous parler il achète votre cadenas que vous vendez à qui en veut.
◦ S’il veut vous parler, il reste à mettre un message dans une boîte qu’il scellera avec ce
cadenas (dont vous seul possédez la clé).
◦ si retrouver x à partir de f(x) est calculatoirement impossible sans connaître la trappe (une
information secrète k)
62
8.5. Quelques outils mathématiques : Euclide étendu
• Calcul de l’inverse de 9 en base 50 ?
63
8.8. Diffie Hellman
• Ou comment créer un canal sécurisé avec rien ou presque !
8.10. Protocole DH
• Données du protocole :
◦ n premier
◦ g non nul
64
8.12. Exercice de réflexion
• Essayez d’imaginer le scénario de l’attaque de l’homme au milieu sur la version la plus épurée
de DH
• Le premier schéma est RSA, publié en 1978 par Rivest, Shamir et Adleman, en cherchant à
montrer qu’il n’en existait pas
• Etant donné qu’on est sur DH, autant sauter un peu plus loin dans le temps… 1985
8.14. ElGamal
• Données du schéma : n premier et g non nul pouvant être publiquement connus
s
• Alice choisit une clé secrète s et calcule sa clé publique y=g (mod n)
k
• Pour chiffrer un message 1<m<n, Bob choisit aléatoirement k et transmet la paire : (c,d)=(g
k
mod n, m y (mod n))
s -1 sk -1 k
• Alice déchiffre le message en calculant : (c ) d=(g ) my =m (mod n)
8.15. Exercice
• Soient n=467, g=2, s=153, m=331, k=197
8.16. En pratique
• La cryptographie à clé publique est en générale plus lente à chiffrer que la cryptographie
symétrique
65
Chapter 9. RSA
9.1. RSA
• Mis au point en 1977 au MIT par Ron Rivest, Adi Shamir et Leonard Adleman
• Crypto-système asymétrique
9.2. RSA
1. Alice choisit deux grands nombres premiers p et q
e de
9.4. Pourquoi c mod n = m mod n = m ?
ed 1+k(p-1)(q-1)
1. m mod n = m mod n
ed k(p-1)(q-1)
2. m mod n = m* m mod n
ed (p-1)(q-1) k
3. m mod n = m* (m mod n) mod n
ed k
4. m mod n = m* (1) mod n d’après Euler
ed
5. m mod n = m
66
• Déchiffrez le message 8
• On pourra s’aider des carrés successifs modulo 77 : 8, 64, 15, 71, 34, 64,…
9.7. RSA-OAEP
• Optimal asymmetric encryption padding
• Padding aléatoire
67
Chapter 10. Signatures
10.1. Schéma de signature numérique
• Repose sur la cryptograhie à clé publique
• La signature dépend
◦ du contenu du message
◦ de l’identité du signataire
• Par contre, les codes MAC sont généralement plus courts et calculables plus rapidement
10.4. Formellement
68
10.6. Schéma RSA dit Textbook
n
• Gen : sur l’entrée 1 , générer deux nombres premiers de n bits p et q et deux paramètres d et e
pour obtenir les clés (pq,e) et (pq,d)
d
• Sign : étant donnés (N,d) et m calcule s=m (mod N)
s
• Vrfy : étant donnés (N,e) et m calcule m=^? e^ (mod N)
69
Chapter 11. Protocoles : résumé et failles
logiques
11.1. Rappels
• Protocole : ensemble de règles régissant le comportement d’individus pour répondre au besoin
d’une application
• Notations
◦ mac(K,M) : calcul d’un MAC à partir d’une donnée M et d’un secret partagé K
70
11.5. Votre expertise ?
1. A → S : crypt(pkS,A.B)
2. S → A : crypt(pkA,[Link](prvS,pkB))
• Peut-on garantir ici que la clé récupérée PkB sera bien la clé de B sachant que S est une entité
sûre ?
1. A → B : crypt(pkB,[Link])
2. B → A : crypt(pkA,[Link])
3. A → B : crypt(pkB,NB)
71