assignement done, forgot push
This commit is contained in:
parent
728e513a1a
commit
ac5fce8591
2 changed files with 62 additions and 16 deletions
BIN
main.pdf
Normal file
BIN
main.pdf
Normal file
Binary file not shown.
78
main.typ
78
main.typ
|
@ -31,7 +31,7 @@
|
||||||
)
|
)
|
||||||
= Notes
|
= Notes
|
||||||
Le code présenté est retrouvable sur #link("ssh://sherbrooke@bigblase.xyz:/srv/git/crypto2")\
|
Le code présenté est retrouvable sur #link("ssh://sherbrooke@bigblase.xyz:/srv/git/crypto2")\
|
||||||
mot de passe: `FDS8EbKiDNoJh2QN`\
|
mot de passe : `FDS8EbKiDNoJh2QN`\
|
||||||
Le code a été testé sous linux, kernel 6.5 et librairie à jour (sept 2023), en
|
Le code a été testé sous linux, kernel 6.5 et librairie à jour (sept 2023), en
|
||||||
utilisant gcc 13.2.1.
|
utilisant gcc 13.2.1.
|
||||||
Pour compiler, il faut d'abord créer le dossier _build_ à la racine du projet.
|
Pour compiler, il faut d'abord créer le dossier _build_ à la racine du projet.
|
||||||
|
@ -40,15 +40,15 @@ Il _devrait_ être portable (C99, POSIX compliant)
|
||||||
#set heading(numbering: "I) a) i)")
|
#set heading(numbering: "I) a) i)")
|
||||||
|
|
||||||
= Mac insécure
|
= Mac insécure
|
||||||
Pour tester le code, il faut exdecuter ```sh make run test=<TEST> eve=<ARGS_EVE>```
|
Pour tester le code, il faut exécuter ```sh make run test=<TEST> eve=<ARGS_EVE>```
|
||||||
en prennant pour `test`: `ZERO`, `MID`, `MAX`, ou `NAME` (ce qui correspond à un
|
en prenant pour `test`: `ZERO`, `MID`, `MAX`, ou `NAME` (ce qui correspond à un
|
||||||
message de `0x00000000`, `0x0000ffff`, `0xffffffff`, et `0x626f62` (qui est
|
message de `0x00000000`, `0x0000ffff`, `0xffffffff`, et `0x626f62` (qui est
|
||||||
"bob\0" en ASCII) respectivement). Les arguments de `eve` sont les m^emes,
|
"bob\0" en ASCII) respectivement). Les arguments de `eve` sont les mêmes,
|
||||||
et modifient le message et le tag de manière à ce que bob vérifie le mac tag
|
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
|
le message correctement. Si aucun argument d'Eve n'est spécifié, Eve ne fait
|
||||||
rien.
|
rien.
|
||||||
|
|
||||||
== Eve ne fait rien : traces d'éxécutions
|
== Eve ne fait rien : traces d'exécutions
|
||||||
===
|
===
|
||||||
```test=ZERO:
|
```test=ZERO:
|
||||||
--- MSG ---
|
--- MSG ---
|
||||||
|
@ -143,8 +143,8 @@ Ici, le tag est $t$, la clef key est $k$, le message est $m$,
|
||||||
et _verifies_ est $v$.
|
et _verifies_ est $v$.
|
||||||
|
|
||||||
== Eve modifie le message et le tag
|
== Eve modifie le message et le tag
|
||||||
En faisant tourner n'importe quel test avec un paramètre d'eve, on voit
|
En faisant tourner n'importe quel test avec un paramètre d'Eve, on voit
|
||||||
que le MAC est toujours vérifié pour bob:
|
que le MAC est toujours vérifié pour Bob:
|
||||||
===
|
===
|
||||||
```test=MAX eve=ZERO
|
```test=MAX eve=ZERO
|
||||||
--- MSG ---
|
--- MSG ---
|
||||||
|
@ -208,29 +208,29 @@ Ainsi, Eve peut intercepter et envoyer un tag qui semble correct à Bob, peu
|
||||||
importe le message reçu. On peut faire cela car :
|
importe le message reçu. On peut faire cela car :
|
||||||
$t = m xor k$, et Eve connait $t, m$.
|
$t = m xor k$, et Eve connait $t, m$.
|
||||||
Ainsi, le tag $t'$ est correct aux yeux de Bob, où
|
Ainsi, le tag $t'$ est correct aux yeux de Bob, où
|
||||||
$t' = m xor m xor k = m xor mac$.
|
$t' = m xor m xor k = m xor "mac"$.
|
||||||
Donc, en introduisant le message $m_e$ de Eve, on a:
|
Donc, en introduisant le message $m_e$ de Eve, on a:
|
||||||
$t_e &= m_e xor t xor m \
|
$t_e &= m_e xor t xor m \
|
||||||
&= m_e xor m xor k xor m \
|
&= m_e xor m xor k xor m \
|
||||||
&= m_e xor k$
|
&= m_e xor k$
|
||||||
|
|
||||||
Quand Bob vérifira le message, il verra donc un message correctement taggé.
|
Quand Bob vérifiera le message, il verra alors un message correctement taggé.
|
||||||
|
|
||||||
Eve peut donc envoyer n'importe quel message traffiqué et vérifiable avec
|
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
|
une probabilité de 1, du moment que le message et le tag qu'elle reçoit
|
||||||
sont vérifiables.
|
sont vérifiables.
|
||||||
|
|
||||||
== Pseudo-aléatoire
|
== Pseudo-aléatoire
|
||||||
Soit $F: {0,1}^n cross {0,1}^n -> {0,1}^n$ telle que $F(k, x) = x xor k$.
|
Soit $F: {0,1}^n times {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$.
|
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
|
Cette fonction est pseudo aléatoire, car la fonction $F_k$ forme une
|
||||||
bijection sur ${0,1}^n$:
|
bijection sur ${0,1}^n$:
|
||||||
|
|
||||||
* surjectice:
|
* Surjective:
|
||||||
$forall x in {0,1}^n, exists y in {0,1}^n | x xor k = y$
|
$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
|
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$
|
car $xor$ est définit sur ${0,1}^n times {0,1}^n$ et à valeurs dans ${0,1}^n$
|
||||||
* injective:
|
* injective :
|
||||||
$forall x, y in {0,1}^n, & F_k(x) &= F_k(y) => x = y$
|
$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 :
|
Supposons qu'on a ces $x,y$. On a alors :
|
||||||
$x xor k &= y xor k\
|
$x xor k &= y xor k\
|
||||||
|
@ -238,5 +238,51 @@ bijection sur ${0,1}^n$:
|
||||||
<=> x &= y $ On a donc ce que l'on voulait.
|
<=> 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$.
|
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
|
Elle est donc pseudo aléatoire, car elle donne une sortie autant répartie que
|
||||||
son entrée.
|
son entrée.
|
||||||
|
|
||||||
|
= RSA
|
||||||
|
Soit la sortie $(143, 11, 13)$ d’un algorithme *GenModulus*($1111$) pour RSA.
|
||||||
|
|
||||||
|
== $N, P,$ et $q$
|
||||||
|
Ici, $N = 143, p = 11, q = 13$. On remarque que $N = p dot q$
|
||||||
|
|
||||||
|
== $Phi(N)$
|
||||||
|
Ici, $Phi(N) = |bb(Z)^*_N| = |bb(Z)/(N bb(Z))| = Phi(p q) = (p-1)(q-1) = 120$
|
||||||
|
|
||||||
|
La quatrième égalité est valable, car $p$ et $q$ sont premiers.
|
||||||
|
|
||||||
|
== Exposant inverse
|
||||||
|
On pose $e = 7$. On cherche $d = e^-1$ dans $Z^*_N$.
|
||||||
|
$
|
||||||
|
d = 1 ; d dot e eq.triple 7 [120] \
|
||||||
|
d = 2 ; d dot e eq.triple 14 [120] \
|
||||||
|
d = 3 ; d dot e eq.triple 21 [120] \
|
||||||
|
... \
|
||||||
|
d = 99 ; d dot e .eq.triple 93 [120] \
|
||||||
|
d = 100 ; d dot e .eq.triple 100 [120] \
|
||||||
|
d = 101 ; d dot e .eq.triple 107 [120] \
|
||||||
|
d = 102 ; d dot e .eq.triple 114 [120] \
|
||||||
|
d = 103 ; d dot e .eq.triple 1 [120] \
|
||||||
|
$
|
||||||
|
|
||||||
|
On voit que $d = 103 eq.triple e^(-1) [N]$ convient.
|
||||||
|
|
||||||
|
== RSA
|
||||||
|
La clef public est donc le couple $k_(italic("pub") = (7, 143) = (e, N)$,
|
||||||
|
et la clef privée est le couple $k_(italic("priv") = (103, 143) = (d, N)$
|
||||||
|
Pour chiffrer un message $m$, on peut faire $c = m^e % N$, et pour le
|
||||||
|
déchiffrer, $m = c^d % N$.
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
`
|
||||||
|
n = 143
|
||||||
|
e = 7
|
||||||
|
d = 103
|
||||||
|
Public key: (7, 143)
|
||||||
|
Private key: (103, 143)
|
||||||
|
Original message: 42
|
||||||
|
Encrypted message: 81
|
||||||
|
Decrypted message: 42
|
||||||
|
`
|
||||||
|
|
Loading…
Reference in a new issue