assignement: first part done, plz spellcheck
This commit is contained in:
parent
01353032b4
commit
728e513a1a
1 changed files with 242 additions and 0 deletions
242
main.typ
Normal file
242
main.typ
Normal file
|
@ -0,0 +1,242 @@
|
||||||
|
#import "@preview/algo:0.3.2": algo, i, d, comment, code
|
||||||
|
|
||||||
|
#set page(
|
||||||
|
numbering: "1 / 1",
|
||||||
|
header: [
|
||||||
|
#set text(8pt)
|
||||||
|
_IFT436, Devoir 1 #h(1fr) Paulin Violette, 2023_
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
#let title(content) = {
|
||||||
|
pagebreak(weak:true)
|
||||||
|
set text(size:15pt)
|
||||||
|
set align(center)
|
||||||
|
v(10pt)
|
||||||
|
[#content]
|
||||||
|
v(10pt)
|
||||||
|
}
|
||||||
|
|
||||||
|
#title[= Devoir 1]
|
||||||
|
|
||||||
|
#line(length: 100%)
|
||||||
|
|
||||||
|
#v(70pt)
|
||||||
|
|
||||||
|
#line(length: 100%)
|
||||||
|
|
||||||
|
#set par(
|
||||||
|
first-line-indent: 1em,
|
||||||
|
justify: true,
|
||||||
|
)
|
||||||
|
= Notes
|
||||||
|
Le code présenté est retrouvable sur #link("ssh://sherbrooke@bigblase.xyz:/srv/git/crypto2")\
|
||||||
|
mot de passe: `FDS8EbKiDNoJh2QN`\
|
||||||
|
Le code a été testé sous linux, kernel 6.5 et librairie à jour (sept 2023), en
|
||||||
|
utilisant gcc 13.2.1.
|
||||||
|
Pour compiler, il faut d'abord créer le dossier _build_ à la racine du projet.
|
||||||
|
Pour tester, il faut faire ```sh make run test=<TEST> eve=<ARGS_EVE>```.
|
||||||
|
Il _devrait_ être portable (C99, POSIX compliant)
|
||||||
|
#set heading(numbering: "I) a) i)")
|
||||||
|
|
||||||
|
= Mac insécure
|
||||||
|
Pour tester le code, il faut exdecuter ```sh make run test=<TEST> eve=<ARGS_EVE>```
|
||||||
|
en prennant pour `test`: `ZERO`, `MID`, `MAX`, ou `NAME` (ce qui correspond à un
|
||||||
|
message de `0x00000000`, `0x0000ffff`, `0xffffffff`, et `0x626f62` (qui est
|
||||||
|
"bob\0" en ASCII) respectivement). Les arguments de `eve` sont les m^emes,
|
||||||
|
et modifient le message et le tag de manière à ce que bob vérifie le mac tag
|
||||||
|
le message correctement. Si aucun argument de eve n'est spécifié, eve ne fait
|
||||||
|
rien.
|
||||||
|
|
||||||
|
== Eve ne fait rien : traces d'éxécutions
|
||||||
|
===
|
||||||
|
```test=ZERO:
|
||||||
|
--- MSG ---
|
||||||
|
as 0x: 0
|
||||||
|
as char *:
|
||||||
|
as uint32: 0
|
||||||
|
--- TAG ---
|
||||||
|
-2018659035
|
||||||
|
--- VERIF ---
|
||||||
|
1
|
||||||
|
|
||||||
|
--- ALICE ---
|
||||||
|
sends msg: 0
|
||||||
|
sends tag: 2276308261
|
||||||
|
knows key: 2276308261
|
||||||
|
|
||||||
|
--- EVE ---
|
||||||
|
recieves msg: 0
|
||||||
|
recieves tag: 2276308261
|
||||||
|
sends msg: 0
|
||||||
|
sends tag: 2276308261
|
||||||
|
|
||||||
|
--- BOB ---
|
||||||
|
recieves msg: 0
|
||||||
|
recieves tag: 2276308261
|
||||||
|
knows key: 2276308261
|
||||||
|
verifies: TRUE
|
||||||
|
msg as char *:
|
||||||
|
```
|
||||||
|
===
|
||||||
|
```test=MID:
|
||||||
|
--- MSG ---
|
||||||
|
as 0x: ffff
|
||||||
|
as char *: <20><>
|
||||||
|
as uint32: 65535
|
||||||
|
--- TAG ---
|
||||||
|
1569545002
|
||||||
|
--- VERIF ---
|
||||||
|
1
|
||||||
|
|
||||||
|
--- ALICE ---
|
||||||
|
sends msg: 65535
|
||||||
|
sends tag: 1569545002
|
||||||
|
knows key: 1569563861
|
||||||
|
|
||||||
|
--- EVE ---
|
||||||
|
recieves msg: 65535
|
||||||
|
recieves tag: 1569545002
|
||||||
|
sends msg: 65535
|
||||||
|
sends tag: 1569545002
|
||||||
|
|
||||||
|
--- BOB ---
|
||||||
|
recieves msg: 65535
|
||||||
|
recieves tag: 1569545002
|
||||||
|
knows key: 1569563861
|
||||||
|
verifies: TRUE
|
||||||
|
msg as char *: <20><>
|
||||||
|
```
|
||||||
|
|
||||||
|
===
|
||||||
|
```test=MAX:
|
||||||
|
--- MSG ---
|
||||||
|
as 0x: ffffffff
|
||||||
|
as char *: <20><><EFBFBD><EFBFBD>
|
||||||
|
as uint32: 4294967295
|
||||||
|
--- TAG ---
|
||||||
|
-1254613608
|
||||||
|
--- VERIF ---
|
||||||
|
1
|
||||||
|
|
||||||
|
--- ALICE ---
|
||||||
|
sends msg: 4294967295
|
||||||
|
sends tag: 3040353688
|
||||||
|
knows key: 1254613607
|
||||||
|
|
||||||
|
--- EVE ---
|
||||||
|
recieves msg: 4294967295
|
||||||
|
recieves tag: 3040353688
|
||||||
|
sends msg: 4294967295
|
||||||
|
sends tag: 3040353688
|
||||||
|
|
||||||
|
--- BOB ---
|
||||||
|
recieves msg: 4294967295
|
||||||
|
recieves tag: 3040353688
|
||||||
|
knows key: 1254613607
|
||||||
|
verifies: TRUE
|
||||||
|
msg as char *: <20><><EFBFBD><EFBFBD>
|
||||||
|
```
|
||||||
|
|
||||||
|
On voit donc que Bob peut vérifier le message, mais pas Eve.
|
||||||
|
Ici, le tag est $t$, la clef key est $k$, le message est $m$,
|
||||||
|
et _verifies_ est $v$.
|
||||||
|
|
||||||
|
== Eve modifie le message et le tag
|
||||||
|
En faisant tourner n'importe quel test avec un paramètre d'eve, on voit
|
||||||
|
que le MAC est toujours vérifié pour bob:
|
||||||
|
===
|
||||||
|
```test=MAX eve=ZERO
|
||||||
|
--- MSG ---
|
||||||
|
as 0x: ffffffff
|
||||||
|
as char *: <20><><EFBFBD><EFBFBD>
|
||||||
|
as uint32: 4294967295
|
||||||
|
--- TAG ---
|
||||||
|
1782958865
|
||||||
|
--- VERIF ---
|
||||||
|
1
|
||||||
|
|
||||||
|
--- ALICE ---
|
||||||
|
sends msg: 4294967295
|
||||||
|
sends tag: 1782958865
|
||||||
|
knows key: 2512008430
|
||||||
|
|
||||||
|
--- EVE ---
|
||||||
|
recieves msg: 4294967295
|
||||||
|
recieves tag: 1782958865
|
||||||
|
sends msg: 0
|
||||||
|
sends tag: 2512008430
|
||||||
|
|
||||||
|
--- BOB ---
|
||||||
|
recieves msg: 0
|
||||||
|
recieves tag: 2512008430
|
||||||
|
knows key: 2512008430
|
||||||
|
verifies: TRUE
|
||||||
|
msg as char *:
|
||||||
|
```
|
||||||
|
===
|
||||||
|
|
||||||
|
```test=ZERO eve=NAME
|
||||||
|
--- MSG ---
|
||||||
|
as 0x: 0
|
||||||
|
as char *:
|
||||||
|
as uint32: 0
|
||||||
|
--- TAG ---
|
||||||
|
-2111190321
|
||||||
|
--- VERIF ---
|
||||||
|
1
|
||||||
|
|
||||||
|
--- ALICE ---
|
||||||
|
sends msg: 0
|
||||||
|
sends tag: 2183776975
|
||||||
|
knows key: 2183776975
|
||||||
|
|
||||||
|
--- EVE ---
|
||||||
|
recieves msg: 0
|
||||||
|
recieves tag: 2183776975
|
||||||
|
sends msg: 6649445
|
||||||
|
sends tag: 2186067114
|
||||||
|
|
||||||
|
--- BOB ---
|
||||||
|
recieves msg: 6649445
|
||||||
|
recieves tag: 2186067114
|
||||||
|
knows key: 2183776975
|
||||||
|
verifies: TRUE
|
||||||
|
msg as char *: eve
|
||||||
|
```
|
||||||
|
Ainsi, Eve peut intercepter et envoyer un tag qui semble correct à Bob, peu
|
||||||
|
importe le message reçu. On peut faire cela car :
|
||||||
|
$t = m xor k$, et Eve connait $t, m$.
|
||||||
|
Ainsi, le tag $t'$ est correct aux yeux de Bob, où
|
||||||
|
$t' = m xor m xor k = m xor mac$.
|
||||||
|
Donc, en introduisant le message $m_e$ de Eve, on a:
|
||||||
|
$t_e &= m_e xor t xor m \
|
||||||
|
&= m_e xor m xor k xor m \
|
||||||
|
&= m_e xor k$
|
||||||
|
|
||||||
|
Quand Bob vérifira le message, il verra donc un message correctement taggé.
|
||||||
|
|
||||||
|
Eve peut donc envoyer n'importe quel message traffiqué et vérifiable avec
|
||||||
|
une probabilité de 1, du moment que le message et le tag qu'elle reçoit
|
||||||
|
sont vérifiables.
|
||||||
|
|
||||||
|
== Pseudo-aléatoire
|
||||||
|
Soit $F: {0,1}^n cross {0,1}^n -> {0,1}^n$ telle que $F(k, x) = x xor k$.
|
||||||
|
En fixant $k in {0,1}^n$, on peut écrire $F(k, .): {0,1}^n -> {0,1}^n$.
|
||||||
|
Cette fonction est pseudo aliéatoire, car la fonction $F_k$ forme une
|
||||||
|
bijection sur ${0,1}^n$:
|
||||||
|
|
||||||
|
* surjectice:
|
||||||
|
$forall x in {0,1}^n, exists y in {0,1}^n | x xor k = y$
|
||||||
|
C'est évident : il suffit de prendre $y = x xor k$, qui existe
|
||||||
|
car $xor$ est définit sur ${0,1}^n cross {0,1}^n$ et à valeurs dans ${0,1}^n$
|
||||||
|
* injective:
|
||||||
|
$forall x, y in {0,1}^n, & F_k(x) &= F_k(y) => x = y$
|
||||||
|
Supposons qu'on a ces $x,y$. On a alors :
|
||||||
|
$x xor k &= y xor k\
|
||||||
|
<=> x xor k xor k &= y xor k xor k\
|
||||||
|
<=> x &= y $ On a donc ce que l'on voulait.
|
||||||
|
|
||||||
|
Ainsi, la sortie de $F_k$ est uniformément répartie sur ${0,1}^n$.
|
||||||
|
Elle est donc pseudo aléatoire car elle donne une sortie autant répartie que
|
||||||
|
son entrée.
|
Loading…
Reference in a new issue