assignement done, forgot push

This commit is contained in:
BigBlase 2023-10-24 22:43:00 -04:00
parent 728e513a1a
commit ac5fce8591
2 changed files with 62 additions and 16 deletions

BIN
main.pdf Normal file

Binary file not shown.

View file

@ -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)$ dun 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
`